在阅读有关 GRASP 模式的信息时,我停在 Information Expert,它指出类状态上的行为应该在同一个类中。但这与我多年来使用的服务层模式完全相反。服务具有域对象状态的行为。这让我感到困惑
我将不胜感激周到的回答。
在阅读有关 GRASP 模式的信息时,我停在 Information Expert,它指出类状态上的行为应该在同一个类中。但这与我多年来使用的服务层模式完全相反。服务具有域对象状态的行为。这让我感到困惑
我将不胜感激周到的回答。
好问题。
信息专家是关于包含数据的对象(聚合、实体、值对象),并且操作主要取决于它们拥有的数据。
一个简单的例子:假设你有一个Customer
类,你想生成客户的全名。而不是有一个类:
class SomethingService {
String customerFullName(Customer customer) {
return "${customer.firstName()} ${customer.lastName()}";
}
}
更好的方法是在客户类本身中使用该方法,因为客户类具有所需的所有数据。在某种程度上,这与Feature Envy Antipattern正好相反。
关于服务层,这可以看作是GRASP 术语中的纯制造。需要注意的是,在 DDD 之类的东西中,有应用程序服务(非常类似于四人帮中的门面或端口和适配器架构中的端口)和域服务(域的内部服务,它并不真正适合任何其他类)。我对后者的看法是,如果我需要添加一些功能但没有明确的地方应该去哪里,它最终会出现在一个新的域服务中。我希望这很清楚!