【发布时间】:2021-07-30 16:43:01
【问题描述】:
我目前正在构建一个二十一点游戏,我的一个课程叫做“Deck”。这个套牌需要做两件事:
- 返回一组其他对象可以使用的卡片(这相当于分发这些卡片)
- 从牌堆中取出这些牌(一旦发牌,就应该将其取出)。
目前,我通过创建两个方法实现了这两个功能:selectCards() 和removeIndexFromDeck。我首先调用selectCards(),它返回选定的卡片,但也调用removeIndexFromDeck()。
这种方法是否违反最佳做法?看起来我的selectCards() 函数既有返回值又有副作用。
如果它确实违反了最佳做法,我将如何更改这些方法,但要确保我仍然能够归还所选卡片并将它们从牌组中移除。
谢谢!
class Deck {
constructor() {
this.deck = [];
['♦', '♣', '♥', '♠'].forEach(suit => {
['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'].forEach(value => {
this.deck.push(`${value}${suit}`);
});
});
}
selectCards(numCards) {
let selectedCards = [];
while (numCards > 0) {
let randIndex = Math.floor(Math.random() * this.deck.length);
selectedCards.push(this.deck[randIndex]);
this.removeIndexFromDeck(randIndex);
numCards -= 1;
}
return selectedCards;
}
removeIndexFromDeck(index) {
this.deck.splice(index, 1);
}
}
【问题讨论】:
-
"这种方法是否违反最佳实践?" ¯\_(ツ)_/¯ 您要建模什么?人们与之互动的实际物理甲板?您移除的卡片似乎无处可去。有了物理甲板,他们最终会回去。你只是想模拟更抽象的甲板交互吗?您可以将卡片标记为已消失,或者不要尝试将它们视为真正“将它们拉出”。
-
select听起来好像以某种方式将它们标记为选中。我将方法命名为removeRandomCards。但除此之外,是的,具有返回值和副作用的方法很好。 CQS 并不适用于所有事物。
标签: javascript function oop encapsulation side-effects