HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#статьи</a></p>
1 <p><a>#статьи</a></p>
2 <ul><li>13 апр 2023</li>
2 <ul><li>13 апр 2023</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><h2>Что значит "вариативный"? Объясняем простыми словами</h2>
4 </ul><h2>Что значит "вариативный"? Объясняем простыми словами</h2>
5 <p>Заходят как-то в бар дизайнер и айтишник, а джун их спрашивает: "И как это понимать?"</p>
5 <p>Заходят как-то в бар дизайнер и айтишник, а джун их спрашивает: "И как это понимать?"</p>
6 <p>Иллюстрация: Оля Ежак для Skillbox Media</p>
6 <p>Иллюстрация: Оля Ежак для Skillbox Media</p>
7 <p>Пишем про дизайн и искусство. Всё, что вы хотели знать о настоящем, прошлом и будущем визуальной культуры.</p>
7 <p>Пишем про дизайн и искусство. Всё, что вы хотели знать о настоящем, прошлом и будущем визуальной культуры.</p>
8 <p>Термин "вариативный" встречается и в дизайне, и в айти. Он означает одно и то же? Или в каждой области подразумевается своё значение?</p>
8 <p>Термин "вариативный" встречается и в дизайне, и в айти. Он означает одно и то же? Или в каждой области подразумевается своё значение?</p>
9 <p>Простыми словами объясняют, что такое "вариативный", эксперт в шрифтовом дизайне<a>Родион Илюхин</a>и эксперт в разработке<a>Зуфар Сунагатов</a>.</p>
9 <p>Простыми словами объясняют, что такое "вариативный", эксперт в шрифтовом дизайне<a>Родион Илюхин</a>и эксперт в разработке<a>Зуфар Сунагатов</a>.</p>
10 <p>Дизайнер интерфейсов днём, шрифтовой дизайнер вечером и по выходным. Убеждён, что шрифт - ДНК проекта.</p>
10 <p>Дизайнер интерфейсов днём, шрифтовой дизайнер вечером и по выходным. Убеждён, что шрифт - ДНК проекта.</p>
11 <p>Вариативность - это способность объекта к изменениям. В дизайне вариативность встречается не только в шрифтах, но и в айдентике, но айдентику чаще называют динамической.</p>
11 <p>Вариативность - это способность объекта к изменениям. В дизайне вариативность встречается не только в шрифтах, но и в айдентике, но айдентику чаще называют динамической.</p>
12 Динамический логотипДинамическая айдентика для финансовой платформы от Pentagram<a><em>Источник</em></a><p>Вариативный шрифт - это шрифтовой файл, содержащий несколько начертаний. Перед набором статичных шрифтов у вариативного есть несколько преимуществ:</p>
12 Динамический логотипДинамическая айдентика для финансовой платформы от Pentagram<a><em>Источник</em></a><p>Вариативный шрифт - это шрифтовой файл, содержащий несколько начертаний. Перед набором статичных шрифтов у вариативного есть несколько преимуществ:</p>
13 <ul><li>он позволяет пользователю получить любой промежуточный результат между этими начертаниями;</li>
13 <ul><li>он позволяет пользователю получить любой промежуточный результат между этими начертаниями;</li>
14 <li>весит намного меньше, чем шрифтовое семейство из нескольких статичных начертаний;</li>
14 <li>весит намного меньше, чем шрифтовое семейство из нескольких статичных начертаний;</li>
15 <li>позволяет интерактив в вебе. Внешний вид текста можно привязать к чему угодно - ховеру, скорости ветра за окном, уровню таяния льдов в Арктике.</li>
15 <li>позволяет интерактив в вебе. Внешний вид текста можно привязать к чему угодно - ховеру, скорости ветра за окном, уровню таяния льдов в Арктике.</li>
16 </ul>Совместный проект студии Dinamo и агентства Collins для Симфонического оркестра Сан-Франциско. Онлайн-редактор позволяет составить типографическую композицию по пресету или на основе звуков из микрофона в реальном времени<em>Изображение:<a>Collins</a></em><p>Для того, чтобы шрифт стал вариативным, необходимы два разных начертания, называемых<strong>мастерами</strong>, между которыми будет осуществляться<strong>интерполяция</strong>.</p>
16 </ul>Совместный проект студии Dinamo и агентства Collins для Симфонического оркестра Сан-Франциско. Онлайн-редактор позволяет составить типографическую композицию по пресету или на основе звуков из микрофона в реальном времени<em>Изображение:<a>Collins</a></em><p>Для того, чтобы шрифт стал вариативным, необходимы два разных начертания, называемых<strong>мастерами</strong>, между которыми будет осуществляться<strong>интерполяция</strong>.</p>
17 <p>Чтобы интерполяция производилась правильно, оба контура должны содержать одинаковое количество опорных точек и манипуляторов.</p>
17 <p>Чтобы интерполяция производилась правильно, оба контура должны содержать одинаковое количество опорных точек и манипуляторов.</p>
18 Пример двух мастеров шрифта LPM Scurille в редакторе Glyphs<em>Изображение: из личного архива Родиона Илюхина</em><p>Интерполяция (от лат. interpolis - разглаженный, преобразованный) - нахождение неизвестных промежуточных значений внутри заданного набора. Скорее всего, вы знакомы с этим термином, если хоть раз анимировали что-либо. Ключевые точки, или кейфреймы, в анимации - это то же самое, что и мастера. Между ними тоже производится интерполяция.</p>
18 Пример двух мастеров шрифта LPM Scurille в редакторе Glyphs<em>Изображение: из личного архива Родиона Илюхина</em><p>Интерполяция (от лат. interpolis - разглаженный, преобразованный) - нахождение неизвестных промежуточных значений внутри заданного набора. Скорее всего, вы знакомы с этим термином, если хоть раз анимировали что-либо. Ключевые точки, или кейфреймы, в анимации - это то же самое, что и мастера. Между ними тоже производится интерполяция.</p>
19 <p>Несмотря на то что вариативные шрифты появились относительно недавно, концепцию "много начертаний - один файл" ещё в 1991 году представила компания Adobe под названием<a>Multiple Master</a>. Но концепция так и не стала востребованной из-за сложности работы: пользователю предлагалось настроить необходимое начертание в отдельной программе Adobe Type Manager, выгрузить статичный файл и установить его в систему.</p>
19 <p>Несмотря на то что вариативные шрифты появились относительно недавно, концепцию "много начертаний - один файл" ещё в 1991 году представила компания Adobe под названием<a>Multiple Master</a>. Но концепция так и не стала востребованной из-за сложности работы: пользователю предлагалось настроить необходимое начертание в отдельной программе Adobe Type Manager, выгрузить статичный файл и установить его в систему.</p>
20 Adobe Type Manager для Mac<em>Изображение: Adobe</em><p>В 1997 году Adobe и Microsoft представили формат<strong>OpenType</strong>с расширенным знаковым составом - их количество выросло с 256 до 65 000. Это позволило одному шрифтовому файлу содержать множество альтернативных глифов: минускульные цифры, капители, дроби, росчерки, символы верхнего и нижнего индекса, заглавные буквы, контекстуальные и стилистические альтернативы, а также полный набор лигатур.</p>
20 Adobe Type Manager для Mac<em>Изображение: Adobe</em><p>В 1997 году Adobe и Microsoft представили формат<strong>OpenType</strong>с расширенным знаковым составом - их количество выросло с 256 до 65 000. Это позволило одному шрифтовому файлу содержать множество альтернативных глифов: минускульные цифры, капители, дроби, росчерки, символы верхнего и нижнего индекса, заглавные буквы, контекстуальные и стилистические альтернативы, а также полный набор лигатур.</p>
21 OpenType features в Figma и пример части фич шрифта Apoc Revelations Regular<em>Изображение: Родион Илюхин / Matthieu Salvaggio / Tomorrow Type /<a>Blaze Type</a></em><p>Спустя 19 лет, в 2016 году, на шрифтовой конференции AtypI была представлена новая версия формата -<strong>OpenType Font Variables</strong>, которой мы сейчас и пользуемся. По сути, это и был тот же самый Multiple Master, только встроенный в редакторы и браузеры, без необходимости генерировать выбранное начертание. В 2021 году добавили поддержку цвета в шрифтах.</p>
21 OpenType features в Figma и пример части фич шрифта Apoc Revelations Regular<em>Изображение: Родион Илюхин / Matthieu Salvaggio / Tomorrow Type /<a>Blaze Type</a></em><p>Спустя 19 лет, в 2016 году, на шрифтовой конференции AtypI была представлена новая версия формата -<strong>OpenType Font Variables</strong>, которой мы сейчас и пользуемся. По сути, это и был тот же самый Multiple Master, только встроенный в редакторы и браузеры, без необходимости генерировать выбранное начертание. В 2021 году добавили поддержку цвета в шрифтах.</p>
22 <p>Буквально на днях<a>представили</a>спецификацию AVAR2, которая добавляет очень важные фичи:</p>
22 <p>Буквально на днях<a>представили</a>спецификацию AVAR2, которая добавляет очень важные фичи:</p>
23 <ul><li>Ограничение дизайн-пространства шрифта, чтобы исключить не задуманные дизайнером шрифта результаты интерполяции.</li>
23 <ul><li>Ограничение дизайн-пространства шрифта, чтобы исключить не задуманные дизайнером шрифта результаты интерполяции.</li>
24 </ul>The Developing Univers (1965) - спесимен шрифта Univers Адриана Фрутигера, наглядно иллюстрирующий ограничение дизайн-пространства. Отсутствующие ячейки - это исключённые автором начертания<em>Изображение: American Type Founders /<a>Letterform Archive</a></em><ul><li>Сокращение количества мастеров - это облегчает создание развитых семейств со множеством начертаний.</li>
24 </ul>The Developing Univers (1965) - спесимен шрифта Univers Адриана Фрутигера, наглядно иллюстрирующий ограничение дизайн-пространства. Отсутствующие ячейки - это исключённые автором начертания<em>Изображение: American Type Founders /<a>Letterform Archive</a></em><ul><li>Сокращение количества мастеров - это облегчает создание развитых семейств со множеством начертаний.</li>
25 <li>Критичное сокращение размеров шрифта (около 80%).</li>
25 <li>Критичное сокращение размеров шрифта (около 80%).</li>
26 <li>Нелинейную интерполяцию.</li>
26 <li>Нелинейную интерполяцию.</li>
27 </ul>Higher Order Interpolation (HOI) - интерполяция не по прямой, а по кривой Безье<em>Изображение:<a>Underware</a></em>Проект студии Dumbar для железных дорог Нидерландов<em>Изображение:<a>Studio Dumbar</a></em>Главный экран сайта киностудии Telescope films. Вариативный шрифт - центральная часть<a>айдентики</a>, и он обыгрывает название студии<em>Изображение: Gabriel Lefebvre / Rachel Lecompte / Emile Lord Ayotte /<a>Behance</a></em>Проект студии Lopez Design для платформы AND Academy. Главный визуальный ход с типографикой обыгрывает рост студента<em>Изображение:<a>Lopez Design</a></em>Контраст ширины, толщины и наклона - характерная черта стиля дизайнера Kris Andrew<em>Изображение:<a>Kris Andrew Small</a></em><ul><li><a>Variable Fonts</a> - каталог всех существующих вариативных шрифтов.</li>
27 </ul>Higher Order Interpolation (HOI) - интерполяция не по прямой, а по кривой Безье<em>Изображение:<a>Underware</a></em>Проект студии Dumbar для железных дорог Нидерландов<em>Изображение:<a>Studio Dumbar</a></em>Главный экран сайта киностудии Telescope films. Вариативный шрифт - центральная часть<a>айдентики</a>, и он обыгрывает название студии<em>Изображение: Gabriel Lefebvre / Rachel Lecompte / Emile Lord Ayotte /<a>Behance</a></em>Проект студии Lopez Design для платформы AND Academy. Главный визуальный ход с типографикой обыгрывает рост студента<em>Изображение:<a>Lopez Design</a></em>Контраст ширины, толщины и наклона - характерная черта стиля дизайнера Kris Andrew<em>Изображение:<a>Kris Andrew Small</a></em><ul><li><a>Variable Fonts</a> - каталог всех существующих вариативных шрифтов.</li>
28 <li><a>TypeTrials</a> - инструмент проверки вариативных шрифтов.</li>
28 <li><a>TypeTrials</a> - инструмент проверки вариативных шрифтов.</li>
29 <li><a>vartype beta</a> - песочница для проверки и анимации.</li>
29 <li><a>vartype beta</a> - песочница для проверки и анимации.</li>
30 </ul><p>Ведущий бэкенд-разработчик проекта Lloyd’s of London.</p>
30 </ul><p>Ведущий бэкенд-разработчик проекта Lloyd’s of London.</p>
31 <p>Ведёт<a>телеграм-канал</a>для айтишников, проводит<a>менторинг-сессии</a>со всеми желающими на ADPList, пишет айтишные статьи.</p>
31 <p>Ведёт<a>телеграм-канал</a>для айтишников, проводит<a>менторинг-сессии</a>со всеми желающими на ADPList, пишет айтишные статьи.</p>
32 <p>Вариативность - это прекрасно.</p>
32 <p>Вариативность - это прекрасно.</p>
33 <p>В общем смысле слова "вариативный", "вариативность" подразумевают наличие нескольких или многих вариантов чего-либо - различного поведения или разных результатов при выполнении определённых действий.</p>
33 <p>В общем смысле слова "вариативный", "вариативность" подразумевают наличие нескольких или многих вариантов чего-либо - различного поведения или разных результатов при выполнении определённых действий.</p>
34 <em>Изображение: Public Domain</em><p>В разработке вариативными могут быть множество вещей.</p>
34 <em>Изображение: Public Domain</em><p>В разработке вариативными могут быть множество вещей.</p>
35 <p>Например, в некоторых языках программирования встречается концепция<strong>вариативных аргументов</strong>. Эта фича позволяет сделать код более гибким и удобным в работе: благодаря вариативным аргументам можно вызывать метод с переменным числом аргументов без явного создания массива.</p>
35 <p>Например, в некоторых языках программирования встречается концепция<strong>вариативных аргументов</strong>. Эта фича позволяет сделать код более гибким и удобным в работе: благодаря вариативным аргументам можно вызывать метод с переменным числом аргументов без явного создания массива.</p>
36 <p>В Python, например, можно использовать символ звёздочки *, чтобы определить аргумент как вариативный. В Java и C# для этого используется оператор троеточия ….</p>
36 <p>В Python, например, можно использовать символ звёздочки *, чтобы определить аргумент как вариативный. В Java и C# для этого используется оператор троеточия ….</p>
37 <p>Для практики давайте представим ситуацию. Вы сидите с друзьями в ресторане, и у вас есть такая традиция: раз в месяц кто-то из вашей компании оплачивает весь чек. Но вот незадача: как честно определить того, кто платит на этот раз? Тянуть соломинку? Слишком старомодно!</p>
37 <p>Для практики давайте представим ситуацию. Вы сидите с друзьями в ресторане, и у вас есть такая традиция: раз в месяц кто-то из вашей компании оплачивает весь чек. Но вот незадача: как честно определить того, кто платит на этот раз? Тянуть соломинку? Слишком старомодно!</p>
38 <p>Мы напишем программу, функцию<em>chooseLuckyOne (*names)</em>, на языке Python*,* которая принимает на вход произвольное количество имён друзей на встрече, а возвращает произвольное имя того, кто и оплатит весь чек.</p>
38 <p>Мы напишем программу, функцию<em>chooseLuckyOne (*names)</em>, на языке Python*,* которая принимает на вход произвольное количество имён друзей на встрече, а возвращает произвольное имя того, кто и оплатит весь чек.</p>
39 <em>Изображение: Зуфар Сунагатов</em><p>Так, в прошлом месяце вы собрались втроём.</p>
39 <em>Изображение: Зуфар Сунагатов</em><p>Так, в прошлом месяце вы собрались втроём.</p>
40 <em>Изображение: Зуфар Сунагатов</em><p>А в этом месяце вас уже четверо.</p>
40 <em>Изображение: Зуфар Сунагатов</em><p>А в этом месяце вас уже четверо.</p>
41 <em>Изображение: Зуфар Сунагатов</em><p>И так вышло, что оба раза выпала Оля ?</p>
41 <em>Изображение: Зуфар Сунагатов</em><p>И так вышло, что оба раза выпала Оля ?</p>
42 <em>Кадр: "Настоящие домохозяйки Беверли-Хиллз" / @smudge_lord</em><p>Прости, Оль, это всё ради примера ?</p>
42 <em>Кадр: "Настоящие домохозяйки Беверли-Хиллз" / @smudge_lord</em><p>Прости, Оль, это всё ради примера ?</p>
43 <p>Усвоили? Отлично!</p>
43 <p>Усвоили? Отлично!</p>
44 <p>Давайте теперь разберём пример вариативности посложнее.</p>
44 <p>Давайте теперь разберём пример вариативности посложнее.</p>
45 <p>Представьте, что вам нужно разработать веб-сайт, причём вы хотите, чтобы он работал и выглядел одинаково во всех браузерах. То есть он должен быть адаптирован ко всем вариантам веб-браузеров Safari, Google Chrome, Mozilla Firefox, Internet Explorer. В каждом есть уникальные особенности, и это может привести к тому, что некоторые элементы веб-страниц будут отображаться по-разному.</p>
45 <p>Представьте, что вам нужно разработать веб-сайт, причём вы хотите, чтобы он работал и выглядел одинаково во всех браузерах. То есть он должен быть адаптирован ко всем вариантам веб-браузеров Safari, Google Chrome, Mozilla Firefox, Internet Explorer. В каждом есть уникальные особенности, и это может привести к тому, что некоторые элементы веб-страниц будут отображаться по-разному.</p>
46 <em>Кадр: фильм "Властелин колец"</em><p>Чтобы обеспечить правильное отображение элементов веб-сайта во всех этих браузерах, вы можете применить CSS-стили, которые поддерживаются всеми популярными браузерами. Это будет гарантировать, что веб-страницы будут выглядеть одинаково везде.</p>
46 <em>Кадр: фильм "Властелин колец"</em><p>Чтобы обеспечить правильное отображение элементов веб-сайта во всех этих браузерах, вы можете применить CSS-стили, которые поддерживаются всеми популярными браузерами. Это будет гарантировать, что веб-страницы будут выглядеть одинаково везде.</p>
47 <p>Также вы можете использовать JavaScript-полифилы - фрагменты кода, которые добавляют поддержку новых функций и возможностей в старых браузерах, не поддерживающих их по умолчанию. Такой подход позволит вам создать гибкий и адаптивный веб-сайт, который будет работать на разных браузерах и устройствах.</p>
47 <p>Также вы можете использовать JavaScript-полифилы - фрагменты кода, которые добавляют поддержку новых функций и возможностей в старых браузерах, не поддерживающих их по умолчанию. Такой подход позволит вам создать гибкий и адаптивный веб-сайт, который будет работать на разных браузерах и устройствах.</p>
48 <p>Пример с браузерами был довольно простым?</p>
48 <p>Пример с браузерами был довольно простым?</p>
49 <p>Давайте победим финального босса ?</p>
49 <p>Давайте победим финального босса ?</p>
50 <p>Рассмотрим, насколько могут быть вариативными, а точнее вариантными, типы данных в языках программирования.</p>
50 <p>Рассмотрим, насколько могут быть вариативными, а точнее вариантными, типы данных в языках программирования.</p>
51 <p><strong>Вариантность</strong> - это свойство, которое описывает специфику взаимосвязи между сложными типами данных в некоторых языках программирования. Эта очень интересная особенность позволяет делать гибкие адаптивные программы, которые мы так любим ?</p>
51 <p><strong>Вариантность</strong> - это свойство, которое описывает специфику взаимосвязи между сложными типами данных в некоторых языках программирования. Эта очень интересная особенность позволяет делать гибкие адаптивные программы, которые мы так любим ?</p>
52 <p>Кстати, а вы любите фрукты? Надеюсь, что да, так как дальше они помогут нам разобраться с вариантностью.</p>
52 <p>Кстати, а вы любите фрукты? Надеюсь, что да, так как дальше они помогут нам разобраться с вариантностью.</p>
53 <p>Рассмотрим следующую иерархию типов:</p>
53 <p>Рассмотрим следующую иерархию типов:</p>
54 <em>Изображение: pch.vector / jcomp / Freepik</em><p>Здесь Fruit (Фрукт) является базовым типом данных, а Apple (Яблоко) и Orange (Апельсин) наследуются от него.</p>
54 <em>Изображение: pch.vector / jcomp / Freepik</em><p>Здесь Fruit (Фрукт) является базовым типом данных, а Apple (Яблоко) и Orange (Апельсин) наследуются от него.</p>
55 <p>В коде на языке Java эта иерархия будет выглядеть именно так:</p>
55 <p>В коде на языке Java эта иерархия будет выглядеть именно так:</p>
56 <em>Изображение: Зуфар Сунагатов</em><p>На основе этой иерархии типов данных рассмотрим три типа вариантности: ковариантность, контравариантность и инвариантность.</p>
56 <em>Изображение: Зуфар Сунагатов</em><p>На основе этой иерархии типов данных рассмотрим три типа вариантности: ковариантность, контравариантность и инвариантность.</p>
57 <p><strong>Ковариантность</strong> - это свойство типов данных, которое сохраняет иерархию наследования исходных типов в производных типах в том же порядке.</p>
57 <p><strong>Ковариантность</strong> - это свойство типов данных, которое сохраняет иерархию наследования исходных типов в производных типах в том же порядке.</p>
58 <p>Так, если тип данных<em>Apple (Яблоко)</em>и <em>Orange (Апельсин)</em>наследуются от типа данных<em>Fruit (Фрукт)</em>, тогда благодаря свойству ковариантности коллекция с типом данных<em>Apple</em>и коллекция<em>с </em>типом<em></em>данных<em>Orange</em>будут потомками коллекции с типом данных<em>Fruit</em>. То есть, например, "список из пяти яблок или апельсинов" - это частный случай "списка из пяти фруктов".</p>
58 <p>Так, если тип данных<em>Apple (Яблоко)</em>и <em>Orange (Апельсин)</em>наследуются от типа данных<em>Fruit (Фрукт)</em>, тогда благодаря свойству ковариантности коллекция с типом данных<em>Apple</em>и коллекция<em>с </em>типом<em></em>данных<em>Orange</em>будут потомками коллекции с типом данных<em>Fruit</em>. То есть, например, "список из пяти яблок или апельсинов" - это частный случай "списка из пяти фруктов".</p>
59 <p>В коде это будет выглядеть так:</p>
59 <p>В коде это будет выглядеть так:</p>
60 <em>Изображение: Зуфар Сунагатов</em><p>В таком случае говорят, что тип (в данном случае обобщённый интерфейс) Collесtion&lt;T&gt; ковариантен своему параметру-типу T.</p>
60 <em>Изображение: Зуфар Сунагатов</em><p>В таком случае говорят, что тип (в данном случае обобщённый интерфейс) Collесtion&lt;T&gt; ковариантен своему параметру-типу T.</p>
61 <p>Некоторые преимущества ковариантности:</p>
61 <p>Некоторые преимущества ковариантности:</p>
62 <ul><li>Позволяет использовать объекты производных типов данных вместо объектов базовых типов данных, что упрощает работу с более абстрактными типами данных.</li>
62 <ul><li>Позволяет использовать объекты производных типов данных вместо объектов базовых типов данных, что упрощает работу с более абстрактными типами данных.</li>
63 <li>Позволяет использовать коллекции (списки, массивы и так далее) с элементами производных типов данных вместо базовых типов данных, что делает код более компактным и понятным.</li>
63 <li>Позволяет использовать коллекции (списки, массивы и так далее) с элементами производных типов данных вместо базовых типов данных, что делает код более компактным и понятным.</li>
64 <li>Позволяет передавать аргументы производных типов данных без необходимости явного преобразования типов для функций, ожидающих аргументы базовых типов данных.</li>
64 <li>Позволяет передавать аргументы производных типов данных без необходимости явного преобразования типов для функций, ожидающих аргументы базовых типов данных.</li>
65 </ul><p><strong>Контравариантность</strong> - это противоположное ковариантности свойство типов данных, которое обращает иерархию наследования исходных типов данных на противоположную в производных типах, если производный тип ведёт себя как общий.</p>
65 </ul><p><strong>Контравариантность</strong> - это противоположное ковариантности свойство типов данных, которое обращает иерархию наследования исходных типов данных на противоположную в производных типах, если производный тип ведёт себя как общий.</p>
66 <p>Так, если типы данных<em>Apple (Яблоко)</em>и <em>Orange (Апельсин)</em>наследуются от типа данных<em>Fruit (Фрукт)</em>, тогда благодаря свойству контравариантности мы можем добавлять обьекты типа данных<em>Apple (Яблоко)</em>и <em>Orange (Апельсин)</em>в коллекцию с типом данных<em>Fruit (Фрукт).</em>Таким образом, мы можем использовать коллекцию с более общим типом данных вместо коллекции с более специфичным типом данных.</p>
66 <p>Так, если типы данных<em>Apple (Яблоко)</em>и <em>Orange (Апельсин)</em>наследуются от типа данных<em>Fruit (Фрукт)</em>, тогда благодаря свойству контравариантности мы можем добавлять обьекты типа данных<em>Apple (Яблоко)</em>и <em>Orange (Апельсин)</em>в коллекцию с типом данных<em>Fruit (Фрукт).</em>Таким образом, мы можем использовать коллекцию с более общим типом данных вместо коллекции с более специфичным типом данных.</p>
67 <p>В коде это будет выглядеть так:</p>
67 <p>В коде это будет выглядеть так:</p>
68 <em>Изображение: Зуфар Сунагатов</em><p>Некоторые преимущества контравариантности:</p>
68 <em>Изображение: Зуфар Сунагатов</em><p>Некоторые преимущества контравариантности:</p>
69 <ul><li>Позволяет использовать объекты базовых типов данных вместо объектов производных типов данных, что упрощает работу с более конкретными типами данных.</li>
69 <ul><li>Позволяет использовать объекты базовых типов данных вместо объектов производных типов данных, что упрощает работу с более конкретными типами данных.</li>
70 <li>Позволяет использовать коллекции (стеки, очереди и так далее) с элементами базовых типов данных вместо производных типов данных, что делает код более компактным и понятным.</li>
70 <li>Позволяет использовать коллекции (стеки, очереди и так далее) с элементами базовых типов данных вместо производных типов данных, что делает код более компактным и понятным.</li>
71 <li>Позволяет передавать аргументы базовых типов данных без необходимости явного преобразования типов для функций, ожидающих аргументы производных типов данных.</li>
71 <li>Позволяет передавать аргументы базовых типов данных без необходимости явного преобразования типов для функций, ожидающих аргументы производных типов данных.</li>
72 </ul><p><strong>Инвариантность</strong> - это случай, когда у типов данных отсутствуют свойства как ковариативности, так и контравариативности.</p>
72 </ul><p><strong>Инвариантность</strong> - это случай, когда у типов данных отсутствуют свойства как ковариативности, так и контравариативности.</p>
73 <p>Так, несмотря на то что тип данных<em>Apple (Яблоко)</em>и <em>Orange (Апельсин)</em>наследуются от типа данных<em>Fruit (Фрукт)</em>, коллекция с типом данных<em>Apple</em>и коллекция с типом данных<em>Orange</em>не будут подтипом коллекции с типом данных<em>Fruit</em>.</p>
73 <p>Так, несмотря на то что тип данных<em>Apple (Яблоко)</em>и <em>Orange (Апельсин)</em>наследуются от типа данных<em>Fruit (Фрукт)</em>, коллекция с типом данных<em>Apple</em>и коллекция с типом данных<em>Orange</em>не будут подтипом коллекции с типом данных<em>Fruit</em>.</p>
74 <p>В коде это будет выглядеть так:</p>
74 <p>В коде это будет выглядеть так:</p>
75 <em>Изображение: Зуфар Сунагатов</em><p>Некоторые преимущества инвариантности:</p>
75 <em>Изображение: Зуфар Сунагатов</em><p>Некоторые преимущества инвариантности:</p>
76 <ul><li>Гарантирует строгую типизацию, где объекты могут быть использованы только с объектами того же точного типа, без допущения преобразования типов или замены на производные или базовые типы данных.</li>
76 <ul><li>Гарантирует строгую типизацию, где объекты могут быть использованы только с объектами того же точного типа, без допущения преобразования типов или замены на производные или базовые типы данных.</li>
77 <li>Улучшает ясность и понятность кода, так как не допускает неявных преобразований и требует явного указания точного типа данных, что может помочь предотвратить путаницу и ошибки.</li>
77 <li>Улучшает ясность и понятность кода, так как не допускает неявных преобразований и требует явного указания точного типа данных, что может помочь предотвратить путаницу и ошибки.</li>
78 </ul><em>Изображение: Public Domain</em><p>Вариативность в разработке может быть, как ни странно, вариативной, местами сложной и довольно запутанной. Но это точно полезная особенность, которая даёт программисту больше возможностей делать работу хорошо, а плохо не делать. Главное - использовать её с умом!</p>
78 </ul><em>Изображение: Public Domain</em><p>Вариативность в разработке может быть, как ни странно, вариативной, местами сложной и довольно запутанной. Но это точно полезная особенность, которая даёт программисту больше возможностей делать работу хорошо, а плохо не делать. Главное - использовать её с умом!</p>
79 <p>Удачи вам в изучении мира айти и разработки в частности ?</p>
79 <p>Удачи вам в изучении мира айти и разработки в частности ?</p>
80 <a><b>Попробуйте бесплатно 4 топовые профессии в дизайне</b>Пройдите бесплатный курс по дизайну. Добавьте 4 крутых кейса в портфолио и решите, в каком направлении развиваться дальше. Пройти курс→</a>
80 <a><b>Попробуйте бесплатно 4 топовые профессии в дизайне</b>Пройдите бесплатный курс по дизайну. Добавьте 4 крутых кейса в портфолио и решите, в каком направлении развиваться дальше. Пройти курс→</a>