Заманчиво написать императивный код, потому что его легче понять и написать, особенно для новичков в программировании. Но давайте будем реалистами, кто хочет навсегда остаться новичком?

Вот несколько причин, по которым вам следует избегать императивного кода, даже при использовании классов, объектно-ориентированного программирования (ООП) или функциональной парадигмы.

Просто потому, что вы пишете на «хипстерских функциональных» языках или на «олдскульных» ООП-языках, люди всегда найдут способ добавить императивный спагетти-код. Это действительно удивительно.

Императивный код сложнее поддерживать и отлаживать

Императивный код часто зависит от множества явных деталей и изменений состояния, что может затруднить понимание общего потока кода. Это приводит к большему количеству ошибок, которые трудно исправить.

Отладка императивного кода похожа на попытку найти иголку в стоге сена, за исключением того, что стог сена горит, а иголка на самом деле является куском спагетти. Удачи с этим.

Императивный код менее гибкий и пригодный для повторного использования

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

Попытка повторно использовать императивный код подобна попытке вставить квадратный колышек в круглое отверстие; это может работать некоторое время, но в конечном итоге это вызовет больше проблем, чем решит.

Лучший подход: декларативный код

Декларативный код фокусируется на том, что код должен делать, а не на том, как это сделать. Декларативный код часто легче понять, поддерживать и повторно использовать, поскольку он опирается на абстракции и высокоуровневую логику.

Эй, давайте будем реалистами, проблема на самом деле не в использовании императивного кода, иногда решение методом грубой силы является лучшим… первым решением. После того, как это работает, вы затем реорганизуете его, чтобы сделать его лучше. (И, возможно/вероятно, перед этим вы бы проверили, чтобы убедиться, что ничего не ломаете.)

Например, вместо написания кода, подробно определяющего каждый шаг, изменяющего переменные и состояния, вы можете использовать функции более высокого порядка и неизменяемые структуры данных для определения логики своего кода.

Вот несколько примеров императивного и декларативного кода с использованием 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