теория

Глубина модуля и две канавы

Раз модуль — это граница, тут же встаёт вопрос: а какая граница хорошая? Ответ, на удивление, красивый: хороший модуль — это . Цель абстракции не в том, чтобы быть размытой, а в том, чтобы создать новый уровень, на котором можно быть абсолютно точным. Слово «машина» передаёт смысл без марки и цвета; интерфейс Save()/Query() — без имени СУБД.

Модули удобно мерить «глубиной». Представь прямоугольник: нижняя грань — интерфейс (function), а площадь — реализация (logic).

  • — узкий интерфейс над большой начинкой: море сложности спрятано за парой методов.
  • — интерфейс размером с реализацию: addTwoNumbers(a, b) не прячет ничего, читать интерфейс и читать код — одно и то же. Такая граница не окупает даже собственного существования.

Абстракция ломается двумя способами:

  1. Лишнее наружу — потребители тащат чужой когнитивный груз, и абстракция перестаёт одинаково хорошо служить всем.
  2. Спрятано существенное — это : чтобы пользоваться модулем правильно, всё равно приходится знать его нутро. Классика — слой доступа к данным, который молчит про транзакции.

А у самой модульности две канавы по обочинам дороги:

  • , «большой ком грязи» — знание раздаётся без разбора, всё важное становится глобальным или продублированным, границы стёрты.
  • — гибкость на все случаи жизни. Чем универсальнее вещь, тем меньше от неё пользы: репозиторий, готовый ответить на любой мыслимый запрос, тяжелее и в использовании, и в оптимизации. Каждое предположение о будущем — ставка против будущего; хороший модуль выставляет наружу лишь разумные степени свободы. Преждевременная гибкость — та же сложность, просто купленная добровольно.

И последняя ловушка, самая тонкая. Даже система из идеально глубоких модулей не обязана быть модульной. Возьми два безупречных модуля, внутри которых живёт одно и то же бизнес-правило, — они должны меняться вместе, но однажды разъедутся. Модульность не видна в отдельном модуле; она живёт между ними: говорит, каким знанием делятся компоненты, а — насколько содержимое одного модуля принадлежит самому себе. Не путать: связанность — про связи между модулями, связность — про цельность внутри одного. Некоторые зовут связность «хорошей связанностью» — и к этому мы ещё вернёмся.

← назад