我应该将模型 类 分开还是将它们作为一个单元?
Should I seperate model classes or have them as a single unit?
我的游戏逻辑模型由多个相互连接的 classes 组成。有Board
、Cell
、Character
等。Character
可以放置(和移动)在Cell
中(1-1 rel)。
有两种方法:
- 使每个 class 模型实现接口,以便它们可以被模拟,每个 class 可以独立测试。它迫使我实现每个 class 而不依赖另一个。但在实践中,很难避免
Board
过多地了解 Cells
并且 Characters
知道 Cell
存储机制的工作原理。我有一个 Character.Cell
和 Cell.CurrentCharacter
属性。为了使设置器正确工作(而不是递归地进行),它们应该依赖于彼此的实现。感觉模型逻辑应该作为一个整体考虑。
- 将所有 public 成员设为 return 接口,但在内部使用精确的 classes(可能涉及一些向下转换)。这里的缺点是我应该将整个模型作为一个单独的模型进行测试,而不能使用模拟来独立测试不同的部分。在模型内部使用依赖注入也没有意义,只能从控制器获得另一个完整的模型实现。
那怎么办?
更新
您可以提出其他方案。
为什么只有这两个选项?
如果您打算使用 class 的不同 versions/types,那么 interfaces/abstract 基础 class 是执行共享行为和概括许多操作的好选择。然而,在彼此不知情的情况下独立构建 classes 的想法是荒谬的。
将 class storage/behaviour 与其所属的 class/layer 分开总是一个好主意。例如。数据层等中没有业务逻辑代码,但 classes 需要相互了解才能正常运行。如果您使所有内容都独立并基于接口,您 运行 将面临过度概括应用程序并降低效率的风险。
基本上,如果您认为您需要将传入的对象向下转型为不止一种类型,那么最好查看设计并查看您是否从即将编写的性能损失和令人讨厌的转型代码中获得任何收益。如果您需要处理每种类型的沮丧对象,那么您将一无所获,使用多态性和基数 class 是一个更好的方法。
使用接口并不能消除你在测试中的麻烦。无论如何,您仍然需要实例化某些版本的对象来测试 cell/board 上的大部分功能。对于完整的回归测试,您需要测试每个角色与两者的交互。
不要误会我的意思,您的角色 class 应该很可能有一个基础 class 或有一个接口。所有角色(我敢肯定)都会分享许多动作,并且可以从这种设计中受益。例如。在棋盘上移动角色是一个相当通用的操作,可以独立于角色,除了一些信息(例如角色如何移动,是否允许移动等)应该是所述的一部分基地 class/interface.
在合理的情况下,独立设计classes,让它们可以自己测试,但不要以测试为理由写出糟糕的代码。可以创建简单的存根或基本测试实例来帮助进行组件测试,并且比修复不必要的复杂代码花费的时间和精力要少得多。
接口有其用途,但如果您不对 2 个 class 进行相同的处理……那就不是了。
*使用 MVC 也可以让您在测试方面有优势。如果操作正确,您应该能够换出任何层以简化对单层的测试。
我的游戏逻辑模型由多个相互连接的 classes 组成。有Board
、Cell
、Character
等。Character
可以放置(和移动)在Cell
中(1-1 rel)。
有两种方法:
- 使每个 class 模型实现接口,以便它们可以被模拟,每个 class 可以独立测试。它迫使我实现每个 class 而不依赖另一个。但在实践中,很难避免
Board
过多地了解Cells
并且Characters
知道Cell
存储机制的工作原理。我有一个Character.Cell
和Cell.CurrentCharacter
属性。为了使设置器正确工作(而不是递归地进行),它们应该依赖于彼此的实现。感觉模型逻辑应该作为一个整体考虑。 - 将所有 public 成员设为 return 接口,但在内部使用精确的 classes(可能涉及一些向下转换)。这里的缺点是我应该将整个模型作为一个单独的模型进行测试,而不能使用模拟来独立测试不同的部分。在模型内部使用依赖注入也没有意义,只能从控制器获得另一个完整的模型实现。
那怎么办?
更新
您可以提出其他方案。
为什么只有这两个选项?
如果您打算使用 class 的不同 versions/types,那么 interfaces/abstract 基础 class 是执行共享行为和概括许多操作的好选择。然而,在彼此不知情的情况下独立构建 classes 的想法是荒谬的。 将 class storage/behaviour 与其所属的 class/layer 分开总是一个好主意。例如。数据层等中没有业务逻辑代码,但 classes 需要相互了解才能正常运行。如果您使所有内容都独立并基于接口,您 运行 将面临过度概括应用程序并降低效率的风险。 基本上,如果您认为您需要将传入的对象向下转型为不止一种类型,那么最好查看设计并查看您是否从即将编写的性能损失和令人讨厌的转型代码中获得任何收益。如果您需要处理每种类型的沮丧对象,那么您将一无所获,使用多态性和基数 class 是一个更好的方法。
使用接口并不能消除你在测试中的麻烦。无论如何,您仍然需要实例化某些版本的对象来测试 cell/board 上的大部分功能。对于完整的回归测试,您需要测试每个角色与两者的交互。
不要误会我的意思,您的角色 class 应该很可能有一个基础 class 或有一个接口。所有角色(我敢肯定)都会分享许多动作,并且可以从这种设计中受益。例如。在棋盘上移动角色是一个相当通用的操作,可以独立于角色,除了一些信息(例如角色如何移动,是否允许移动等)应该是所述的一部分基地 class/interface.
在合理的情况下,独立设计classes,让它们可以自己测试,但不要以测试为理由写出糟糕的代码。可以创建简单的存根或基本测试实例来帮助进行组件测试,并且比修复不必要的复杂代码花费的时间和精力要少得多。 接口有其用途,但如果您不对 2 个 class 进行相同的处理……那就不是了。
*使用 MVC 也可以让您在测试方面有优势。如果操作正确,您应该能够换出任何层以简化对单层的测试。