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