Извлечение функции


Управление сложностью

Согласно закону Миллера, человеческий мозг легко управляется одновременно примерно с тремя отдельными объектами, а предел находится в районе семи (известное эмпирическое правило 7±2, закон Миллера).

Таким образом, условные 18 переменных (для мозга — 18 отдельных объектов), вкупе с непосчитанным количеством промежуточных значений и операций над ними, для мозга представляют абсолютный перегруз.

Что делать? То же, что делает и сам мозг с большим количеством объектов: благодаря действию принципа гештальта он превращает группу из нескольких объектов в одиночный объект.

То есть нам нужно разделять один большой и сложный алгоритм на много мелких, сложность которых будет комфортна для мозга. В идеале каждый вспомогательный алгоритм должен содержать не более 7±2 переменных и операций (и тех, и других в сумме) — тогда сущность алгоритма можно будет уяснить мельком взглянув на код.

Группа операций, предназначенная для работы с определённой группой переменных, переносится в отдельную функцию (или метод). Группа операций превращается в единичную операцию, часть промежуточных переменных скрывается из поля зрения, оставляя на виду лишь конечный результат. Такой приём описан, в частности, в книге Фаулера и называется «выделение метода».

При правильном разделении на функции код подобен матрёшке или дереву с ветвями: нам не всегда необходимо исследовать все вложенные матрёшки и все ветви дерева до последней — вполне допустимо остановиться на любом достаточном уровне.

В книге Макконнелла снижение сложности названо в качестве первой по списку причины для создания отдельного метода (раздел 7.1).

Понять цель (смысл, результат) фрагмента кода гораздо проще, когда у него есть явное название, разобраться в алгоритме проще, когда у него есть чёткие границы — то есть когда код находится внутри функции.

Как применять

Признаки того, что фрагмент кода можно и нужно выделить в функцию:

  • собственный набор временных переменных
  • одно результирующее значение
  • понятное и короткое человеческое название для того, что делает фрагмент кода (его цели)

Что дальше

  • Длина функции
  • Название функции
  • Ребусы в коде
  • Принцип единственного уровня

Литература