题
执行涉及多个对象的功能时,如何遵循“Tell,Don’t Ask”原则.
示例 – 生成报告
我有以下对象(仅用于说明目的):
Car,Horse,Rabbit
这些对象之间没有关系,但我确实希望基于这些对象生成报告:
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