【问题标题】:Alternate structure for a sequence of If statements?If语句序列的替代结构?
【发布时间】:2016-01-27 11:07:08
【问题描述】:

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

我对每种手型都有一个方法,如果检测到该手型,它们都会更改 value 和 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();
};

我的意思是,该方法效果很好。它只是困扰着我,就像也许我应该以不同的方式做这件事。这是否违反惯例?

【问题讨论】:

  • 你想使用switch-statement
  • 但是 switch 语句中的控制变量是什么?
  • 你的函数testStraightFlushtestQuads等的内容是否有很大不同?
  • 单独测试每只手没有多大意义。简单地测试相同等级的数量,那么您已经涵盖了除顺子和同花顺之外的所有内容。如果没有相同的排名,您可以测试顺子,然后(或同时)测试同花顺。
  • testStraightFlush 和 testQuads 是不同的。 testStraightFlush 首先测试同花,得到这些牌的花色,然后抓住该花色的所有牌,以防超过五张。然后,如果第一张牌的点数减去第五张牌的点数等于 4,则为同花顺。 Quads 是一种类似的机制。我尝试测试相同等级的数量。它变得非常混乱,我放弃了它。另外,我认为比较我的做法更容易比较手。也许我错了。

标签: javascript if-statement conventions


【解决方案1】:

如果您将 this.test* 函数更改为如果找到“手”则返回 true,否则返回 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 是否为 false,如果找到手则设置 this.found = true,因此您只需

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();
};

【讨论】:

    【解决方案2】:

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

    每个方法都应该返回 prop 本身:

    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()
     };
    

    【讨论】:

    • 谢谢。唯一的问题是我的 testPair 和 testTrips 方法是这样的,它们验证它们是对而不是trips 或 quads,并且是trips,而不是quads,以便返回这些卡片以在 testFullHouse 方法中使用。也许我应该改变它以减少耦合。
    【解决方案3】:

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

    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();
    };
    

    或者函数可能只是返回一个布尔值,所以你可以有一个更简单的测试数组

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

    【讨论】:

      猜你喜欢
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2011-03-21
      • 2016-08-30
      相关资源
      最近更新 更多