【发布时间】:2012-03-09 15:44:12
【问题描述】:
问题
在执行涉及多个对象的功能时,如何遵守"Tell, Don't Ask" 原则。
示例 - 生成报告
我有以下物品(仅供说明):
车马兔
这些对象之间没有关系,但我确实想根据这些对象生成一个报告:
createHtmlReport(Car car, Horse horse, Rabbit rabbit){
Report report = new Report()
report.setSomeField(car.getSerialNumber())
report.setAnotherField(horse.getNumberOfLegs())
// ...etc
}
这种方法的问题是它必须从每个对象中“提取”数据,这违反了“告诉,不问”规则。我宁愿隐藏每个对象的内部,让它们为我生成报告:
car.createHtmlReport()
horse.createHtmlReport()
rabbit.createHtmlReport()
...但后来我收到了 3 份部分报告。此外,我认为 Rabbit 不必知道如何生成我需要的每一个报告(HTML、JMS、XML、JSON ......)。
最后,在生成报告时,我可能想要打开多个项目:
if (car.getWheels() == 4 || horse.getLegs() == 4)
// do something
【问题讨论】:
-
+1 & fav 链接和问题。
标签: oop domain-driven-design tell-dont-ask