Comments 8
С таким громким заголовком я думал сначала написать статью.
С таким громким заголовком вы её и написали.) Простите, не удержался
Примеров бы, в частности часто приводят тезис о том, что для всего и вся определяют интерфейсы для тестирования, для применения моков. Или, еще чаще, что с интерфейсами «правильнее».
А так, да. И люди с парой лет опыта на golang часто не понмают, что единственный случай, когда надо определять интерфейс на стороне пакета и реализации, это когда пакет сам же потребляет свой интерфейс.
А так, да. И люди с парой лет опыта на 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-классы не были бы продуманы изначально, то добавить их в систему потом было бы очень больно.
Забавно, буквально на этой неделе обнаружил за собой грех делать неоправданно мизерные пакеты по привычке, выработанной для модулей F#. И тут ваша статья :-)
Sign up to leave a comment.
Вы используете интерфейсы в Go неправильно!