富域模型是否意味着大域 类 是可以接受的?
Do Rich Domain Models mean large domain classes are acceptable?
我阅读了很多有关 SOLID 和领域驱动设计的文章,然后是关于贫血领域模型和富领域模型的争论。我个人更喜欢对象封装自己的领域知识的方法,但是由于似乎存在一些意见分歧,我有一些问题:
- 根据系统的类型,主域 classes 可能会变得相当大,即使方法的逻辑在单独的 classes 中也是如此。在这里忽略单一责任主体是否普遍可以接受,或者是否有一种方法可以将具有 50 个字段和 50 个方法的订单封装到一个不会给您留下 1mb class 的漂亮结构中,或者这是考虑到封装方法可以接受吗?
- 在尝试维护富领域模型和封装时,是否有任何关于领域服务甚至领域工厂仍应包含哪些内容的指南或经验法则?
建议零售价始终适用。我会问自己这个实体作为一个整体是否有意义,或者如果你能够找到一些内部子结构并以这种方式拆分它,它会更容易理解和使用它。
如果您有一个 50 字段的订单,它实际上可能是一个 class 典型案例,其中 bounded contexts 适用,即不同的子系统可以不同地查看订单,并且只有部分每个子系统都需要订单。
对于"Domain Factory",经验法则是它包含与对象创建相关的任何内容。
对于"Domain Service",它似乎是一堆逻辑上不适合实体的无状态逻辑。 see this.
P.S。我认为任何软件设计方法都不能接受 1 MB class(10K 行或更多代码)(除非它是生成的代码,因此不适合人类使用)。不幸的是,有时由于缺乏设计规划、害怕重构或故意遗漏(推迟技术债务的决定),代码会意外地达到该状态。这取决于应用程序和编程语言,但我个人的经验是,如果 class 达到 1K 行,甚至更早一点,就开始担心并改进设计。
拥有一个具有 50 个方法的对象是永远不能接受的,而使用 "rich" 对象并不会真正导致这种情况。如果你有,你可以使用重构的标准方法来解决问题。
SRP 有多种解释,但其中一种解释是 "things that change together should be together"。 IE。 "legal" 将 具有凝聚力 的东西合二为一 class。以下是关于此的更多详细信息:Single Responsibility Principle.
如果您进行 "rich" 建模,即面向对象,则不应使用服务。服务是无状态的脚本(即过程),通常从其他对象访问数据并对其执行某些操作并将其放回其他对象。除了 conceptual/modeling 问题,它还会导致各种实际问题。这是一个包含更多细节的演示文稿:Object-Oriented Domain-Driven-Design.
另外,我通过 Vaughn Vernon's repository 寻找 how/why 服务被使用,我发现 none 的功能没有 更好 放置在一个真实的对象中。
工厂有点不同,它们是抽象构造的纯技术事物,应该只包含构造代码。
我阅读了很多有关 SOLID 和领域驱动设计的文章,然后是关于贫血领域模型和富领域模型的争论。我个人更喜欢对象封装自己的领域知识的方法,但是由于似乎存在一些意见分歧,我有一些问题:
- 根据系统的类型,主域 classes 可能会变得相当大,即使方法的逻辑在单独的 classes 中也是如此。在这里忽略单一责任主体是否普遍可以接受,或者是否有一种方法可以将具有 50 个字段和 50 个方法的订单封装到一个不会给您留下 1mb class 的漂亮结构中,或者这是考虑到封装方法可以接受吗?
- 在尝试维护富领域模型和封装时,是否有任何关于领域服务甚至领域工厂仍应包含哪些内容的指南或经验法则?
建议零售价始终适用。我会问自己这个实体作为一个整体是否有意义,或者如果你能够找到一些内部子结构并以这种方式拆分它,它会更容易理解和使用它。
如果您有一个 50 字段的订单,它实际上可能是一个 class 典型案例,其中 bounded contexts 适用,即不同的子系统可以不同地查看订单,并且只有部分每个子系统都需要订单。
对于"Domain Factory",经验法则是它包含与对象创建相关的任何内容。
对于"Domain Service",它似乎是一堆逻辑上不适合实体的无状态逻辑。 see this.
P.S。我认为任何软件设计方法都不能接受 1 MB class(10K 行或更多代码)(除非它是生成的代码,因此不适合人类使用)。不幸的是,有时由于缺乏设计规划、害怕重构或故意遗漏(推迟技术债务的决定),代码会意外地达到该状态。这取决于应用程序和编程语言,但我个人的经验是,如果 class 达到 1K 行,甚至更早一点,就开始担心并改进设计。
拥有一个具有 50 个方法的对象是永远不能接受的,而使用 "rich" 对象并不会真正导致这种情况。如果你有,你可以使用重构的标准方法来解决问题。
SRP 有多种解释,但其中一种解释是 "things that change together should be together"。 IE。 "legal" 将 具有凝聚力 的东西合二为一 class。以下是关于此的更多详细信息:Single Responsibility Principle.
如果您进行 "rich" 建模,即面向对象,则不应使用服务。服务是无状态的脚本(即过程),通常从其他对象访问数据并对其执行某些操作并将其放回其他对象。除了 conceptual/modeling 问题,它还会导致各种实际问题。这是一个包含更多细节的演示文稿:Object-Oriented Domain-Driven-Design.
另外,我通过 Vaughn Vernon's repository 寻找 how/why 服务被使用,我发现 none 的功能没有 更好 放置在一个真实的对象中。
工厂有点不同,它们是抽象构造的纯技术事物,应该只包含构造代码。