Bezdepbonusu7Программирование: статьи и ответы

Вопрос

(Программирование интерфейса против работы с конкретным классом), когда есть только один конкретный класс

Автор вопроса: user170272Ответов: 6

В объектно-ориентированном компоненте, когда у вас есть только одна реализация, доступная для класса, и этот класс не "опубликован" для других компонентов, целесообразно ли иметь интерфейс и вместо этого работать с интерфейсом?

Я полностью ознакомлен с принципом проектирования "программирование для интерфейса", а также широко его использую.

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

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

Что вы думаете?

  • Возможный обман - stackoverflow.com/questions/720115/ Nate 08.09.2009

javaoopdesign-principles

Ответы

Ответ 1 · Buhb

Насколько мне известно, есть три ситуации, когда использование интерфейса оправдано:

  1. Это часть архитектуры (я признаю, что она не очень четко определена).
  2. У вас более 1 реализации.
  3. Это общедоступный интерфейс.

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

Ответ 2 · рейтинг 13 · Joseph

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

Это не всегда будет целесообразно, но об этом стоит подумать, когда вы пытаетесь решить. Как вы думаете, вам нужно тщательно протестировать этот класс/объект? Если вы думаете, что будете, может быть намного проще иметь дело с интерфейсом, а не с конкретным классом.

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

Ответ 3 · рейтинг 6 · Andrew Hare

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

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

Ответ 4 · рейтинг 3 · Kevin

Интерфейсы должны развиваться, а не создаваться. У вас должна быть конкретная потребность в интерфейсе, прежде чем создавать его. Если вам не нужно более одной реализации, вам не нужен интерфейс. Всегда помните, YAGNI

Ответ 5 · Nate

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

Ответ 6 · O'Rooney

Как правило: нет. Вам не нужен интерфейс, если вы просто внедряете функциональность один раз. У интерфейсов, как и у всего, есть компромисс: они требуют дополнительной работы (стоимости) и могут приносить дополнительные преимущества. Если затраты перевешивают выгоду, вам, вероятно, не стоит этого делать!

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы