Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 8

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

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

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

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

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


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

Повышаем Cohesion.


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

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


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

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

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации