2010-03-09 6 views
10

Я создаю модель домена в своей системе. При проектировании объектов модели я должен создавать интерфейсы для каждого объекта объекта? Люди сказали мне, что наш веб-уровень не должен заботиться о реализации сущности, и мы должны иметь возможность менять реализации, но я не уверен, что это произойдет.Должны ли объекты модели иметь интерфейсы?

Например, если у нас есть класс Учитель, который ведет список студентов, метод getStudents может быть либо:

public List<Student> getStudents() { 
     return this.students; 
} 

или это:

public List<Student> getStudents() { 
    return someExternalService.retrieveStudents(); 
} 

Я понимаю это преимущество, но Какова общая практика?

+0

«общая практика» не обязательно совпадает с «хорошей практикой», особенно когда речь идет о дизайне OO :) – skaffman

+3

Я не получу ваш пример. Возникает вопрос, должен ли Учитель внедрять какой-либо интерфейс или использовать зависимость через интерфейс? У меня разные ответы на эти два случая. Ваш текст заставляет меня думать, что вы думаете о первом, но пример заставляет меня думать, что вы хотите последнего. Что это? –

+0

Martinho, мой вопрос заключается в том, должен ли Учитель реализовывать интерфейс и иметь результирующие классы TeacherImpl. – sma

ответ

7

Если у вас нет оснований думать, что вам нужно будет заменить модель, я бы не стал беспокоиться об этом. Основываясь на принципе YAGNI (You ain't gonna need it)

+0

Спасибо за ответ. Я согласен с обоими. На самом деле у меня есть последующее решение, которое я опубликую как отдельный вопрос. Он включает моделирующие ассоциации. – sma

+4

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

+0

@Noel - Я думаю, что вы правы в своем происхождении, но я думаю, что это может быть полезно избежать чрезмерной инженерии. Я несколько раз встречался с тем, чтобы сказать кому-то: «Тебе это не понадобится», и они могут либо опровергнуть ваше заявление, либо сделать хороший аргумент для добавления, либо они считают, что они не могут его оправдать и решить/реализовать на самом деле это не требование. Я согласен, что в этом случае нет никакого большого вреда в добавлении интерфейсов, но это может привести к добавлению большего количества кода «на всякий случай». – David

2

Ни один из проектов, которые я когда-либо видел или не участвовал, имел интерфейсы для объектов домена.

Но в одном из моих проектов, я имел интерфейс NamedEntity:

public interface NamedEntity { 
    int getId(); 
    String getName(); 
} 

Все объекты домена реализовали этот интерфейс. Это дало мне возможность не создавать разные jsf-конвертеры для разных объектов, а создавать один конвертер, который использовал этот интерфейс вместо конкретных классов домена.

+0

Красивый пример. Nitpick: вы говорите, что ни один из проектов, которые вы видели или не участвовали, не имел этого феномена, а затем вы быстро представили пример одного ... –

+0

Эта upvote выявила ошибку (или просто нечеткое поведение) в подсчете репутации SO. – Roman

+0

Согласен. Я действительно не хочу иметь никакого интерфейса, но другие не согласны. – sma

1

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

Речь идет о формализации интерфейса в качестве основы для документации и контрактов.

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

+0

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

0

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

Два случая я могу думать сразу, где я бы рассмотреть вводящие интерфейсы:

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

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

+0

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

1

Я думаю, что существует важное различие между интерфейсом для службы для извлечения объекта и самого объекта модели.

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

Единственная причина, по которой объекты модели имеют интерфейсы, имеет смысл, если объект модели - это не просто простой тип объекта, а объект, который также предоставляет какое-то поведение.

0

Извлечение интерфейса является одним из простейших рефакторингов; В худшем случае это метод переименования класса -> move. Усилие передумать, как только вы нашли причину этого, минимально. Я всегда находил, что если решение легко изменить, это еще больше усиливает YAGNI и KISS. Контр-аргумент состоит в том, что изначально не так сложно создать интерфейс, что верно, но обслуживание со временем увеличивается, если решение принимается много раз - часто не используется.