If 语句序列的替代结构?

Alternate structure for a sequence of If statements?

我正在 JavaScript 编写扑克牌程序。我有一手 class,它具有属性 "cards"、"value" 和 "valueCards"。值 属性 是一个整数,对应手牌类型,valueCards 是五张牌的数组,也对应手牌类型。例如,如果我原来的七张牌(包含在牌 属性 中)包含同花,this.value 将翻转为 6,并且 this.valueCards 将仅等于五张牌等于最高齐平

我对每种手型都有一个方法,如果检测到该手型,所有这些方法都会更改值和值卡。我有一个名为 getValue 的值访问器方法,所以当我为 运行 手上的所有测试创建一个方法并保留最高的一个时,它看起来像这样:

POKER.Hand.prototype.getTrueValue = function () {
    this.testStraightFlush();
    if(this.value == POKER.HAND_TYPE.STRAIGHT_FLUSH){ return; }

    this.testQuads();
    if(this.value == POKER.HAND_TYPE.QUADS){ return; }

    this.testFullHouse();
    if(this.value == POKER.HAND_TYPE.FULL_HOUSE){ return; }

    this.testFlush();
    if(this.value == POKER.HAND_TYPE.FLUSH){ return; }

    this.testStraight();
    if(this.value == POKER.HAND_TYPE.STRAIGHT){ return; }

    this.testTrips();
    if(this.value == POKER.HAND_TYPE.TRIPS){ return; }

    this.testTwoPair();
    if(this.value == POKER.HAND_TYPE.TWO_PAIR){ return; }

    this.testPair();
    if(this.value == POKER.HAND_TYPE.PAIR){ return; }

    this.getHighCards();
};

我的意思是,这个方法很管用。这让我很困扰,也许我应该以不同的方式来做。这是否违反惯例?

如果您将 this.test* 函数更改为 return true(如果找到 "hand",或者如果没有找到 return false - 那么您可以做一些丑陋的事情, 但不知何故令人满意,因为

POKER.Hand.prototype.getTrueValue = function () {
    this.testStraightFlush() ||
    this.testQuads() ||
    this.testFullHouse() ||
    this.testFlush() ||
    this.testStraight() ||
    this.testTrips() ||
    this.testTwoPair() ||
    this.testPair() ||
    this.getHighCards();
};

更改您的 this.test* 函数以仅在 this.found 为假时检查,并在找到手牌时设置 this.found = 真,因此您只需

POKER.Hand.prototype.getTrueValue = function () {
    this.found = false;
    this.testStraightFlush();
    this.testQuads();
    this.testFullHouse();
    this.testFlush();
    this.testStraight();
    this.testTrips();
    this.testTwoPair();
    this.testPair();
    this.getHighCards();
};

不是答案,但我会重新设计您的功能:

每个方法都应该return道具本身:

function testFlush ()
 {
   if (...) return POKER.HAND_TYPE.FLUSH;
    return null;
 }


function testStraightFlush()
 {
   if (...) return POKER.HAND_TYPE.StraightFlush;
    return null;
 }

通过这种方式,您将能够同时获得值并检查真实性。

POKER.Hand.prototype.getValue= function () 
 {
  return this.testFlush () || testStraightFlush()
 };

为了好玩,您可以像这样重新设计测试:

POKER.Hand.prototype.getTrueValue = function () {
    var tests = [
        [ "testStraightFlush", POKER.HAND_TYPE.STRAIGHT_FLUSH ],
        [ "testQuads"        , POKER.HAND_TYPE.QUADS ],
        [ "testFullHouse"    , POKER.HAND_TYPE.FULL_HOUSE ],
        ... etc...
    ];
    for (var test in tests) {
        var fun = this[tests[test][0]];
        var val = tests[test][1];
        fun();
        if (this.value == val) {
            return;
        }
    }
    this.getHighCards();
};

或者函数可能只是 return 一个布尔值,因此您可以有一个更简单的测试数组

    var tests = [
        "testStraightFlush",
        "testQuads"        ,
        "testFullHouse"    ,
        ... etc...
    ];