Мы все были там. Вы работаете над продуктом, и есть такая часть бизнес-логики, которая кажется достаточно общей, скажем, функция plural(x, noun), которая принимает число x и существительное noun и возвращает соответствующую форму единственного/множественного числа этого noun в количестве x

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

«Хм… это кажется достаточно общим, чтобы служить утилитой. Давайте переместим его на /utils

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

Теперь прилежный программист мог бы разделить файл utils по логическим областям, таким как математика, работа со строками и функции базы данных. Однако такое разделение создает ложное ощущение модульности — разделение здесь связано только с файловой иерархией, а не с владением кодом. Что я имею в виду? скажем, теперь у вас есть другой проект, для которого требуются некоторые из этих утилит. По моему опыту, в условиях реальных сроков, загруженности или просто лени можно было бы просто скопировать /utils в другой проект, тем самым совершив смертный грех не-СУХОЙ код!

Чтобы добиться истинной модульности, вам следует разделять и властвовать над этой мешаниной утилит, извлекая их в независимые модули кода, а именно в пакеты NPM для JavaScript или любой тип упаковки, предлагаемый вашей языковой экосистемой.