Я думаю, что название говорит для себя ребята - зачем мне писать интерфейс, а затем реализовать конкретный класс, если только когда-либо будет конкретная реализация этого интерфейса?
Должен ли я по-прежнему кодировать интерфейс, даже если я ТОЛЬКО ЕСТЬ, что у меня будет одна реализация?
Ответ 1
Я думаю, вы не должны;)
Не нужно затенять все классы с помощью соответствующих интерфейсов.
Даже если вы собираетесь делать больше реализаций позже, вы всегда сможете извлечь интерфейс, когда это станет необходимым.
Ответ 2
Это вопрос детализации. Вы не можете загромождать свой код ненужными интерфейсами, но они полезны при границах между слоями.
Когда-нибудь вы можете попробовать протестировать класс, который зависит от этого интерфейса. Тогда приятно, что вы можете издеваться над ним.
Я постоянно создаю и удаляю интерфейсы. Некоторые из них не стоили усилий, а некоторые действительно нужны. Моя интуиция в основном правильная, но некоторые необходимы рефакторинги.
Ответ 3
Вопрос: если будет только одна конкретная реализация, должен ли быть интерфейс?Ответ 4
YAGNI - вам это не понадобится Wikipedia
Согласно тем, кто выступает за подход YAGNI, соблазн написать код, который не нужен на данный момент, но может быть в будущем, имеет следующие недостатки:
* The time spent is taken from adding, testing or improving necessary functionality.
* The new features must be debugged, documented, and supported.
* Any new feature imposes constraints on what can be done in the future, so an unnecessary feature now may prevent implementing a necessary feature later.
* Until the feature is actually needed, it is difficult to fully define what it should do and to test it. If the new feature is not properly defined and tested, it may not work right, even if it eventually is needed.
* It leads to code bloat; the software becomes larger and more complicated.
* Unless there are specifications and some kind of revision control, the feature may not be known to programmers who could make use of it.
* Adding the new feature may suggest other new features. If these new features are implemented as well, this may result in a snowball effect towards creeping featurism.
Ответ 5
Два несколько противоречивых ответа на ваш вопрос:
- Вам не нужно извлекать интерфейс из каждого конкретного класса, который вы создаете, и
- Большинство программистов Java не создают столько интерфейсов, сколько должны.
Большинство систем (даже "код выброса" ) развиваются и изменяются далеко за пределами их первоначального дизайна. Интерфейсы помогают им гибко расти, уменьшая сцепление. В общем, вот предупреждающие знаки, которые вы должны кодировать для интерфейса:
- Вы даже подозреваете, что другому конкретному классу может понадобиться один и тот же интерфейс (например, если вы подозреваете, что ваши объекты доступа к данным могут нуждаться в представлении XML в будущем - что-то, что я испытал)?
- Вы подозреваете, что вашему коду, возможно, придется жить на другой стороне уровня веб-служб?
- Создает ли ваш код сервисный уровень для какого-либо внешнего клиента?
Если вы можете честно ответить "нет" на все эти вопросы, тогда интерфейс может быть излишним. Мог бы. Но опять же, непредвиденные последствия - это название игры в программировании.
Ответ 6
Вам нужно решить, что такое программный интерфейс, указав публичные функции. Если вы не сделаете хорошую работу, класс будет трудно использовать.
Поэтому, если вы решите позже, вам нужно создать формальный интерфейс, вы должны иметь готовый дизайн.
Итак, вам нужно создать интерфейс, но вам не нужно писать его как интерфейс, а затем реализовать.
Ответ 7
Я использую подход, основанный на проверке, для создания моего кода. Это часто приводит меня к созданию интерфейсов, в которых я хочу предоставить макет или фиктивную реализацию как часть моего тестового оборудования.
Обычно я не создавал бы какой-либо код, если он не имеет какой-либо значимости для моих тестов, и поскольку вы не можете легко протестировать интерфейс, это только реализация, которая приводит меня к созданию интерфейсов, если они мне понадобятся при поставке зависимостей для тестового примера.
Я также иногда создаю интерфейсы при рефакторинге, удаляя дублирование или улучшая читаемость кода.
Вы всегда можете реорганизовать свой код, чтобы ввести интерфейс, если вы узнаете, что вам нужно позже.
Единственное исключение для этого было бы, если бы я разрабатывал API для выпуска третьим лицам, где стоимость внесения изменений API высока. В этом случае я могу попытаться предсказать тип изменений, которые мне могут потребоваться в будущем, и разработать способы создания моего API для минимизации будущих несовместимых изменений.
Ответ 8
Одна вещь, о которой еще никто не упоминал, заключается в том, что иногда это необходимо, чтобы избежать проблем с зависимостями. вы можете иметь интерфейс в общем проекте с несколькими зависимостями и реализацию в отдельном проекте с большим количеством зависимостей.
Ответ 9
"Только когда-либо будет одна реализация" == известные последние слова
Это не так дорого, чтобы сделать интерфейс, а затем извлечь из него конкретный класс. Процесс его выполнения может заставить вас переосмыслить ваш дизайн и часто приводит к лучшему конечному продукту. И как только вы это сделаете, если вы когда-нибудь будете есть эти слова - как это часто бывает, вам не придется беспокоиться об этом. Вы уже настроены. Если в противном случае у вас есть куча рефакторинга, и это будет боль.
Отредактировано для уточнения: я работаю над предположением, что этот класс будет распространяться относительно далеко и широко. Если это крошечный класс полезности, используемый одним или двумя другими классами в одном пакете, тогда да, не беспокойтесь об этом. Если это класс, который будет использоваться в нескольких пакетах несколькими другими классами, тогда мой предыдущий ответ будет применен.
Ответ 10
Вопрос должен быть: "Как вы можете быть уверены, что только одна конкретная реализация будет реализована?"
Как вы можете быть абсолютно уверены?
К тому времени, как вы это продумали, вы уже создали интерфейс и будете на своем пути без предположений, которые могут оказаться неправильными.
С сегодняшними инструментами кодирования (такими как Resharper) на самом деле не требуется много времени для создания и поддержки интерфейсов рядом с вашими классами, тогда как обнаружение того, что теперь вам нужна дополнительная реализация и заменить все конкретные ссылки, может занять много времени время и вообще не забава - поверьте мне.
Ответ 11
Многое из этого взято из разговора Рэнсбергера в InfoQ: http://www.infoq.com/presentations/integration-tests-scam
Есть 3 причины иметь класс:
- Он содержит некоторое значение
- Это помогает сохранить некоторую сущность.
- Он выполняет некоторые службы
Большинство служб должны иметь интерфейсы. Он создает границу, скрывает реализацию, и у вас уже есть второй клиент; все тесты, которые взаимодействуют с этой службой.
В принципе, если вы когда-либо захотите сделать Mock в unit test, он должен иметь интерфейс.