oop – “告诉,不要问”多个域对象

前端之家收集整理的这篇文章主要介绍了oop – “告诉,不要问”多个域对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

解决方法

报告应该保持创造自我的能力.

在这种情况下,每个IReportable对象都应该实现void UpdateReport(Report aReport).

调用Report.CreateReport(List< Reportable> aList)时,它会迭代List,并且它自己的UpdateReport实现中的每个对象都会调用

aReport.AddCar(serialNumber)
aReport.AddHorse(horseName)

在CreateReport结束时,报表对象应该生成自己的结果.

原文链接:https://www.f2er.com/html/226537.html

猜你在找的HTML相关文章