1

最近一直在学习一些面向对象的分析和设计,感觉总体感觉还不错。

但是这个小场景一直困扰着我。

假设我正在设计一个简单的棋盘游戏。我有班级游戏,其中包含有关董事会和球员的信息。播放器是从 Player 类创建的。所有玩家都有一个从 BankAccount 类创建的银行账户。

我的游戏处理关于移动后应该发生什么的逻辑。大多数情况下,这涉及从玩家的银行账户中提取或存入一些金额。

My BankAccount 有取款、存款和返还余额的方法。但我的游戏不知道玩家的银行账户。仅关于玩家。我是否给我的 Player 类一个方法 getAccount,以便我可以调用playerObject.getAccount().withdraw()?或者我该如何分配这种行为的责任?我的 Player 类是否应该实现一个withdraw()只调用account.withdraw()其关联帐户对象的方法?

4

4 回答 4

3

ABank应该控制 ,而BankAccounts不是player对象。

换句话说,银行应该是 BankAccounts 的集合以及一些用于管理这些帐户的附加方法。

这样您就可以执行以下操作:

bank.WithDrawMoney(player, amount);

或者

bank.TransferMoney(playerFrom, playerTo, amount);

在这种情况下,银行将“查找”该玩家拥有的账户并从中移除适当的资金。

想象一下,如果它是一个真实的银行账户。一个人不会随身携带该帐户,只是对其的引用。银行负责资金转移(存款、取款..)。

因此,在顶层,您将拥有一个Game包含诸如PlayersBank和之类的对象Board。它可能有这样的顶级方法RollDice()。董事会可能有一种方法,例如Move(player, distance);

于 2011-10-31T19:31:35.327 回答
1

playerObject.getAccount().withdraw()违反了得墨忒耳的“法则”

在 Player 等上公开对玩家有意义的方法。调查控制反转以处理依赖关系。

于 2011-10-31T19:20:42.447 回答
1

我想你想问自己这个问题:账号是玩家持有玩家的公共财产吗?如果是,也许 getAccount() 不是一个坏选择。

最后,一切都归结为平衡。如果您的帐户类有 20 个方法/属性(让我们忽略关于 20 是否是一个高数字的参数),那么从编码的角度来看,显然拥有一个函数 player.getAccount() 将比在播放器中拥有 20 个函数复制更少的代码只需将呼叫转移到帐户中。

另一方面,您需要记住 getAccount() 现在将您的游戏类实现与每个玩家必须拥有一个帐户这一事实相结合。你不能有没有银行账户的玩家。

在更好的 OO 策略中,您希望每个类都充当某种抽象,以便它为其客户提供简化的视图,同时将复杂性/细节隐藏在私有变量后面。如果您有 getAccount() 则不会这样做,但如果您只是在播放器类中公开每个单独的帐户函数,您也不会这样做。

因此,您可以让玩家类只具有一个函数 getCash()。从外部(即游戏类的角度)来看,玩家如何获得现金并不重要。在内部,玩家可以去银行账户进行提款。但是通过保持两件事情脱钩,稍后你可以拥有一个不同的玩家等级,它可能会以其他方式获得现金(即进入他自己的钱包)。关键只是将玩家自己的行为暴露给外界并隐藏该行为是如何实现的(即不要宣传从银行账户中取钱)。

于 2011-10-31T19:27:18.973 回答
0

对于它的价值,我通常发现尝试从问题领域开始思考,远离其他人已经触及的代码,这很有成效。

我假设它是一个类似大富翁的棋盘游戏。支付在现实生活中会如何发展?实际尝试建模的过程是什么?

我知道你已经说过你有一个银行账户类,但如果这个过程是乔·布洛格斯实际支付现金(从他藏在马桶水箱里的钱),弗雷德,与银行没有任何关系,那么他不会需要一个银行账户。如果 Fred 然后选择在某个时候将其存入银行——而不是一直把它塞在床垫(或游戏板)下——那么到那时他将需要一个银行和一个账户。

假设玩家可以获取/拥有其他玩家的句柄,第一个过程将看到(在 Player 中)类似:

void payPlayer( player, amount )
{
  spendCash( amount ); // reduces stash by "amount"
  player.recieveCash( amount );

}

现金储备的大小可能只是玩家类别的一个属性。

第二个活动是完全不同的事情。弗雷德现在必须首先告诉他的银行他想存入 100 美元,然后他的银行,无论是通过墙洞还是出纳员,都会(希望)记入他的账户。所以弗雷德现在确实需要一家银行,可能还需要一个账户。但他为什么需要账户在游戏中的用途是什么?它绝对是该计划的必要组成部分,还是只是因为银行是现实生活中资金流向的地方?

还有一种情况是玩家确实想将他或她账户中的银行资金转移到另一个玩家的账户作为付款。在这种情况下,两个玩家都需要银行和账户,但只有银行才能真正转移资金,所以他们只需要了解银行即可。当然,只有在银行在游戏中扮演其他重要角色时,人们才会这样做。

So the answer to how to implement the transfer of money in the game depends entirely on the game mechanics. If you really need a bank account-like class then it's a pretty safe bet you should have a bank. But you have to ask yourself why do you really need bank account objects flying around in the first place? And if a player's bank account is directly associated with them, is it really a bank account any more, or just Joe dipping his hand into the toilet cistern?

于 2012-02-28T15:48:16.970 回答