1

在阅读有关 GRASP 模式的信息时,我停在 Information Expert,它指出类状态上的行为应该在同一个类中。但这与我多年来使用的服务层模式完全相反。服务具有域对象状态的行为。这让我感到困惑

我将不胜感激周到的回答。

4

1 回答 1

1

好问题。

信息专家是关于包含数据的对象(聚合、实体、值对象),并且操作主要取决于它们拥有的数据。

一个简单的例子:假设你有一个Customer类,你想生成客户的全名。而不是有一个类:

   class SomethingService {
     String customerFullName(Customer customer) {
       return "${customer.firstName()} ${customer.lastName()}";
     }
   }

更好的方法是在客户类本身中使用该方法,因为客户类具有所需的所有数据。在某种程度上,这与Feature Envy Antipattern正好相反。

关于服务层,这可以看作是GRASP 术语中的纯制造。需要注意的是,在 DDD 之类的东西中,有应用程序服务(非常类似于四人帮中的门面或端口和适配器架构中的端口)和域服务(域的内部服务,它并不真正适合任何其他类)。我对后者的看法是,如果我需要添加一些功能但没有明确的地方应该去哪里,它最终会出现在一个新的域服务中。我希望这很清楚!

于 2021-11-22T19:48:35.010 回答