Getting rid of `instanceof`

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

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

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

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


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

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

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

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

8
задан Thomas Ahle 3 January 2012 в 12:58
поделиться