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...
];
我正在 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...
];