我正在使用DDD开发一个项目,我有一些课程,我不知道放在哪里。
域名是关于现有游戏。这个游戏有基本概念,如角色,SkillTree。我的域类只代表那些概念。我没有制作这个游戏。
我的应用程序/项目是关于拥有一个代表这些概念的软件,并带有一些附加值。目前,名称和描述是唯一可能的附加值(例如,“Fire mage”和“Mana dependent,小心!”)。
问题1 :有两个类是否有意义,还是应该合并它们?在前一种情况下,我应该把这个类“添加值(名称和描述)”放在哪里?在应用层?
问题2 :我正确地说域名表示我正在处理的知识领域,而应用层代表域中不存在的所有内容,但我想要提供,作为附加值?
(因此,如果我的软件只代表域名,那么应用程序层很薄,如果我的软件提供了很多非域功能,那么应用程序层很厚?)
添加个人信息1:我的项目是关于创建角色模拟器。因此,为了模拟一个角色,我必须代表它,以及它的所有依赖。我的域层责任是代表游戏。它包含像Character这样的类,有一些属性(Life,Mana,Attack,Defense,Class)和一些枚举(比如CharacterClass,它列出了所有可用的类)。
现在,我希望我自己的项目能够为用户提供创建项目的能力,该项目代表游戏的角色。该项目还允许用户保存其他信息,例如当前项目的名称,主(和辅助)设备组,主(和辅助)技能树。注释也可用于任何设备组和技能树,因此用户可以简单地使用内置备忘录/便利贴。辅助设备集和技能树,注释不是游戏中现有的概念(因此,我的域中不存在)。
在问题1中,“具有附加值的类”是一个角色项目,它是多个信息(角色设备,技能树,注释等)的集合。它可以保存在物理支持上,如果用户需要,可以在以后再次打开和编辑。
问题1的重新制定:我有一个Character类和一个CharacterProject类。 CharacterProject类是多个信息的组合。但它特定于我的应用程序。将它放在应用程序层,域层或其他地方是否有意义?
答案 0 :(得分:0)
对于您的第一个问题,我想评论并帮助您提供一些简单的设计指导。谦卑的意思相信你自担风险:D。
在为任何层或任何类型的软件设计类时,我通常用泛化爱(抽象/接口契约等)来处理它,你提到你的名字和描述是'值',它们将被添加到你的域中模拟核心对象,如“SkillTree”或“Character”,问问自己是否可以概括名称和描述类,例如IAdditiveInformation接口。如果这两个类的大部分内容可以在IAdditiveInfromation泛化下共享/签约,那么您就知道这也在您的域核心中。如果您在域模型的核心中使用此接口并将所有依赖关系指向此接口,则您不必回答困难和推测性设计问题,例如
用于决定放置域模型,域服务或应用层及其他类的类。我用这些作为指导。
让我举个例子,让它更容易理解。
想象一下基于gps的跟踪系统。
时间看到洋葱/ DDD的魔力并正确OOD :)。我没有告诉你应用程序是什么,我还没有决定应用程序。我没有决定捕获核心域和域服务,因为它们应该是独立于应用程序的(以理想化的体系结构方式)。
现在我们的洋葱核心,
您可以为此添加新示例。这是一件简单的事情,我想当我怀疑自己的决定时。
最后一点:您还应该了解在图层中放置类没有任何意义。我们只是将它们放在“虚拟”层中,以感受它们的责任和功能范围。如果有太多疑问只是把它放在某个地方,当你的架构或设计或实施发展时,你会觉得它是正确的位置。
第二个问题。
在我看来,你的建议是正确的。我唯一可以评论的是我不会在域层使用术语范围(我假设你的意思是域核心和域服务)。我认为域核心是计算机术语中现实世界知识的表示或其背后的核心理念。