c# - 游戏的架构模式

标签 c# vb.net design-patterns architecture

所以我得到了一个包含几个大项目的解决方案,我正试图将它们分解为具有更多独立职责的较小项目。这是一个游戏,但我主要是一个 LOB 开发人员,我认为这些原则可能是普遍的,我想我可以在这里学到一些东西。

某些对象中的依赖关系过于紧密地交织在一起,我希望就如何理清它们提供一些帮助。或者可能是某种模式或抽象可以使它们更易于管理。

Ares.Core.World 中有类,如 Creatures、Items 等。它们都继承自 Entity,Entity 知道它存在于 map 上的哪个单元格。它通过持有对 Ares.Core.UI.MapControls.MapCell 的引用来实现这一点...您可以看到电线已经交叉了。

Ares.Core.UI.MapControls 包含 Map 和 MapCell,每个都包含它们包含的生物和项目的列表。 MapCell 还继承自 Ares.Core.World.Entity,因为它非常优雅地解决了一些早期问题——例如,所有实体都有库存。

我想找到一种方法将 UI 和 World 拆分为单独的项目(Ares.WorldAres.UI),因为 UI 和总体世界可能应该是单独的关注点。但是正如你所看到的,现在的方式是两个项目需要相互引用,不允许循环引用。

我想知道是否有任何架构模式可以帮助解决这种情况。谢谢!

最佳答案

因此,您的世界类 - 生物、元素等 - 它们都需要来自 MapCell 的东西

您能否合理地创建一个(或多个)接口(interface)来代表世界实体的需求?这样实体只需要该接口(interface)的实现?

这将是将两者分离的第一步。也许很明显,此接口(interface)的任何方法签名或属性都不能包含来自 UI 项目的类。它应该在世界和 UI 引用库(例如 Ares.Core)中使用标准类型或自定义类型定义。

然后,在 UI 项目中定义封装 MapCell 的接口(interface)的实现,并提供世界实体所需的内容。

根据您获得 MapCell 的方式,使用您选择的 IoC 在需要的地方提供实现,您可能还需要在工厂上分层。

如果没有关于您的特定需求的更多详细信息,很难具体说明,但我认为这种方法总体上应该是可行的。

关于c# - 游戏的架构模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6023723/

相关文章:

c# - MouseEnter 和 MouseLeave 事件未在用户控件中引发

c# - 使用 OpenXML 读取 Excel 文件

.net - 没有公司名称无法注册 vb.net express 2012

vb.net - for 字符串变量的循环

java - 如何使用 args4j 访问子命令中的主上下文来实现子命令处理程序?

java - 需要模式建议(Hibernate + Guice)

c# - 升级到 .NET 8 后 Scrutor 停止工作

.net - VB.net 中的 #warning 指令

javascript - OOP 中 Controller 类常见吗

c# - 有没有一种简单的方法可以将 32 位整数转换为 16 位整数?