У меня есть интерфейс, который имеет только одну реализацию. Следующая пара представляет собой простой объект java. Я хочу удалить этот интерфейс и напрямую использовать объект. Но я хочу понять, когда это необходимо и почему оно было спроектировано таким образом. Это было сделано, конечно, чтобы не ослабить охват тестирования. Итак, почему в моем проекте есть интерфейс с одной реализацией? Спасибо.Нужен ли мне интерфейс, который имеет только одну реализацию?
ответ
Интерфейс полезен, когда вы можете продлить или изменить проект. Например, если вы запустите проект, сохранив данные в текстовом файле, а затем решите перейти на это из базы данных. Если оба из них являются реализациями одного и того же интерфейса, то замена первого для второго очень проста. Просто случай замены конкретной реализации в классе, который ее использует. Так, например, просто меняя
IStorage storage = new FileStorage();
в
IStorage storage = new DBStorage();
Хотя это может показаться бессмысленным, чтобы иметь интерфейс для одной реализации, это может сэкономить вам много рефакторинга усилий позже.
Я беру только твою последнюю строку в качестве ответа. –
Если у вас есть IDE, который выполняет этот рефакторинг, вы можете изменить это позже (при условии, что у вас есть доступ ко всему источнику, который его использует) –
@PeterLawrey Вы предлагаете заменить хорошие методы кодирования на функцию в среде IDE? Это звучит неплохо. Что делать, если вы хотите вернуться к FileStorage или добавить третий тип хранилища? Или, возможно, пользователь может выбрать тип хранилища. Извлечение деталей и реализации, чтобы база базового кода не нуждалась в изменении, была бы лучшим подходом ИМО. – Despertar
Если вы определяете интерфейс для реализации и используете интерфейс в своей программе, вы всегда можете написать новую реализацию и заменить ее на более старую, не меняя код классов, которые ее используют.
Лучше всего использовать интерфейс не в реализации, так как изменение требований менее вредно.
Если вы выполняете юнит-тесты для своего кода (надеюсь, вы это сделаете), есть большая вероятность, что вам нужно будет издеваться над использованием вашего класса с некоторой реализацией заглушки. Итак, вам нужен интерфейс, по крайней мере, для модульных тестов.
P.S. Я знаю, что современные издевательские структуры, такие как Mockito, могут делать издевательства на основе классов, поэтому технически вы можете достичь этого без интерфейсов. Но (для меня) это похоже на хак, поскольку это именно то место, где должен использоваться интерфейс.
зависит от цели. Но это не такая уж плохая идея.
В C и во многих версиях Pascal разделяющий интерфейс от реализации - это привычная практика. Это помогает компилятору избежать ненужной перекомпиляции модулей, когда реализация, от которой они зависят, изменяется.
В Java компилятор обычно не беспокоится. Java предоставляет общедоступные, защищенные, частные и закрытые (неявные) классы доступа, которые ограничивают, насколько другие классы могут зависеть от деталей конкретного класса. Javadoc предоставляет (по умолчанию) документацию, которая опускает ненужные и ненужные детали. У нас также есть широко распространенный принцип YAGNI: если «вам это не понадобится», не создавайте его.
Тем не менее, использование явного интерфейса в Java, а не использование реализации напрямую, дает дополнительную возможность четко понять, какую структуру и поведение должны влиять пользователи определенного класса. Возможность реализации нескольких интерфейсов означает, что пользователи определенного класса могут даже определять зависимость от одного или нескольких конкретных аспектов реализации, таких как ее Serializable nature.
Иногда вы считаете, что использование интерфейса будет полезно, когда окажется, что у вас есть только одна реализация. Это не всегда плохо, но иногда это просто пустая трата усилий.
Из принципов YAGNI
Всегда реализовать вещи, когда вы на самом деле нуждаетесь в них, никогда, когда вы только предвидеть, что вы нуждаетесь в них.
- 1. Нужен ли мне интерфейс, если есть только одна реализация?
- 2. Зачем мне нужен интерфейс?
- 3. Зачем мне нужен интерфейс запроса?
- 4. Имеет ли Dictionary.Equals() реализацию?
- 5. Интерфейс, который влечет за собой реализацию индексатора
- 6. Является ли Nutiteq инструментом, который мне нужен
- 7. Нужен ли мне JDK или только JRE?
- 8. Нужен ли мне JSframework?
- 9. Нужен ли мне ОРМ?
- 10. Зачем мне нужен альтернативный интерфейс USB без конечных точек?
- 11. Нужен ли мне синглтон?
- 12. Нужен ли мне буфер?
- 13. Нужен ли мне доморощенный?
- 14. Нужен ли мне куб?
- 15. Prototype Pattern, зачем мне нужен интерфейс?
- 16. Как вызвать конкретный метод интерфейса, который имеет множественную реализацию
- 17. Нужен ли мне hiveserver2?
- 18. Нужен ли мне виртуальный?
- 19. Нужен ли мне подзаголовок?
- 20. Нужен ли мне контроллер навигации?
- 21. Хотите узнать, нужен ли мне интерфейс serializable или нет?
- 22. Когда мне действительно нужен интерфейс InamingContainer?
- 23. мне нужен ++ интерфейс C на S4s сервер
- 24. Нужен ли мне специальный конвертер?
- 25. Нужен ли мне шлюз API
- 26. DataGridView, который всегда имеет одну строку, выбранную
- 27. Получение пользователя, который имеет только одну роль в SQL Server
- 28. Нужен ли мне ASP.NET MVC?
- 29. Как загрузить файл, который мне нужен? PHP
- 30. Нужен ли мне докерный рой?
Вы хотите показать нам код или упрощенную версию кода? –
Почему что-то конкретное в вашем коде, только один человек может рассказать вам ... и это программист вашего кода. Почему бы не спросить этого человека, почему они сделали то, что сделали? –
Потому что этот человек был либо блестящим, либо ужасным на Java. (нужен еще код) – Zyerah