我正在用JavaScript编写一个扑克程序。我有一个Hand类,它有属性"cards“、"value”和"valueCards“。value属性是一个整数,它对应于一个手动类型,而valueCards是由五个卡片组成的数组,它们也对应于手动类型。例如,如果我原来的七张卡片(包含在卡片属性中)包含一个刷新,this.value将翻转到6,而this.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();
};我是说,这个方法很好用。这让我很困扰,好像我应该换一种方式。这违反惯例吗?
发布于 2016-01-27 11:13:51
如果您将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设置为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();
};发布于 2016-01-27 11:35:03
没有答案,但我会重新设计你的职能:
每个方法都应该返回支柱本身:
function testFlush ()
{
if (...) return POKER.HAND_TYPE.FLUSH;
return null;
}
function testStraightFlush()
{
if (...) return POKER.HAND_TYPE.StraightFlush;
return null;
}这样,您就可以同时获得值并检查是否为truness。
POKER.Hand.prototype.getValue= function ()
{
return this.testFlush () || testStraightFlush()
};发布于 2016-01-28 00:30:09
为了好玩,你可以像这样重新设计测试:
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...
];https://stackoverflow.com/questions/35035604
复制相似问题