質問
複数のオブジェクトが関係する機能を実行する際に、 「教えて、尋ねるな」の原則を守るにはどうすればよいですか。
例 - レポートの生成
次のオブジェクトがあります(説明のみを目的としています):
車、馬、うさぎ
これらのオブジェクト間に関係はありませんが、これらのオブジェクトに基づいてレポートを生成したいと考えています:
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 ....) を生成する方法を、Rabbit が知る必要はないと思います。
最後に、レポートの生成中に、複数の項目をオンにしたい場合があります。
if (car.getWheels() == 4 || horse.getLegs() == 4)
// do something