2015-04-15 2 views
1

Есть ли какая-либо польза от использования интерфейса просто потому, что группа объектов имеет несколько общих методов?Необходимы ли интерфейсы для простых общих методов?

Например, у меня есть GameObject, GameComponent и GameLevel. Каждый из них имеет функции onUpdate() и onDraw().

Должен ли я создать интерфейс IGameEntity, который содержит onUpdate() и onDraw(), и каждый из них реализует его? У меня нет намерения хранить какой-либо список IGameEntity или любую аналогичную ситуацию, когда мне нужен только доступ к этим двум функциям, так ли этот уровень абстракции конструктивен?

+4

YAGNI применяется здесь, я думаю.Вы всегда можете определить этот интерфейс позже, если вы * do * в конечном итоге хотите его использовать. – Blorgbeard

+0

Очень верно, с минимальными изменениями в объявлениях функций. Спасибо за ответ! –

+1

@ aceads0529 Интерфейс - это своего рода контракт, который класс выполняет так, если вы хотите, чтобы класс обязательно реализовал некоторые функции, вы должны использовать интерфейс, чтобы гарантировать, что его хорошая практика программирования – Kayani

ответ

0

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

Интерфейсы: Значимые ограничения по типам. Вообще, я бы сказал, что интерфейс под названием IGameEntity звучит сомнительно. Что такое is it? Из его функциональности его также можно назвать IUpdatableDrawable, но это имя уже показывает, что это было бы странным. Иногда необходимо вводить такие понятия, как это, но это стоимость с точки зрения удобочитаемости, которую следует оплачивать только с полным основанием.

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

-1

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

-1

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

0

Нет, нет никакого преимущества для этого. Вот ключ заявление:

Я не собираетесь хранить любой вид списка IGameEntity-х или любой подобной ситуации, когда мне необходимо иметь доступ к этим двум функциям только.

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

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