Каков стандартный способ организации содержимого пакетов Java - в частности, расположение интерфейсов и абстрактных классов - PullRequest
3 голосов
/ 11 июня 2010

Полагаю, это могло бы пойти на многие ОО языки. Я строю свои доменные объекты и не уверен, где лучше всего найти интерфейсы и абстрактные классы.

Если у меня есть пакет pets с различными реализациями абстрактного класса APet: он должен жить рядом с ними или в родительском пакете?

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

, например

com.foo
com.foo.IConsumer (interface)
com.foo.APet (abstract)
com.foo.pets.Dog extends APet implements IConsumer

OR

com.foo
com.foo.IConsumer (interface)
com.foo.pets.APet (abstract)
com.foo.pets.Dog extends APet implements IConsumer

или что-то еще?

Ответы [ 3 ]

3 голосов
/ 11 июня 2010

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

Так что я бы выбрал что-то вроде первого выбора.

0 голосов
/ 11 июня 2010

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

com.foo.APet (Abstract Class)
com.foo.pets.ADog extends com.foo.APet (Also Abstract)
com.foo.pets.impl.Westie extends ADog (not abstract).

В этом случае APet находится на вершине, поскольку предоставляет возможности, общие для всех домашних животных.ADog, безусловно, домашнее животное, но содержит те вещи, которые являются общими для всех собак.Классы в пакете impl производятся фабрикой или чем-то еще, и специализируются на основе породы.

0 голосов
/ 11 июня 2010

Это вопрос личного стиля, но мне нравится (и я видел, как другие используют) структуру, в которой ваши интерфейсы и базовые или final классы находятся в самом пакете, а классы реализации в ". Импл "субпакет. Например, у вас будет пакет Pets с интерфейсами Bird, Fish, Mammal и Reptile и, возможно, ваши базовые классы, реализующие эти интерфейсы. Тогда у вас будет пакет Pets.Impl со специальными классами для Goldfish, Canary, Collie, что угодно. Таким образом, вы можете дать людям Bird и не беспокоиться о том, что они будут жаловаться, что он не откладывает золотые яйца, так как это деталь реализации, характерная для волшебных гусей. :)

...