Точнее, изначально он, возможно, был написан и хорошо. Но потом пришлось добавить ещё одну функциональность. Ещё одну. Ещё. В итоге получается монстр. И чтобы понять, как он работает, приходится выписывать основные управляющие конструкции на бумажку (без спагетти-основных действий и без внутренних переходов) и рисовать связи между ними. Зрелище получается кошмарное, но менее кошмарное, чем сам монстр. Теперь можно продолжить работу. И приделать что-нибудь ещё.

То есть речь именно о плавно наращиваемом функционале. Иногда по-другому не сделаешь.

Можно ли выйти из этого порочного круга? По-моему, единственный выход -- переписывать каждый раз весь кусок программы с нуля, указав новую функциональность в ТЗ. Иначе миллиона флажков и доп переменных типа "номер итерации в пятом режиме работы" не избежать.

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