首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >If语句序列的替代结构?

If语句序列的替代结构?
EN

Stack Overflow用户
提问于 2016-01-27 11:07:08
回答 3查看 76关注 0票数 1

我正在用JavaScript编写一个扑克程序。我有一个Hand类,它有属性"cards“、"value”和"valueCards“。value属性是一个整数,它对应于一个手动类型,而valueCards是由五个卡片组成的数组,它们也对应于手动类型。例如,如果我原来的七张卡片(包含在卡片属性中)包含一个刷新,this.value将翻转到6,而this.valueCards将只等于五张等于最高刷新的卡片。

我对每个手类型都有一个方法,如果检测到该手类型,所有方法都会更改值和valueCards。我有一个名为getValue的值访问器方法,所以当我创建一个方法来运行所有测试并保持最高的测试时,结果如下所示:

代码语言:javascript
复制
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();
};

我是说,这个方法很好用。这让我很困扰,好像我应该换一种方式。这违反惯例吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-27 11:13:51

如果您将this.test*函数更改为:如果找到“手”,则返回true;如果没有,则返回false --那么您可以做一些丑陋但又令人满意的事情,例如

代码语言:javascript
复制
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设置为this.found,因此您只需

代码语言:javascript
复制
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();
};
票数 3
EN

Stack Overflow用户

发布于 2016-01-27 11:35:03

没有答案,但我会重新设计你的职能:

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

代码语言:javascript
复制
function testFlush ()
 {
   if (...) return POKER.HAND_TYPE.FLUSH;
    return null;
 }


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

这样,您就可以同时获得值并检查是否为truness。

代码语言:javascript
复制
POKER.Hand.prototype.getValue= function () 
 {
  return this.testFlush () || testStraightFlush()
 };
票数 1
EN

Stack Overflow用户

发布于 2016-01-28 00:30:09

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

代码语言:javascript
复制
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();
};

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

代码语言:javascript
复制
    var tests = [
        "testStraightFlush",
        "testQuads"        ,
        "testFullHouse"    ,
        ... etc...
    ];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35035604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档