Вероятное злоупотребление интерфейсами Java в моей реализации Ms. Pac-Man - PullRequest
3 голосов
/ 02 октября 2009

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

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

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

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

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

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

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

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

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

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

Ответы [ 4 ]

9 голосов
/ 02 октября 2009

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

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

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

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

РЕДАКТИРОВАТЬ для более полного ответа:

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

  1. У вас есть несколько реализаций этих методов с одинаковой семантикой и общими операциями, но с разными базовыми реализациями. Например, List, ArrayList и LinkedList. List - это общий интерфейс, который позволяет многим методам на основе коллекций принимать ArrayList или LinkedList. Интерфейс Collection допускает аналогичное расположение для всех коллекций.
  2. Вам необходимо отделить интерфейс от реализации по архитектурным соображениям. Например, у вас может быть вызывающий объект на одном компьютере и реализующий объект на другом. Прокси на вызывающем компьютере реализует интерфейс для вызова через сеть к реальному объекту. Интерфейс означает, что абонент не должен знать разницу. Java RMI сделал это.
  3. Вы должны иметь возможность изменять способ вызова объекта. Например, возьмем интерфейс Image и два разработчика, FileImage и FileImageProxy. Прокси-сервер загружает FileImage по требованию и передает вызовы к интерфейсу Image фактическому объекту. Клиенты никогда не знают и не заботятся о том, как они получают изображение, действительно ли оно загружено или нет; они просто знают, что есть Image, и они могут его использовать.
4 голосов
/ 02 октября 2009

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

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

2 голосов
/ 02 октября 2009

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

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

1 голос
/ 02 октября 2009

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

...