Программирование на основе интерфейсов: пишете ли вы интерфейсы для всех классов вашего домена? - PullRequest
23 голосов
/ 30 сентября 2008

Я согласен, что программирование на основе интерфейсов является хорошей практикой. В большинстве случаев в Java «интерфейс» в этом смысле означает интерфейс языковой конструкции, так что вы пишете интерфейс и класс реализации и большую часть времени используете интерфейс вместо класса реализации.

Интересно, будет ли это хорошей практикой и для написания моделей предметной области? Так, например, если у вас есть клиент класса домена и у каждого клиента может быть список заказов, вы бы обычно также писали интерфейсы ICustomer и IOrder. А также у Клиента будет список IOrders вместо Orders? Или вы бы использовали интерфейсы в доменной модели, только если она действительно управляется доменом, например у вас есть как минимум два разных типа заказов? Другими словами, будете ли вы использовать интерфейсы только из-за технических потребностей в модели предметной области или только в тех случаях, когда это действительно уместно в отношении фактической предметной области?

Ответы [ 15 ]

1 голос
/ 30 сентября 2008

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

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

1 голос
/ 30 сентября 2008

Даже если вы почти уверены, что будет только один конкретный тип объекта модели, использование интерфейсов несколько упрощает макетирование и тестирование (но в наши дни существуют фреймворки, которые могут помочь вам автоматически генерировать фиктивные классы, даже для конкретных Java-классы - Mockito, JTestR, Spring, Groovy ...)

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

1 голос
/ 30 сентября 2008

Мы в основном пишем веб-приложения с использованием Wicket, Spring и Hibernate, и мы используем интерфейсы для Spring Beans, например Услуги и DAO. Для этих классов интерфейсы имеют смысл. Но мы также используем интерфейсы для каждого класса домена, и я думаю, что это просто излишество.

1 голос
/ 30 сентября 2008

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

0 голосов
/ 30 сентября 2008

Это еще одна вещь, о которой я говорил, особенно с сгенерированным доменом и объектами DAO. Многие интерфейсы слишком специфичны. Скажем, многие доменные объекты имеют идентификатор и поле состояния. Почему они не используют общий интерфейс? Это вызвало у меня разочарование, излишне плоская (с точки зрения наследования) модель предметной области.

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