В объектно-ориентированном компоненте, когда у вас есть только одна реализация, доступная для класса, и этот класс не "опубликован" для других компонентов, целесообразно ли иметь интерфейс и вместо этого работать с интерфейсом?
Я полностью ознакомлен с принципом проектирования "программирование для интерфейса", а также широко его использую.
В последнее время я заметил, что большую часть времени другая реализация (хотя возможная и имеющая смысл) никогда не требуется. В результате постоянной работы с интерфейсами код приложения будет иметь достаточное количество интерфейсов с одной реализацией для каждого, и интерфейс кажется своего рода накладным.
Вместо этого предпочтительнее просто работать с конкретным классом и вводить интерфейс только тогда, когда требуется вторая реализация? В любом случае, в настоящее время извлечь интерфейс с помощью IDE очень просто. И когда вводится новый интерфейс, ссылки на старый конкретный класс могут быть изменены, чтобы вместо этого использовать новый интерфейс.
Что вы думаете?
Ответ 1 · Buhb
Насколько мне известно, есть три ситуации, когда использование интерфейса оправдано:
- Это часть архитектуры (я признаю, что она не очень четко определена).
- У вас более 1 реализации.
- Это общедоступный интерфейс.
Не бойтесь использовать конкретные классы. Не создавайте механически интерфейс для каждого отдельного класса.
Ответ 2 · рейтинг 13 · Joseph
Одна из причин, по которой я продолжаю программировать интерфейс даже с одной реализацией, заключается в том, что это делает написание моих тестов намного проще. Я могу настроить прокси для тестирования всего, что хочу, и мне не нужно беспокоиться о жесткой связи.
Это не всегда будет целесообразно, но об этом стоит подумать, когда вы пытаетесь решить. Как вы думаете, вам нужно тщательно протестировать этот класс/объект? Если вы думаете, что будете, может быть намного проще иметь дело с интерфейсом, а не с конкретным классом.
Альтернативой этому было бы не использовать интерфейс и создать подкласс конкретного класса, что тоже работает, но опять же зависит.
Ответ 3 · рейтинг 6 · Andrew Hare
Создание интерфейсов для конкретных типов - это деликатное балансирование, поскольку вы можете легко создать взрыв интерфейса, который не принесет никакой пользы и только усложнит доменное пространство избыточными типами.
Мое эмпирическое правило заключается в том, чтобы создавать интерфейсы только для типов, которые являются частью общедоступного API. Все типы, предназначенные для реализации API и никогда не предоставляемые из API, не нуждаются в интерфейсе.
Ответ 4 · рейтинг 3 · Kevin
Интерфейсы должны развиваться, а не создаваться. У вас должна быть конкретная потребность в интерфейсе, прежде чем создавать его. Если вам не нужно более одной реализации, вам не нужен интерфейс. Всегда помните, YAGNI
Ответ 5 · Nate
В дополнение к уже данным хорошим ответам (простота тестирования и общедоступные API) мне нравится использовать интерфейсы, потому что это позволяет легче сосредоточиться на том, "что" должны делать ваши классы, чем на том, "как" они это делают.
Ответ 6 · O'Rooney
Как правило: нет. Вам не нужен интерфейс, если вы просто внедряете функциональность один раз. У интерфейсов, как и у всего, есть компромисс: они требуют дополнительной работы (стоимости) и могут приносить дополнительные преимущества. Если затраты перевешивают выгоду, вам, вероятно, не стоит этого делать!