Заманчиво написать императивный код, потому что его легче понять и написать, особенно для новичков в программировании. Но давайте будем реалистами, кто хочет навсегда остаться новичком?
Вот несколько причин, по которым вам следует избегать императивного кода, даже при использовании классов, объектно-ориентированного программирования (ООП) или функциональной парадигмы.
Просто потому, что вы пишете на «хипстерских функциональных» языках или на «олдскульных» ООП-языках, люди всегда найдут способ добавить императивный спагетти-код. Это действительно удивительно.
Императивный код сложнее поддерживать и отлаживать
Императивный код часто зависит от множества явных деталей и изменений состояния, что может затруднить понимание общего потока кода. Это приводит к большему количеству ошибок, которые трудно исправить.
Отладка императивного кода похожа на попытку найти иголку в стоге сена, за исключением того, что стог сена горит, а иголка на самом деле является куском спагетти. Удачи с этим.
Императивный код менее гибкий и пригодный для повторного использования
Императивный код часто фокусируется на том, как выполнить конкретную задачу, а не на общей логике и абстракциях. Это может затруднить адаптацию кода для различных вариантов использования или его интеграцию с другим кодом.
Попытка повторно использовать императивный код подобна попытке вставить квадратный колышек в круглое отверстие; это может работать некоторое время, но в конечном итоге это вызовет больше проблем, чем решит.
Лучший подход: декларативный код
Декларативный код фокусируется на том, что код должен делать, а не на том, как это сделать. Декларативный код часто легче понять, поддерживать и повторно использовать, поскольку он опирается на абстракции и высокоуровневую логику.
Эй, давайте будем реалистами, проблема на самом деле не в использовании императивного кода, иногда решение методом грубой силы является лучшим… первым решением. После того, как это работает, вы затем реорганизуете его, чтобы сделать его лучше. (И, возможно/вероятно, перед этим вы бы проверили, чтобы убедиться, что ничего не ломаете.)
Например, вместо написания кода, подробно определяющего каждый шаг, изменяющего переменные и состояния, вы можете использовать функции более высокого порядка и неизменяемые структуры данных для определения логики своего кода.
Вот несколько примеров императивного и декларативного кода с использованием TypeScript:
Императивный код:
function findMax(arr: number[]): number { let max = arr[0]; for (let i = 1; i < arr.length; i++) { if (arr[i] > max) { max = arr[i]; } } return max; } console.log(findMax([1, 9, 5, 3, 7])); // 9
Декларативный код:
function findMax(arr: number[]): number { return arr.reduce((acc, cur) => (cur > acc ? cur : acc), -Infinity); } console.log(findMax([1, 9, 5, 3, 7])); // 9
Давайте сравним
И я сначала начну с декларативного, и, пожалуйста, не обращайте внимания на маленькую деталь, состоящую только из одной строки. Если вы понимаете, что делает reduce
, то вы знаете, что он начинается с наименьшего возможного number
(минус бесконечность), а затем вы проверяете, какое из accumulator
или current
больше, и возвращаете большее.
Да, вам нужно знать гораздо больше заранее; это первоначальные инвестиции, и тогда вы сможете легко читать, понимать и отлаживать код.
(И да, вы могли бы просто использовать Math.max
, но какой в этом смысл?)
Между тем… императивное. Вы начинаете с числа, перебираете их все, если оно больше, меняете переменную max
, а когда закончите, возвращаете max
.
Это просто, это работает, но подождите… почему цикл начался с индекса 1
?
Иди перечитай, я жду...
Ах… Мы уже начали с индекса 0
в переменной max
.
Видеть? Даже в этом коротком примере вы должны удвоить внимание. Теперь проверьте свой последний толчок для этого типа спагетти и побейте себя клавиатурой, если найдете его. Вы также можете приставать к своим коллегам-макаронникам за то же самое, я слышал, что механические клавиатуры издают приятный звук при ударе по голове (Да, я проверял и знаю, что вы тоже. Пожалуйста, пришлите видео.).
Я не могу не подчеркнуть, как сильно я ненавижу императивный код
В заключение, вы пишете код один раз и читаете его каждый раз после этого. Мало того, я мог бы быть тем, кто читает это, и я действительно не хочу видеть, что было в вашей голове в тот момент, просто чтобы понять этот кусок кода пасты.
Итак, давайте сделаем всем нам одолжение и просто не будем использовать императивные операторы, хорошо? Просто помните, что декларативный код похож на хорошо смазанный механизм. Для первоначальной настройки может потребоваться немного больше усилий, но в конце концов это окупится.
Фото на обложке Christine Sandu на Unsplash