Анализ рук в покере и чистый код

У меня вопрос больше о стиле, чем о реализации. Я работаю над покерным приложением. У него есть класс, в котором хранятся все необходимые данные, например, пять карточек. Существует также вторая структура, которая моделирует FigureAnalyzer — фрагмент кода, определяющий, содержит ли рука флеш, две пары или фулл. В целом все работает нормально. Но это более уродливо, чем моя бывшая девушка.

Это образец, определяющий комбинацию рук:

@Override
public int getFigureStrength(IHand hand) {
/*
 * analyze all possible pairs, triples, etc.
 */
    MultipleCardAnalyzer.anayzeMultipleCards(hand, figureList);
    hand.setFigureAnalyzer(this);

    if (isPoker()) {
        if (isRoyalPoker())
            return 10;
        return 9;
    }

    else if (isFourOfAKind())
        return 8;

    else if (isFull())
        return 7;

    else if (isFlush())
        return 6;

    else if (isStraight())
        return 5;

    else if (areThreeOfAKind())
        return 4;

    else if (areTwoPairs())
        return 3;

    else if (isPair())
        return 2;
    else
        return 1;
}

Числа полезны, когда дело доходит до сравнения двух рук. Но... это просто ужасно. Может ли кто-нибудь указать мне или просто предложить, как я могу сделать его более красивым?


person Treck    schedule 10.03.2016    source источник
comment
если здесь нет отзывов, попробуйте codereview.stackexchange.com — ваш вопрос идеально подходит для их сайта.   -  person Baronz    schedule 10.03.2016
comment
Перечисления?   -  person weaknespase    schedule 10.03.2016
comment
Хорошо, перечисления делают одно, но все эти if/elses... Есть идеи, как сделать их более читабельными?   -  person Treck    schedule 10.03.2016
comment
Откровенно говоря, правила покера — это мешанина из особых случаев, так что если код, реализующий их, представляет собой мешанину из особых случаев, это не обязательно плохо. Единственное, против чего я мог бы обоснованно возразить выше, это название функции isPoker(), которое, по-видимому, должно быть isStraightFlush(). Мне любопытно, а название игры совпадает с названием стрит-флеша на польском языке? Обычно игра называется в честь ее цели, но в испанском и других языках она названа в честь комбинации каре (el Pokar), потому что в покере не было стритов и флешей до Гражданской войны.   -  person Lee Daniel Crocker    schedule 10.03.2016
comment
Я как раз собирался написать забавную вещь, что я знал неправильное название для Straight Flush, но Покер - это название для этого на польском языке, так что мне это кажется правильным ;) Итак, вы меня поняли. Но в польском все тяжело и странно.   -  person Treck    schedule 10.03.2016
comment
В этом есть смысл. Игра, вероятно, не попала в Польшу до окончания Гражданской войны, когда в ней были стриты и флеши. Интересный исторический репортаж.   -  person Lee Daniel Crocker    schedule 11.03.2016


Ответы (1)


Определите константы со значимыми именами для этих значений; здесь может пригодиться enum.

person Scott Hunter    schedule 10.03.2016