【发布时间】:2015-09-17 10:59:24
【问题描述】:
我的游戏逻辑模型由多个连接的类组成。有Board、Cell、Character等。Character可以放置(和移动)在Cell(1-1 rel)中。
有两种方法:
- 使模型的每个类都实现接口,以便它们可以被模拟,每个类都可以独立测试。它迫使我使每个类的实现不依赖于另一个类。但在实践中,很难避免
Board对Cells了解太多,而Characters知道Cell存储机制是如何工作的。我有Character.Cell和Cell.CurrentCharacter属性。为了让设置器正常工作(而不是递归地),他们应该相互依赖实现。感觉模型逻辑应该被视为一个单元。 - 让所有公共成员返回接口,但在内部使用精确的类(可能涉及一些向下转换)。这里的缺点是我应该将整个模型作为一个单独的模型进行测试,并且不能使用模拟来独立测试不同的部分。此外,在模型中使用依赖注入是没有意义的,只是为了从控制器中获取另一个完整的模型实现。
那该怎么办?
更新
您可以提出其他选择。
【问题讨论】:
-
你能详细解释一下为什么你的模型中的每个类都需要知道其他一些类的实现吗?
-
@YacoubMassad 不是每个人,这更多是关于了解行为。
Character知道,当它设置Cell.CurrentCharacter时,Cell 会递归回调Character.Cell设置器(以确保一致性),因此它应该正确实现其一侧,以免再次使用Cell.CurrentCharacter。 -
Character 什么时候决定设置 Cell.CurrentCharacter?何时调用 Character.Cell 设置器?谁首先调用 Character.Cell?董事会班?谁使用这些类(Board、Cell 和 Character)?你能让所有对这些类的访问都通过 Board 类(如aggregate pattern)吗?
-
@YacoubMassad
Board在每个游戏步骤中移动东西。上层仅使用Cell和CurrentCharacter的 getter。不,我无法通过Board路由所有访问。 -
@YacoubMassad 实际上我想过让模型与步骤(转向)逻辑分开,只确保模型代码的一致性。所以应该有 2 个用户(玩家和转跑者)应该采用不同的界面。
标签: unit-testing model-view-controller dependency-injection architecture