Программирование на основе интерфейсов: пишете ли вы интерфейсы для всех классов вашего домена?

Используйте FileSystemWatcher. Вы можете фильтровать только события модификации.

23
задан cretzel 30 September 2008 в 07:34
поделиться

15 ответов

Написание интерфейсов «просто потому, что» кажется мне пустой тратой времени и энергии, не говоря уже о нарушении принципа KISS.

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

26
ответ дан Rik 30 September 2008 в 07:34
поделиться

* Я делаю это, потому что мне это нужно для создания прокси моих доменных объектов.

1
ответ дан Wouter Lievens 30 September 2008 в 07:34
поделиться

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

1
ответ дан cretzel 30 September 2008 в 07:34
поделиться

Написание интерфейса до того, как он понадобится (либо для тестирования, либо для архитектуры), является излишним.

Кроме того, написание интерфейса вручную - пустая трата времени. Вы можете использовать рефакторинг Resharper «Pull Members», чтобы позволить ему создать новый интерфейс из определенного класса в считанные секунды. Другие инструменты рефакторинга, которые интегрируются с IDE, также должны иметь аналогичную функциональность.

2
ответ дан Rinat Abdullin 30 September 2008 в 07:34
поделиться

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

Довольно просто в IDEA / eclipse превращать конкретный класс в интерфейс, когда вы решите, что он вам нужен.

Затем используйте внедрение зависимостей с помощью Spring или Guice , если у вас есть много реализаций интерфейса для внедрения в места в вашем коде, которые вы используете «new»

4
ответ дан James Strachan 30 September 2008 в 07:34
поделиться

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

Это, конечно, не означает, что нужно избегать использования интерфейсов в доменных объектах. Используйте там, где это необходимо. Например, в последнее время я работал над веб-приложением, в котором разные типы доменных объектов соответствуют страницам с постоянными ссылками, в которых пользователи могут оставлять комментарии. Итак, каждый из этих доменных объектов теперь реализует интерфейс «Commentable». Весь код, основанный на комментариях, затем программируется в интерфейсе Commentable, а не в доменных объектах.

5
ответ дан bpapa 30 September 2008 в 07:34
поделиться

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

12
ответ дан Eran Galperin 30 September 2008 в 07:34
поделиться

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

1
ответ дан Matt H 30 September 2008 в 07:34
поделиться

Интерфейсы являются отличным способом выделения компонентов для целей модульного тестирования и общего управления зависимостями. Сказав это, я часто предпочитаю абстрактные классы, поэтому, по крайней мере, часть общего поведения выгружается туда, а не заставляет некоторые дубликаты, которые приносят интерфейсы. Современные IDE позволяют быстро и легко создавать интерфейсы, поэтому они не , что много работают: -)

8
ответ дан Phil Bennett 30 September 2008 в 07:34
поделиться

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

0
ответ дан Matt H 30 September 2008 в 07:34
поделиться

Мы извлекаем интерфейсы из всего просто, потому что это помогает в тестировании (насмешки) и для материала как AOP. Eclipse может сделать это автоматически: осуществите рефакторинг-> Интерфейс Извлечения.

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

1
ответ дан MetroidFan2002 30 September 2008 в 07:34
поделиться

Запись интерфейсов для доменных классов может иметь смысл при использовании его для поблочного тестирования. Мы используем Фиктивные объекты в поблочном тестировании. Так, если у Вас есть интерфейс для объекта области, и Ваш объект области сам не готов, но Ваш клиент может протестировать его использование интерфейса справкой фиктивных объектов.

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

1
ответ дан anjanb 30 September 2008 в 07:34
поделиться

Я думаю, что главной причиной для программирования против интерфейсов является тестируемость. Следовательно, для объектов области - просто придерживаются POJOs или POC#Os:) и т.д., т.е. просто мешают Вашим классам добавлять любую определенную платформу так для предотвращения их от различной сборки и зависимостей во время выполнения, и это - все. Создание интерфейсов для ДАО является хорошей идеей все же.

1
ответ дан martinsb 30 September 2008 в 07:34
поделиться

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

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

1
ответ дан Lars Westergren 30 September 2008 в 07:34
поделиться

На самом деле, этот вопрос является примером распространенного заблуждения о «программировании против интерфейсов».

Видите ли, это очень хороший принцип, но он действительно не означают то, что многие люди думают!

«Программа для интерфейса, а не реализация» (из книги GoF) означает именно это, а не то, что вы должны изо всех сил стараться изо всех сил, чтобы создать отдельных интерфейсов для всего. Если у вас есть объект ArrayList , объявите тип переменной / поля / параметра / возвращаемого значения как имеющий тип List . Тогда клиентский код будет иметь дело только с типом интерфейса.

В книге Джошуа Блоха «Эффективная Java» принцип выражен более четко в «Правиле 52: Обращайтесь к объектам по их интерфейсам». interface, если подходящий интерфейс не существует.

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

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

4
ответ дан 29 November 2019 в 01:00
поделиться
Другие вопросы по тегам:

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