Следует избегать чрезмерной вложенности кода 🪆.

“If you need more than 3 levels of indentation, you’re screwed anyway, and should fix your program” – linux coding style guide

«Если вам потребовалось более 3-x уровней вложенности, то, скорее всего, вы и так уже в тупике и должны переписать вашу программу» – Linux руководство по стилю программирования

Примеры вложенности

Одноуровневая вложенность

function result = calculate(bottom, top)
    result = bottom + top;
end

Двухуровневая вложенность

function result = calculate(bottom, top)
    if top > bottom
        result = top + bottom;
    else
        result = 0;
    end
end

Трехуровневая вложенность

function result = calculate(bottom, top)
    if top > bottom
        sum = 0;
        for number = bottom:top
            sum = sum + number;
        end
        result = sum;
    else
        result = 0;
    end
end

4-ех уровневая вложенность 😖

function result = calculate(bottom, top)
    if top > bottom
        sum = 0;
        for number = bottom:top
            if mod(number, 2) == 0
                sum = sum + number;
            end
        end
        result = sum;
    else
        result = 0;
    end
end

Способы “разложения”

  1. Извлечение: выделение части функции в отдельную функцию
  2. Инверсия: перестановка и инвертирование условий + переход к раннему возврату из функции

Применение извлечения

function result = calculate(bottom, top)
    if top > bottom
        sum = 0;
        for number = bottom:top
            sum = sum + filterNumber(number);
        end
        result = sum;
    else
        result = 0;
    end
end

function result = filterNumber(number)
    if mod(number, 2) == 0
        result = number;
    else
        result = 0;
    end
end

Применение инверсии

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

function result = calculate(bottom, top)
    if top < bottom
        result = 0;
        return;
    end
    
    sum = 0;
    for number = bottom:top
        sum = sum + filterNumber(number);
    end
    result = sum;
end

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