分配责任:一个拥有玩家的游戏,每个玩家都有一个银行账户

时间:2011-10-31 19:15:22

标签: oop structure ooad

我最近一直在研究一些面向对象的分析和设计,我觉得我对它有一个非常好的整体感觉。

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

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

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

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

4 个答案:

答案 0 :(得分:3)

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

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

这样你可以做以下事情:

bank.WithDrawMoney(player, amount);

bank.TransferMoney(playerFrom, playerTo, amount);

在这种情况下,银行会“查询”该玩家拥有的帐户,并从中删除相应的资金。

想象一下,如果它是一个真正的银行账户。一个人不携带该帐户,只提及它。银行负责转移资金(存款,取款......)。

因此,在顶层,您将拥有Game,其中包含PlayersBankBoard等对象。它可能有顶级方法RollDice()。理事会可能采用Move(player, distance);

等方法

答案 1 :(得分:1)

playerObject.getAccount().withdraw()违反了"Law" of Demeter

在玩家等方面公开对玩家有意义的方法。调查Inversion of Control处理依赖关系。

答案 2 :(得分:1)

我想你想问自己这个问题:玩家是否持有该玩家的公共财产?如果是的话,也许getAccount()不是一个糟糕的选择。

最终归结为平衡。如果你的帐户类有20个方法/属性(让我们忽略20是否是一个高数字的参数),那么从编码角度来看,有一个函数清楚地显示一个函数.getAccount()会比播放器中有20个函数复制少得多的代码只需将呼叫转发到帐户中即可。

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

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

相反,你可以让玩家类只有一个函数getCash()。从外部(即游戏类视角)看,玩家如何获得现金并不重要。在内部,玩家可以进入银行账户并执行提款。但是通过保持两个分离的东西,稍后您可以拥有一个不同的玩家类别,可以通过其他方式获得现金(即进入他自己的钱包)。关键是只向外界暴露玩家自己的行为,并隐藏该行为的实施方式(即不要宣传从银行账户中检索到的钱)。

答案 3 :(得分:0)

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

我会假设它是一个类似垄断的桌面游戏。如何在现实生活中付出代价?实际上想要建模的过程是什么?

我意识到你已经声明你有一个银行账户类,但如果这个过程是Joe Bloggs实际支付的,现金(来自他在厕所水箱中的藏匿处),弗雷德,与银行没有任何关系,那么他是不需要银行账户。如果弗雷德然后选择在某个时刻将其存入 - 而不是将其塞在床垫(或游戏板)下 - 那么此时他将需要一个银行和一个帐户。

假设玩家可以获得/掌握其他玩家,第一个进程会看到(在玩家中)类似:

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

}

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

第二项活动完全不同。弗雷德现在必须首先告诉他的银行他想要存入100美元然后他的银行,无论是通过隔离墙还是出纳员,都会(希望)信任他的帐户。所以弗雷德确实需要一个银行,现在可能还需要一个帐户。但为什么需要帐户在游戏中提供什么目的?它绝对是该计划的必要组成部分,还是只是因为银行是现实生活中的资金?

然后有一种情况是玩家确实想要将他或她的账户中的银行资金转移到另一个玩家的账户作为付款。在这种情况下,两个玩家都需要一个银行和账户,但只有银行才能真正转移资金,因此他们只需要了解银行。当然,如果银行在游戏中有其他重要的角色,那么只会这样做。

因此,如何在游戏中实现资金转移的答案完全取决于游戏机制。如果你真的需要一个类似银行账户的课程,那么你应该有一个银行是一个非常安全的赌注。但你必须问问自己为什么你真的需要银行账户对象首先飞来飞去?如果玩家的银行账户与他们直接相关,那么它是否真的是一个银行账户,或者只是乔将手浸入厕所水箱?