2013-04-25 3 views
4

У меня есть интерфейс, который имеет только одну реализацию. Следующая пара представляет собой простой объект java. Я хочу удалить этот интерфейс и напрямую использовать объект. Но я хочу понять, когда это необходимо и почему оно было спроектировано таким образом. Это было сделано, конечно, чтобы не ослабить охват тестирования. Итак, почему в моем проекте есть интерфейс с одной реализацией? Спасибо.Нужен ли мне интерфейс, который имеет только одну реализацию?

+0

Вы хотите показать нам код или упрощенную версию кода? –

+0

Почему что-то конкретное в вашем коде, только один человек может рассказать вам ... и это программист вашего кода. Почему бы не спросить этого человека, почему они сделали то, что сделали? –

+2

Потому что этот человек был либо блестящим, либо ужасным на Java. (нужен еще код) – Zyerah

ответ

10

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

IStorage storage = new FileStorage(); 

в

IStorage storage = new DBStorage(); 

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

+4

Я беру только твою последнюю строку в качестве ответа. –

+0

Если у вас есть IDE, который выполняет этот рефакторинг, вы можете изменить это позже (при условии, что у вас есть доступ ко всему источнику, который его использует) –

+1

@PeterLawrey Вы предлагаете заменить хорошие методы кодирования на функцию в среде IDE? Это звучит неплохо. Что делать, если вы хотите вернуться к FileStorage или добавить третий тип хранилища? Или, возможно, пользователь может выбрать тип хранилища. Извлечение деталей и реализации, чтобы база базового кода не нуждалась в изменении, была бы лучшим подходом ИМО. – Despertar

1

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

Лучше всего использовать интерфейс не в реализации, так как изменение требований менее вредно.

0

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

P.S. Я знаю, что современные издевательские структуры, такие как Mockito, могут делать издевательства на основе классов, поэтому технически вы можете достичь этого без интерфейсов. Но (для меня) это похоже на хак, поскольку это именно то место, где должен использоваться интерфейс.

1

зависит от цели. Но это не такая уж плохая идея.

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

В Java компилятор обычно не беспокоится. Java предоставляет общедоступные, защищенные, частные и закрытые (неявные) классы доступа, которые ограничивают, насколько другие классы могут зависеть от деталей конкретного класса. Javadoc предоставляет (по умолчанию) документацию, которая опускает ненужные и ненужные детали. У нас также есть широко распространенный принцип YAGNI: если «вам это не понадобится», не создавайте его.

Тем не менее, использование явного интерфейса в Java, а не использование реализации напрямую, дает дополнительную возможность четко понять, какую структуру и поведение должны влиять пользователи определенного класса. Возможность реализации нескольких интерфейсов означает, что пользователи определенного класса могут даже определять зависимость от одного или нескольких конкретных аспектов реализации, таких как ее Serializable nature.

1

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

Из принципов YAGNI

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

Смежные вопросы