теория

Модуль — это граница знания

Гена не то чтобы неправ — папки и правда есть. Только папка ничего не охраняет: в неё лезут из шести мест, и она не возражает. Давай спокойно разберёмся, чем настоящий модуль отличается от каталога в дереве файлов.

— это не про красоту структуры. Это способность системы меняться. Модульный дизайн раздвигает возможности системы за пределы сегодняшних требований: будущая фича не обязана работать «из коробки», но должна достигаться разумными усилиями. Чем жёстче система, тем меньше давления новых требований она держит — и тем вернее трещит по швам.

Так что же такое модуль? Не рамка вокруг куска кода, а назначение ответственности. Практические признаки: модуль делает самодостаточную работу, доступную остальным через публичный интерфейс, и в принципе мог бы компилироваться отдельно. Форма границы не важна: сервис, библиотека, неймспейс, класс, даже одна функция. Модули вложены друг в друга — «черепахи до самого низа»: модульный сервис состоит из модульных пакетов, те — из модульных классов.

У любого модуля три фундаментальных свойства:

СвойствоОтвечает на вопросТип знания
Function (функция)что модуль делает — публичный интерфейсявное, наружу
Logic (логика)как это сделаноскрытое внутри
Context (контекст)где и при каких условиях он работаетпубличное, но менее явное

Контекст коварен именно неявностью: версия рантайма, объём памяти, «вызовы уже авторизованы», «сервер в UTC». Чем яснее он проговорён — тем меньше сюрпризов, когда модуль переиспользуют.

А как резать систему на модули? Тут есть поучительная история. В конце 1960-х работу делили на «модули» в надежде, что части потом сойдутся сами, а правки будут задевать одну из них. Не вышло ни того, ни другого: интерфейсы получились сложными, а изменения задевали всех разом. Ответ на эту боль — принцип : хороший модуль прячет решения, которые, скорее всего, придётся пересмотреть. Тогда пересмотр останется внутри одной границы, а не пойдёт каскадом по всей системе.

Вот и вся суть: модуль — это граница знания. Function — знание, отданное наружу; logic — знание, запертое внутри; context — знание модуля о своей среде. Хороший модуль прячет максимум и делится ровно тем минимумом, который нужен остальным, чтобы с ним работать.

← назад