DDD中某些类的域或应用程序层

时间:2013-08-21 14:55:08

标签: oop architecture domain-driven-design onion-architecture

我正在使用DDD开发一个项目,我有一些课程,我不知道放在哪里。

域名是关于现有游戏。这个游戏有基本概念,如角色,SkillTree。我的域类只代表那些概念。我没有制作这个游戏。

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

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

问题2 :我正确地说域名表示我正在处理的知识领域,而应用层代表域中不存在的所有内容,但我想要提供,作为附加值?

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

对于您的第一个问题,我想评论并帮助您提供一些简单的设计指导。谦卑的意思相信你自担风险:D。

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

  • 我会添加更多“价值”课程吗?
  • 会有更多'GamePart'课程吗?
  • 如何设计我的'价值'和'GamePart'课程,以便我能以最小的努力实现他们的互动。

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

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

让我举个例子,让它更容易理解。

想象一下基于gps的跟踪系统。

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

时间看到洋葱/ DDD的魔力并正确OOD :)。我没有告诉你应用程序是什么,我还没有决定应用程序。我没有决定捕获核心域和域服务,因为它们应该是独立于应用程序的(以理想化的体系结构方式)。

现在我们的洋葱核心,

  • 我可以在应用程序层创建一个类,每隔10秒调用一次GPSTrackableQuery并检查是否有任何对象靠近安全系统的军事基地,如果运行该核心,您将获得基于位置的安全系统在每个人的电话里。
  • 我可以在应用程序层创建一个类,当用户想要向他的商店附近的人发送大量短信或电子邮件时调用GPSTrackableQuery。现在我从同一个域核心制作了一个广告系统。

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

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

第二个问题。

在我看来,你的建议是正确的。我唯一可以评论的是我不会在域层使用术语范围(我假设你的意思是域核心和域服务)。我认为域核心是计算机术语中现实世界知识的表示或其背后的核心理念。