gpt4 book ai didi

oop - "Tell, Don' t Ask”在多个域对象上

转载 作者:行者123 更新时间:2023-12-04 09:54:51 25 4
gpt4 key购买 nike

问题

我如何坚持"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 ,报告对象应该产生自己的结果。

关于oop - "Tell, Don' t Ask”在多个域对象上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9636847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com