теория
Раз модуль — это граница, тут же встаёт вопрос: а какая граница хорошая? Ответ, на удивление, красивый: хороший модуль — это . Цель абстракции не в том, чтобы быть размытой, а в том, чтобы создать новый уровень, на котором можно быть абсолютно точным. Слово «машина» передаёт смысл без марки и цвета; интерфейс Save()/Query() — без имени СУБД.
Модули удобно мерить «глубиной». Представь прямоугольник: нижняя грань — интерфейс (function), а площадь — реализация (logic).
addTwoNumbers(a, b) не прячет ничего, читать интерфейс и читать код — одно и то же. Такая граница не окупает даже собственного существования.Абстракция ломается двумя способами:
А у самой модульности две канавы по обочинам дороги:
И последняя ловушка, самая тонкая. Даже система из идеально глубоких модулей не обязана быть модульной. Возьми два безупречных модуля, внутри которых живёт одно и то же бизнес-правило, — они должны меняться вместе, но однажды разъедутся. Модульность не видна в отдельном модуле; она живёт между ними: говорит, каким знанием делятся компоненты, а — насколько содержимое одного модуля принадлежит самому себе. Не путать: связанность — про связи между модулями, связность — про цельность внутри одного. Некоторые зовут связность «хорошей связанностью» — и к этому мы ещё вернёмся.