HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Главная причина создавать функции - это повышение уровня абстракции, а не сокращение дублирования кода, как вы могли бы подумать. Второе - это следствие первого. Вместо того чтобы реализовывать сортировку самостоятельно, можно воспользоваться функцией sort. Она прячет реализацию внутри себя и позволяет программисту не отвлекаться на вид сортировки, код для ее выполнения и другие ненужные детали.</p>
1 <p>Главная причина создавать функции - это повышение уровня абстракции, а не сокращение дублирования кода, как вы могли бы подумать. Второе - это следствие первого. Вместо того чтобы реализовывать сортировку самостоятельно, можно воспользоваться функцией sort. Она прячет реализацию внутри себя и позволяет программисту не отвлекаться на вид сортировки, код для ее выполнения и другие ненужные детали.</p>
2 <p>В этом заключается суть абстракции. Мы игнорируем несущественные стороны, свойства и связи рассматриваемого объекта или процесса, чтобы представить сложную концепцию в простой форме. Умение абстрагировать - одно из важнейших свойств нашего мозга. Маленькие дети очень быстро учатся классифицировать предметы окружающего мира. Без особого труда они понимают, что дерево - это дерево, даже если конкретный вид дерева они видят впервые. Так же легко они узнают зайчика в двух разведенных пальцах, которые обозначают уши.</p>
2 <p>В этом заключается суть абстракции. Мы игнорируем несущественные стороны, свойства и связи рассматриваемого объекта или процесса, чтобы представить сложную концепцию в простой форме. Умение абстрагировать - одно из важнейших свойств нашего мозга. Маленькие дети очень быстро учатся классифицировать предметы окружающего мира. Без особого труда они понимают, что дерево - это дерево, даже если конкретный вид дерева они видят впервые. Так же легко они узнают зайчика в двух разведенных пальцах, которые обозначают уши.</p>
3 <p>Сделаем важную оговорку: умение грамотно строить сложные абстракции не появляется само по себе. Оно приходит с опытом. Особенно эффективно в развитие этого навыка помогает преподаватель или опытный коллега, который может указать на допущенные ошибки. Кроме того, со временем вы сами научитесь отслеживать проблемы в своих абстракциях.</p>
3 <p>Сделаем важную оговорку: умение грамотно строить сложные абстракции не появляется само по себе. Оно приходит с опытом. Особенно эффективно в развитие этого навыка помогает преподаватель или опытный коллега, который может указать на допущенные ошибки. Кроме того, со временем вы сами научитесь отслеживать проблемы в своих абстракциях.</p>
4 <p>С другой стороны, излишнее абстрагирование скорее вредно, чем полезно. За нагромождением новых сущностей можно потерять суть и тратить больше времени на понимание происходящего. Построение абстракции - всегда компромисс. Слишком низкий уровень абстракции приводит к дублированию кода, слишком высокий - может быть очень трудным для понимания. Как пример такого усложнения -<a>Теория Категорий</a>.</p>
4 <p>С другой стороны, излишнее абстрагирование скорее вредно, чем полезно. За нагромождением новых сущностей можно потерять суть и тратить больше времени на понимание происходящего. Построение абстракции - всегда компромисс. Слишком низкий уровень абстракции приводит к дублированию кода, слишком высокий - может быть очень трудным для понимания. Как пример такого усложнения -<a>Теория Категорий</a>.</p>
5 <p>Функции высшего порядка выводят абстрагирование с помощью функций на новый уровень. Используя анонимные функции, они делегируют поведение внешнему коду, что резко расширяет возможность повторного использования кода и алгоритма в разных ситуациях. Вместо десяти функций для десяти участков кода появляется одна функция, которая специфицируется 10 раз разным поведением.</p>
5 <p>Функции высшего порядка выводят абстрагирование с помощью функций на новый уровень. Используя анонимные функции, они делегируют поведение внешнему коду, что резко расширяет возможность повторного использования кода и алгоритма в разных ситуациях. Вместо десяти функций для десяти участков кода появляется одна функция, которая специфицируется 10 раз разным поведением.</p>
6 <p>Но не забывайте, что<a>абстракции почти всегда текут</a>.</p>
6 <p>Но не забывайте, что<a>абстракции почти всегда текут</a>.</p>
7 <h2>Пример дырявой абстракции</h2>
7 <h2>Пример дырявой абстракции</h2>
8 <p>В первом проекте Хекслета наши ученики совершают одну ошибку, связанную с неверным выделением абстракций. Если отбросить детали, то задача сводится к написанию функции, которая принимает на вход число и печатает на экран слово yes для четных чисел или слово no для нечетных.</p>
8 <p>В первом проекте Хекслета наши ученики совершают одну ошибку, связанную с неверным выделением абстракций. Если отбросить детали, то задача сводится к написанию функции, которая принимает на вход число и печатает на экран слово yes для четных чисел или слово no для нечетных.</p>
9 <p>Первое решение выглядит примерно так:</p>
9 <p>Первое решение выглядит примерно так:</p>
10 <p>Оно рабочее, но сама концепция четности не выделена в свою абстракцию - это затрудняет тестирование и понимание кода. Здесь он простой, но в более сложном случае было бы непросто догадаться, что за операция выполняется. Было бы правильно выделить четность в отдельную функцию-абстракцию:</p>
10 <p>Оно рабочее, но сама концепция четности не выделена в свою абстракцию - это затрудняет тестирование и понимание кода. Здесь он простой, но в более сложном случае было бы непросто догадаться, что за операция выполняется. Было бы правильно выделить четность в отдельную функцию-абстракцию:</p>
11 <p>Посмотрите на код выше внимательно. Все ли с ним нормально?</p>
11 <p>Посмотрите на код выше внимательно. Все ли с ним нормально?</p>
12 <p>На самом деле, этот код даже хуже, чем первая версия, потому что здесь создана неверная абстракция. Понятие четности числа никак не связано ни с выводом на экран, ни со строчками yes или no. Оно существует в вакууме как математическая концепция и не знает о том, как ее собираются использовать. И это мы даже не говорим о том, что имя isEven начинается с is, то есть эта функция-предикат. Такие функции могут возвращать только логическое значение и никак иначе (исключений не существует!). Правильный вариант выглядит так:</p>
12 <p>На самом деле, этот код даже хуже, чем первая версия, потому что здесь создана неверная абстракция. Понятие четности числа никак не связано ни с выводом на экран, ни со строчками yes или no. Оно существует в вакууме как математическая концепция и не знает о том, как ее собираются использовать. И это мы даже не говорим о том, что имя isEven начинается с is, то есть эта функция-предикат. Такие функции могут возвращать только логическое значение и никак иначе (исключений не существует!). Правильный вариант выглядит так:</p>
13 <p>Это самый примитивный вариант создания абстракций. В реальном коде обычно все значительно сложнее.</p>
13 <p>Это самый примитивный вариант создания абстракций. В реальном коде обычно все значительно сложнее.</p>