Ветвление и линейность в коде

Давайте немного поговорим о том, что такое вложенные конструкции чем они вредны для кода. И почему линейность помогает улучшить код.

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

Ветвление делается с помощью операторов выбора if/then/else и по сути означает, что мы либо сворачиваем с "прямого пути", либо продолжаем двигаться дальше. На уровне машинного кода ветвление - это либо переход на следующий адрес, где расположена команда для выполнения, либо на какой-то произвольный адрес с командой.

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

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

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

Отсюда возникает хорошо известное правило: "плоское лучше вложенного".

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

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

Отсюда возникает правило: "вложенные условия декомпозируй в виде функции". Практика показывает, что декомпозиция программы на функции не только упрощает повторное использование кода, но и значительно упрощает восприятие и анализ.

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

Таким образом, чтобы код получился более читаемым и понятным нужно обратить внимание:

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