Yaroslav Bibaev

Субъективный блог

04 Apr 2021

Линейный код

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

Код уходящий в глубину, с точки зрения производительности, не играет важной роли, а вот с точки зрения читающего - в разы усложняет понимание и делает это весьма затратной задачей. При каждом таком “спуске”, чтобы дальше понимать смысл происходящего, приходится запоминать контекст вызова. Соответственно, чем больше таких переходов, тем больше контекста приходится держать одновременно в голове, увеличивая количество объектов в кратковременной памяти человека. К сожалению, туда не так много помещается, всего семь плюс-минус два объекта, а “эффект дверного проема” может еще сильнее усугубить ситуацию, заполнив кратковременную память в самый неподходящий момент не тем, чем бы хотелось. Это заставляет читающего постоянно возвращаться и перечитывать код заново, чтобы восстановить упущенный контекст. Так может происходить много раз, особенно если код содержит много вложенных условий, циклов, глобальных переменных и еще других “радостей” для читающего, тем самым затрудняя понимание в разы. Благо сегодняшние среды для разработки облегчают часть страданий и помогают с легкостью навигироваться по сложному коду, но проблема с одновременным удержанием большого количества объектов в кратковременной памяти пока еще не решена.

Задумываясь о читаемости можно сделать вывод, что код заставляющий постоянно “заглядывать” глубже никак не способствует понятному коду, а напротив — делает чтение максимально некомфортным. Существующему коду вряд ли что-то поможет, кроме жесткого рефакторинга или полного переписывания программы, а вот при написании нового — уже можно учитывать этот факт и писать код с линейным повествованием, делая написанный код похожим на рассказ.