Как избежать instanceof от такого рода дела? - PullRequest
0 голосов
/ 08 апреля 2020

Мой текущий код в Player. java выглядит следующим образом:

    public boolean canPutCard(Card card) {
        if (!handCards.contains(card)) {
            return false;
        }
        if (card instanceof ActivableCard) {
            boolean hasEmpty = false;
            int i = card instanceof CharacterCard ? 0 : 1;
            for (int j = 0; j < fieldCards[i].length; ++j) {
                if (fieldCards[i][j] == null) {
                    hasEmpty = true;
                }
            }
            if (!hasEmpty) {
                return false;
            }
        }
        return (card instanceof LandCard && !hasPutLandCard) || (card instanceof PoweredCard
                && ((PoweredCard) card).getPowerNeeded() <= currentElementValue[card.getElementType().ordinal()]);
    }

Я хочу избежать использования нескольких instanceofs из-за того, что они называют «запахами кода», и вместо этого использовать полиморфизм. Так что я могу переписать это так:

    public boolean canPutCard(LandCard card) {
        return !hasPutLandCard;
    }

    public boolean canPutCard(PoweredCard card) {
        return card.getPowerNeeded() <= currentElementValue[card.getElementType().ordinal()];
    }

    private boolean canPutCard(int i, PutableCard card) {
        boolean hasEmpty = false;
        for (int j = 0; j < fieldCards[i].length; ++j) {
            if (fieldCards[i][j] == null) {
                hasEmpty = true;
            }
        }
        return hasEmpty;
    }

    public boolean canPutCard(PutableCard card) {
        return canPutCard(1, card);
    }

    public boolean canPutCard(CharacterCard card) {
        return canPutCard(0, card);
    }

    public boolean canPutCard(Card card) {
        return handCards.contains(card);
    }

классы:

abstract class SkillCard extends Card implements PoweredCard
class CharacterCard extends Card implements PoweredCard, PutableCard
class LandCard extends Card

Но, конечно, это не сработает, потому что не проверяет все случаи ..

Можно ли избежать instanceof и использовать вместо этого полиморфизм в этом случае?

1 Ответ

1 голос
/ 09 апреля 2020

Экземпляр оператора обычно можно заменить с надлежащей опорой на java виртуальную диспетчеризацию. Переместите logi решения c в класс Card, например,

public abstract boolean canPutCard(Player player);

, а затем реализуйте соответствующие logi c в подклассах Card, например:

class LandCard extends Card {
    @Override public boolean canPutCard(Player player) {
         return !player.hasPutLandCard() && player.handContains(this);
    }
}

class CharacterCard extends Card implements PoweredCard, PutableCard {
    @Override public boolean canPutCard(Player player) {
         return !player.hasEmptyCharacterCardField() && player.handContains(this);
    }
}

... и так далее. Класс игрока должен иметь требуемые методы запроса.

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