0

我正在使用 DDD 进行项目,我有一些课程,但我不知道将它们放在哪里。

该域是关于现有游戏的。该游戏具有基本概念,例如角色,技能树。我的领域类只是代表这些概念。我没有制作这个游戏。

我的应用程序/项目是关于拥有一个代表这些概念的软件,并具有一些附加值。目前,名称和描述是唯一可能的附加值(例如,“火法师”和“法力依赖,小心!”)。

问题1:有两个类是否有意义,还是应该合并它们?在前一种情况下,我应该将此类“具有附加值(名称和描述)”放在哪里?在应用层?

问题2:我说领域层代表我正在研究的知识领域,应用层代表领域中不存在但我想提供的所有东西,作为附加值,我说得对吗?

(因此,如果我的软件只是代表领域,应用层很薄,如果我的软件提供了很多非领域功能,那么应用层很厚?)

附加信息 1:我的项目是关于创建一个角色模拟器。因此,为了模拟一个角色,我必须表示它,以及它的所有依赖项。我的领域层职责是代表游戏。它包含像 Character 这样的类,具有一些属性(Life、Mana、Attack、Defense、Class)和一些枚举(如 CharacterClass,它列出了所有可用的类)。

现在,我希望我自己的项目能够为用户提供创建代表游戏角色的项目的能力。该项目还允许用户保存其他信息,例如当前项目的名称、主要(和次要)设备集、主要(和次要)技能树。任何设备集和技能树都可以使用注释,因此用户可以简单地拥有一个内置的备忘录/便利贴。次要装备集和技能树,注释不是游戏中现有的概念(因此,在我的领域中不存在)。

问题1中,“增值类”是一个角色项目,是多个信息(角色装备、技能树、注释等)的集合。如果用户需要,它可以保存在物理支架上,稍后再次打开和编辑。

问题 1 的重新表述:我有一个 Character 类和一个 CharacterProject 类。CharacterProject 类是多个信息的组合。但它特定于我的应用程序。把它放在应用层、领域层或其他地方有意义吗?

4

1 回答 1

0

对于您的第一个问题,我想发表评论并为您提供一些不起眼的设计指导。谦虚的意思是相信它需要您自担风险:D。

在为任何层或任何类型的软件设计类时,我通常会以泛化的爱(抽象/接口收缩等)来处理它,您提到您有名称和描述,它们是将被添加到您的域模型核心对象的“值”例如“SkillTree”或“Character”,问问自己是否可以概括名称和描述类,例如 IAdditiveInformation 接口。如果这两个类的大部分功能可以在 IAdditiveInfromation 泛化下共享/收缩,那么您知道这也在您的域核心中。如果您在域模型的核心中使用此接口并将所有依赖项指向此接口,您将不必回答困难和推测性的设计问题,例如

  • 我会添加更多的“价值”课程吗?
  • 会有更多的“GamePart”课程吗?
  • 我如何设计我的“价值”和“游戏部件”类,以便我能够以最小的努力实现它们的交互。

用于决定放置在域模型、域服务或应用层及其他层的类。我用这些作为指导。

  • 如果一个类与你的软件直接相关,就像一个帐户软件与发票相关,没有它是不可分割的,那么这个类就在你的领域模型层中,并且是洋葱的核心。
  • 如果一个类在您的核心对象上运行并且仅在您的域核心上运行,并且只要您使用像当前核心这样的域核心,它们就可以重用。那么它们就是您的域服务。
  • 如果一个类在您的域服务和/或您的域核心上运行,并且对于该应用程序来说感觉更专业一些。那么它可能属于应用层。对于应用层中的某些内容,请记住,此功能对于域上的特定应用程序至关重要,而不是整个域。因此,您只需要该应用程序的此功能。

让我给你一个例子,让它更容易理解。

想象一个基于 GPS 的跟踪系统。

  • 它的核心是一个名为 GPSTrackable 的类(希望是一个抽象类)。
  • 在域服务级别,有一个类运行/依赖于 GPSTrackable,这是一个基于地理位置的查询控件,您在其中提供一个 GPS 框,它会在该框中返回您的 GPS 可跟踪项。让我们调用这个类 GPSTrackableQuery

是时候看看洋葱/DDD 的魔力和纠正 OOD 了 :)。我还没有告诉你申请是什么,我什至还没有决定申请。我没有决定捕获核心域和域服务,因为它们应该是独立于应用程序的(以理想化的架构方式)。

现在有了这些在我们的洋葱核心,

  • 我可以在应用层创建一个类,每 10 秒调用一次 GPSTrackableQuery,并检查军事基地附近是否有任何物体用于安全系统,如果你在每个人的手机上运行该核心,你就会得到一个基于位置的安全系统.
  • 我可以在应用层创建一个类,当用户想要向其商店附近的人发送大量 SMS 或电子邮件时调用 GPSTrackableQuery。现在我从同一个域核心制作了一个广告系统。

您可以为此添加新示例。这是一件简单的事情,当我怀疑自己的决定时,我会想象。

最后一点:您还应该了解,在图层中放置类没有任何意义。我们只是将它们放在“虚拟”层中,以了解它们的职责和功能范围。如果有太多疑问,就把它放在某个地方,当你的架构或设计或实现发展时,你会觉得它是正确的放置。

对于你的第二个问题。

在我看来,你的建议是正确的。我唯一可以评论的是,我不会将知识领域一词用于领域层(我假设您的意思是领域核心和领域服务)。我将领域核心视为计算机术语或核心思想背后的现实世界知识的表示。

于 2013-11-08T09:44:58.013 回答