Вопрос по java – Должны ли интерфейсы быть размещены в отдельном пакете? [закрыто]

67

Я новичок в команде, работающей над довольно большим проектом, с большим количеством компонентов и зависимостей. Для каждого компонента естьinterfaces пакет, в котором размещены открытые интерфейсы для этого компонента. Это хорошая практика?

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

Почему это помечено [не зависит от языка]? finnw

Ваш Ответ

2   ответа
85

похоже, не является проблемой.

Возьмем, к примеру, Java API - большинство классов имеют оба интерфейса и их реализации, включенные в один и тот же пакет.

Возьмите напримерjava.util пакет:

Он содержит такие интерфейсы, какSet, Map, List, в то же время имея такие реализации, какHashSet, HashMap а такжеArrayList.

Кроме того, Javadocs спроектированы так, чтобы хорошо работать в этих условиях, поскольку они разделяют документацию на Интерфейсы а также Классы просмотров при отображении содержимого пакета.

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

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

Префикс имени интерфейса сI. Этот подход используется с интерфейсами в .NET Framework. Было бы довольно легко сказать, чтоIList - это интерфейс для списка.

Использовать able суффикс. Этот подход часто встречается в Java API, например,Comparable, Iterable, а такжеSerializable назвать несколько

+ 1, хотя я бы не рекомендовал соглашение об именовании I *, если вы не в .NETverse, и даже тогда только для согласованности CurtainDog
Он также часто используется в экосистеме Eclipse. Simon Nickerson
У меня есть приложение, которое выбирает между двумя пакетами во время сборки (варианты сборки для поддержки разного оборудования), каждый из которых предоставляет разные классы, реализующие один и тот же интерфейс. Это означает, что каждый пакет и приложение должны иметь возможность ссылаться на один и тот же интерфейс. Мне нравится этот ответ и ход мыслей, но я ищу способ применить этот подход к моей ситуации. У кого-нибудь есть комментарии по этому поводу? ThePartyTurtle
Я использовал это соглашение в коде Java и нашел его полезным ... YMMV hhafez
Я знаю, что это довольно старое, но сейчас я предложил однозначно назвать интерфейс и назвать реализацию более строгой. например Интерфейс = Реализация магазина = StoreImpl Главным образом, чтобы подчеркнуть, что интерфейс должен использоваться поверх реализации. frostymarvelous
17

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

Давайте посмотрим на этот конкретный экземпляр.

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

Таким образом, это пахнет правилом без веской причины: оно принимает решение, основываясь на том, что что-то является публично видимым, и это решение никак не влияет на то, что публично видно.

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

Приведите тег «Java» к вопросу - что означает « Публично выставленный пакет 'в Java? Или ваш ответ не специфичен для Java? Я думал, что только члены пакета (такие как классы, интерфейсы и их члены), а не сами пакеты, имеют спецификаторы контроля доступа, такие как «public», «private» и т. Д. (Это обсуждается далее @ question / Stackoverflow.com вопросы / 4388715 / ...) bacar

Похожие вопросы