Вероятное чрезмерное использование java-интерфейсов в моей реализации Ms. Pac-Man

Я программист на Java последние 6 лет, а с начала этого года заинтересовался программированием игр. Итак, я подумал, что было бы неплохо начать с популярной игры, и реализовал игру Ms. Pac-Man на Java. Я могу сказать, что моя реализация выглядит примерно на 90% похожей на оригинальную игру, и я старался использовать как можно больше шаблонов проектирования и лучших практик, поскольку это был всего лишь личный проект по обучению кодированию базовых 2D-игр.

Теперь, когда я закончил кодирование, я понял, что у меня 19 интерфейсов и всего 17 классов! Так что я начинаю задаваться вопросом, не злоупотребляю ли я интерфейсами.

Вот пример нескольких классов / интерфейсов, которые я использую:

Класс - FullGame (реализует FullGameInterface и FullGameObservable)

Класс - View1 (реализует FullGameObserver)

Интерфейс - FullGameInterface (основные методы работы: возобновление, пауза, воспроизведение и т. д.)

Интерфейс - FullGameObservable (позволяет регистрировать просмотры для уведомления об обновлении)

Интерфейс - FullGameObserver (реализовано 2 разных представления игры для получения уведомлений)

Я злоупотребляю интерфейсами?

Каково твое мнение?


person David Robles    schedule 02.10.2009    source источник
comment
чрезмерное использование интерфейсов - действительно субъективная вещь - см. stackoverflow.com/questions/956011/useless-interfaces и stackoverflow.com/questions/90851 / есть пара примеров.   -  person Nate    schedule 02.10.2009


Ответы (4)


Интерфейсы хорошие. Их много - не проблема.

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

person PanCrit    schedule 02.10.2009
comment
если в реализациях больше методов, чем в интерфейсах, то интерфейсы служат цели. Я нашел 4 реализации с тем же количеством методов, что и в их интерфейсах, поэтому я просто удалил интерфейсы, и это выглядит намного лучше . Спасибо - person David Robles; 03.10.2009
comment
Мне кажется немного странным удалять класс просто потому, что он не добавляет частные методы к его экземпляру ... Два класса могут иметь одинаковое количество кода, но это другая реализация. Это допустимое использование интерфейса - person Don Cheadle; 13.02.2015

Используйте интерфейс, если хотите изменить реализацию.

Для чего-то вроде вашего объекта FullGame вам, вероятно, не нужен интерфейс.

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

РЕДАКТИРОВАТЬ 2: усложняйте код только тогда, когда вам нужно. Если вы думаете, что вам нужен интерфейс, сначала остановитесь. Используйте уже имеющийся у вас класс. (Но пока вы его используете, постарайтесь не допустить вызывающих абонентов к деталям реализации.) Когда у вас будет второй аналогичный класс, вы сможете выяснить, что на самом деле интерфейс, а что реализация. Если вашим вызывающим абонентам по-прежнему нужны детали реализации, которые неудобно помещать в общий интерфейс, значит, вы недостаточно четко разделяете их.

ИЗМЕНИТЬ для более полного ответа:

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

  1. У вас есть несколько реализаций этих методов с одинаковой семантикой и общими операциями, но с разными базовыми реализациями. Например, List, ArrayList и LinkedList. List - это общий интерфейс, который позволяет многим методам на основе коллекций принимать либо ArrayList, либо LinkedList. Интерфейс Collection допускает аналогичное расположение для всех коллекций.
  2. Вам необходимо отделить интерфейс от реализации по архитектурным причинам. Например, у вас может быть вызывающий объект на одной машине и реализующий объект на другой. Прокси-сервер на вызывающей машине реализует интерфейс для вызова по сети реального объекта. Интерфейс означает, что вызывающему абоненту не нужно знать разницу. Это сделал Java RMI.
  3. У вас должна быть возможность изменить способ вызова объекта. Например, возьмем интерфейс Image и два средства реализации, FileImage и FileImageProxy. Прокси-сервер загружает FileImage по запросу и передает вызовы интерфейса Image реальному объекту. Клиенты никогда не знают и не заботятся о том, как они получают изображение и действительно ли оно загружено; они просто знают, что есть Image, и могут его использовать.
person jprete    schedule 02.10.2009
comment
реализация - ключевое слово здесь. Используйте интерфейс для абстрагирования изменений реализации - person Don Cheadle; 13.02.2015

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

Множественное наследование интерфейса, как и реализация, обычно - плохая идея.

person Tom Hawtin - tackline    schedule 02.10.2009
comment
множественная реализация интерфейсов позволяет разделить проблемы, давая возможность клиентам указать, на какой части поверхности объекта они полагаются. Множественные интерфейсы не имеют недостатков, присущих множественному наследованию реализации. - person PanCrit; 02.10.2009
comment
Окалина. Множественные подтипы имеют тенденцию означать, что класс выполняет несколько задач, а не выполняет одну задачу хорошо. - person Tom Hawtin - tackline; 02.10.2009

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

person Adriaan Koster    schedule 02.10.2009