Избавляемся от instanceof - PullRequest
       38

Избавляемся от instanceof

8 голосов
/ 03 января 2012

В игре на основе спрайтов, которую я пишу, каждое поле в 2D-сетке содержит стек спрайтов.В основном считается верхний.

В модуле правил игры у меня много такого кода:

public boolean isGameWon(Board board) {
    for (Point point : board.getTargetPoints())
        if(!(board.getTopSpriteAt(point) instanceof Box))
            return false;
    return true;
}

Обновление: //Do something считается, если есть Box сверху каждого Target.Я не понимаю, как это можно сделать, просто добавив doSomething() в Sprite, если только doSomething() не вернет 1, если спрайт является блоком, и 0 в противном случае.(и это было бы точно так же, как instanceof).


Я знаю, instanceof считается вредным, поскольку он убивает идею объектно-ориентированного программирования.

Однако я не уверен, какисправить код в моем случае.Вот некоторые мысли, которые у меня были:

  • Не думаю, что будет проще добавить метод isABox() в интерфейс Sprite.
  • Будетэто поможет, если Box был интерфейсом, чтобы другие классы могли получить ту же привилегию?
  • Должен ли я попытаться сделать что-то необычное, например сопоставление с шаблоном / двойную диспетчеризацию, с шаблонами, подобными посетителю? *
  • Это нормально, что модуль правил работает тесно с типами, просто потому, что он все равно должен знать их семантику?
  • Является ли вся идея шаблона стратегии модуля правил некорректной?
  • Это не такНе имеет смысла встраивать правила в спрайтов, так как тогда все они должны быть изменены при добавлении нового типа.

Я надеюсь, что вы пробовали что-то подобное и можете указать мнев правильном направлении.

Ответы [ 11 ]

0 голосов
/ 03 января 2012

Общие утверждения об объектно-ориентированном дизайне / рефакторинге сложно дать ИМХО, поскольку «наилучшее» действие очень сильно зависит от контекста.

Вы должны попытаться переместить «Сделай что-нибудь» в виртуальный метод Sprite, который ничего не делает. Этот метод может быть вызван из вашего цикла.

Box может затем переопределить его и сделать «что-то».

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