题
执行涉及多个对象的功能时,如何遵循“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