Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 贫血模型vs DTO vs活动记录_Design Patterns_Architecture_Dto_Separation Of Concerns_Anemic Domain Model - Fatal编程技术网

Design patterns 贫血模型vs DTO vs活动记录

Design patterns 贫血模型vs DTO vs活动记录,design-patterns,architecture,dto,separation-of-concerns,anemic-domain-model,Design Patterns,Architecture,Dto,Separation Of Concerns,Anemic Domain Model,我不太清楚如何设计一个类: 国家: 这种反模式的根本恐怖之处在于它是如此的相反 面向对象设计的基本思想;哪一个是合并 数据并一起处理。贫血领域模型只是一个简单的模型 程序化风格的设计,正是那种对象偏执的东西 像我一样。。。从我们在Smalltalk的早期开始就一直在战斗。 更糟糕的是,许多人认为贫血的物体是真实的物体, 因此完全忽略了面向对象设计的意义 到处都是。在贫乏的领域设计中,业务逻辑通常是 在单独的类中实现,这些类转换 域对象。Fowler调用这样的外部类事务 脚本。此模式是Java

我不太清楚如何设计一个类:

  • 国家:
这种反模式的根本恐怖之处在于它是如此的相反 面向对象设计的基本思想;哪一个是合并 数据并一起处理。贫血领域模型只是一个简单的模型 程序化风格的设计,正是那种对象偏执的东西 像我一样。。。从我们在Smalltalk的早期开始就一直在战斗。 更糟糕的是,许多人认为贫血的物体是真实的物体, 因此完全忽略了面向对象设计的意义 到处都是。在贫乏的领域设计中,业务逻辑通常是 在单独的类中实现,这些类转换 域对象。Fowler调用这样的外部类事务 脚本。此模式是Java应用程序中的常见方法, 可能受到EJB早期版本等技术的鼓励 实体bean,以及.NET应用程序中的 三层服务应用程序体系结构,其中 属于“商业实体”类别(尽管是商业实体 实体也可以包含行为)

数据传输对象与业务对象或 数据访问对象是指DTO除了 用于存储和检索自己的数据(存取器和变异器)。 DTO是不应包含任何业务逻辑的简单对象 这需要测试

  • 图案
参考维基百科

  • 现在也请参考本问答:
看起来,DTO应该只用于在Web服务之间共享数据,但是,同时,知道它们在数据库上的持久性的活动记录也是不好的


那么,在包含从数据库获取的数据的类中应该放哪种逻辑呢?

您应该有自己的域实体。您可以在持久性层中使用活动记录。将其视为一个数据库表,没有任何功能,只能从数据库中保存和检索对象。然后,您可以使用AR中的数据创建域实体的工厂。现在您可以自由地使用多态性、设计模式,并将oop原则应用于域实体

我们的想法不是将逻辑放入AR类中。使用它们只是因为您不想编写直接SQL查询

用户AR映射到用户表,但工厂可以根据该数据构建订户或用户。我在这篇博文中写了一点:

让我们来了解一些概念:

  • 域模型:包含业务规则的模型。它由表示业务及其流程使用的概念的对象组成

  • DTO:顾名思义,数据传输对象是将数据从域模型传递到域模型的一种方式。DTO在应用程序的不同层上有多种用途:

    • 资源:是从RESTful API返回的DTO

    • DAO:DTO是发送到持久层并从持久层返回的

    • 视图模型:DTO发送到表示层上的视图并从中返回

因此,您可以看到,DTO是一个非常通用的概念,它在应用程序中以多种方式实现

域模型由业务对象(也称为域对象)组成。它不是由DTO组成的

这些对象必须强制执行业务规则,并通过公开方法来实现这一点。如果将这些规则放在其他地方,域对象必须公开其内部数据(实际上成为DTO),以便包含逻辑的对象可以处理它

经验证明,这很难维护和更改以适应未来的需求。这也违背了面向对象的原则。这就是为什么它被认为是一种反模式,甚至被命名为贫血域模型。

这个“对”的东西实际上并不适用。贫血的反面不是activerecord,请注意,本文讨论的是是否存在业务逻辑,而不是持久性功能。这里真的没有一个问题,而是几个混杂在一起的问题。