【问题标题】:Domain or application layer for some classes in DDDDDD 中某些类的域或应用层
【发布时间】:2013-08-21 14:55:08
【问题描述】:

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 为了让我们回答问题1,您应该更具体地了解域概念及其作用:存在哪些类型的字符?存在哪些类型的技能?角色能做什么?技能如何影响角色?领域模型是业务逻辑的运行描述(在这种情况下是游戏规则):它应该是领域(游戏)专家可读的!因此,问题 2 的答案是否定的。
  • @Giacomo 补充资料1已写,第一个问题已改写。
  • 我认为 CharacterProject 肯定不是游戏中的域对象,但它是您应用程序中的域对象。

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


【解决方案1】:

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

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

之类的困难和推测性设计问题
  • 我会添加更多的“价值”类吗?
  • 会有更多的“GamePart”类吗?
  • 如何设计我的“value”和“GamePart”类,以便以最少的努力实现它们的交互。

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

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

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

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

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

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

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

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

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

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

关于你的第二个问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-17
    • 2022-10-17
    • 2015-07-17
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多