知识卡片

对象应作为行为的协作者而非数据提供者

普通读书笔记卡 · 1979.j

内容

Cashier 向 Customer 收钱的例子:若 Cashier 取出 Customer 的 Wallet 自行判断余额并扣钱,协作很不合理(顾客暴露钱包隐私,收银员像劫匪)。根源在于 Customer 仅作为数据提供者提供了 Wallet 数据。正解是把支付行为“归还”给 Customer(customer.pay(payment)),二者只关注协作行为的接口、不了解实现细节——这正是封装的“隐藏细节”。发散:当一个方法的绝大部分操作都是别的对象的数据时,职责多半分配错了,应把行为移到数据的拥有者身上。

参考来源

- 位置:《解构领域驱动设计》附录A A.2.1(源文件:_epub-src/OEBPS/034.xhtml) - 结论依据:原文以超市支付场景说明对象作为数据提供者导致的不合理协作,及把行为归还数据拥有者的修正。 - 原始内容:参与协作的Customer对象仅仅作为数据提供者,为Cashier对象提供了Wallet数据……应该将这些特性“归还”给Customer对象。