Управление сложностью
Согласно закону Миллера, человеческий мозг легко управляется одновременно примерно с тремя отдельными объектами, а предел находится в районе семи (известное эмпирическое правило 7±2, закон Миллера).
Таким образом, условные 18 переменных (для мозга — 18 отдельных объектов), вкупе с непосчитанным количеством промежуточных значений и операций над ними, для мозга представляют абсолютный перегруз.
Что делать? То же, что делает и сам мозг с большим количеством объектов: благодаря действию принципа гештальта он превращает группу из нескольких объектов в одиночный объект.
То есть нам нужно разделять один большой и сложный алгоритм на много мелких, сложность которых будет комфортна для мозга. В идеале каждый вспомогательный алгоритм должен содержать не более 7±2 переменных и операций (и тех, и других в сумме) — тогда сущность алгоритма можно будет уяснить мельком взглянув на код.
Группа операций, предназначенная для работы с определённой группой переменных, переносится в отдельную функцию (или метод). Группа операций превращается в единичную операцию, часть промежуточных переменных скрывается из поля зрения, оставляя на виду лишь конечный результат. Такой приём описан, в частности, в книге Фаулера и называется «выделение метода».
При правильном разделении на функции код подобен матрёшке или дереву с ветвями: нам не всегда необходимо исследовать все вложенные матрёшки и все ветви дерева до последней — вполне допустимо остановиться на любом достаточном уровне.
В книге Макконнелла снижение сложности названо в качестве первой по списку причины для создания отдельного метода (раздел 7.1).
Понять цель (смысл, результат) фрагмента кода гораздо проще, когда у него есть явное название, разобраться в алгоритме проще, когда у него есть чёткие границы — то есть когда код находится внутри функции.
Как применять
Признаки того, что фрагмент кода можно и нужно выделить в функцию:
- собственный набор временных переменных
- одно результирующее значение
- понятное и короткое человеческое название для того, что делает фрагмент кода (его цели)
Что дальше
- Длина функции
- Название функции
- Ребусы в коде
- Принцип единственного уровня
Литература
- Фаулер М. Рефакторинг: улучшение существующего кода. — СПб: Символ-Плюс, 2016
- Макконнелл С. Совершенный код. Мастер класс. — М.: «Русская редакция», 2017.
- Закон Миллера
- Цикломатическая сложность
- Когнитивная сложность