Pull to refresh

Comments 8

С таким громким заголовком я думал сначала написать статью.

С таким громким заголовком вы её и написали.) Простите, не удержался
Примеров бы, в частности часто приводят тезис о том, что для всего и вся определяют интерфейсы для тестирования, для применения моков. Или, еще чаще, что с интерфейсами «правильнее».
А так, да. И люди с парой лет опыта на golang часто не понмают, что единственный случай, когда надо определять интерфейс на стороне пакета и реализации, это когда пакет сам же потребляет свой интерфейс.

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

Поэтому разбиение на пакеты неожиданно становится очень важным для того, чтобы вы могли эффективно разрабатывать большие приложения.

Мне как-то казалось что это вообще очень важная штука вне зависимости от языка. Что до циклических зависимостей — это такой хороший признак того что у нас что-то не так с разбивкой на модули. Есть еще такой принцип — Acyclic Dependencies Principle.


Они все относятся к HTTP и было было бы нелогично разбивать их на несколько пакетов.

Повышаем Cohesion.


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

Применяем Dependency Inversion Principle, соблюдаем Abstract Dependency Principle, Stable Dependency Principle.


Если все это заставляет делать банальное "не плодить циклических зависимостей" — ну ладно, хороший мотиватор на уровне ограничений языка. Но что-то мне подсказывает что все дело в старом добром структурном дизайне.

UFO just landed and posted this here
Я думал, добавлять ли Java, потому что формально она и правда подходит. Но там все-таки не доведено всё до конца. Например, функция printf не может напечатать в байтовый буфер, а только на экран. Ну все эти Stream-интерфейсы не выглядят «почти бесплатными» — в стандартную библиотеку io.Reader, io.Writer и т.д. были добавлены не сразу, и переделывать много кода при этом не пришлось. В Java, если бы все эти *Stream-классы не были бы продуманы изначально, то добавить их в систему потом было бы очень больно.
UFO just landed and posted this here

Забавно, буквально на этой неделе обнаружил за собой грех делать неоправданно мизерные пакеты по привычке, выработанной для модулей F#. И тут ваша статья :-)

Sign up to leave a comment.

Articles