Есть ли смысл в интерфейсе, если его реализует только один класс? - PullRequest
9 голосов
/ 18 мая 2010

Глядя на (зрелую) базу кода на моей новой работе, есть интерфейс, и только один класс реализует его (насколько я могу судить). Можно / нужно избавиться от интерфейса?

Ответы [ 8 ]

8 голосов
/ 18 мая 2010

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

4 голосов
/ 18 мая 2010

В дополнение к уже полученным хорошим ответам - если в какой-то момент в будущем этот класс нужно будет смоделировать для целей тестирования, сделать это будет намного проще, когда уже доступен интерфейс!

3 голосов
/ 18 мая 2010

Сегодня нет. Через шесть месяцев после того, как проект вырос в десять раз по сложности? Кто знает. На ваш взгляд, если это унаследованный код, то интерфейс, который реализован один раз, не имеет большого значения, но также нет смысла проходить рефакторинг, связанный с его удалением. «Если это работает, не исправляй».

2 голосов
/ 18 мая 2010

Поскольку вы упоминаете зрелую базу, я бы хотел привести еще один пример из реальной жизни: Сессия Hibernate.

Session - это интерфейс, реализованный только одним классом: SessionImpl . Однако, если вы использовали спящий режим в прошлом или читали его исходный код, вы, вероятно, заметили, как Session используется везде вместо SessionImpl.

Это неправильный дизайн? Определенно нет. Это называется «принцип замещения» или «программирование на интерфейсы». Это означает, что, используя интерфейс вместо реализации, вы можете расширить свой код без каких-либо усилий, просто создав соответствующие экземпляры новых классов, но всегда используя интерфейс. Будет ли все еще неправильно, если никто не создаст новый класс, реализующий Session? Нет, все еще не так.

Мои два цента.

1 голос
/ 25 мая 2010

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

0 голосов
/ 18 мая 2010

Даже если люди не совсем согласны с количеством ошибок на 1000 строк кода, эти два кажутся коррелированными (https://stackoverflow.com/questions/862277/what-is-the-industry-standard-for-bugs-per-1000-lines-of-code). Меньше строк == меньше ошибок.

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

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

0 голосов
/ 18 мая 2010

Помимо причин, приведенных в других ответах, только реализация интерфейса позволяет перехватывать методы путем создания прокси-серверов без использования инструментария. Это используется для регистрации, инкапсуляции операций в транзакции и т. Д. Используется несколькими платформами.

0 голосов
/ 18 мая 2010

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

...