一系列If语句的替代结构?

时间:2016-01-27 11:07:08

标签: javascript if-statement conventions

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

我为每种手型设置了一种方法,如果检测到手型,则所有方法都会更改值和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();
};

我的意思是,该方法运行正常。它只是困扰我,就像我应该以不同的方式做到这一点。这违反惯例吗?

3 个答案:

答案 0 :(得分:3)

如果你改变你的this.test *函数,如果找到“hand”则返回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();
};

答案 1 :(得分:1)

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

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

stringVar DateNaissED := if isnull({ELEC_.DOB_DROIT}) then '' else {ELEC_.DOB_DROIT};

IF DateNaissED = '' THEN ''
ELSE
right(DateNaissED,2) + '/' + mid(DateNaissED,5,2) + '/' + left(DateNaissED,4)

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

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


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

答案 2 :(得分:0)

只是为了它的乐趣,你可以重新设计这样的测试:

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...
    ];