Вопрос
Как придерживаться принципа «Говори, не спрашивай» при выполнении функции, включающей несколько объектов.
Пример - создание отчета
У меня есть следующие объекты (только для иллюстрации):
Автомобиль, Лошадь, Кролик
Между этими объектами нет никакой связи, но я хочу создать отчет на основе этих объектов:
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 частичных отчета.Кроме того, я не думаю, что Кролик должен знать, как генерировать каждый отдельный отчет, который мне нужен (HTML, JMS, XML, JSON ....).
Наконец, при создании отчета я могу включить несколько элементов:
if (car.getWheels() == 4 || horse.getLegs() == 4)
// do something