Oft haben meine Geschäftsobjekte Situationen, in denen Informationen zu oft Objektgrenzen überschreiten müssen. Wenn Sie OO ausführen, möchten wir, dass sich Informationen in einem Objekt befinden und dass sich der gesamte Code, der sich mit diesen Informationen befasst, so weit wie möglich in diesem Objekt befindet. Die Geschäftsregeln folgen jedoch nicht diesem Prinzip, was mir Probleme bereitet.
Nehmen wir als Beispiel an, wir haben eine Bestellung mit einer Anzahl von OrderItems, die sich auf ein InventoryItem mit einem Preis bezieht. Ich rufe Order.GetTotal () auf, das das Ergebnis von OrderItem.GetPrice () summiert, das eine Menge mit InventoryItem.GetPrice () multipliziert. So weit, ist es gut.
Aber dann stellen wir fest, dass einige Artikel mit zwei für einen Deal verkauft werden. Wir können dies bewältigen, indem OrderItem.GetPrice () so etwas wie InventoryItem.GetPrice (Menge) ausführt und InventoryItem damit umgehen lässt.
Dann stellen wir jedoch fest, dass der Zwei-für-Eins-Deal nur für einen bestimmten Zeitraum gilt. Dieser Zeitraum muss auf dem Datum der Bestellung basieren. Jetzt ändern wir OrderItem.GetPrice () in InventoryItem.GetPrice (quatity, order.GetDate ())
Aber dann müssen wir unterschiedliche Preise unterstützen, je nachdem, wie lange der Kunde im System ist: InventoryItem.GetPrice (Menge, Bestellung.GetDate (), Bestellung.GetCustomer ())
Es stellt sich jedoch heraus, dass die Zwei-für-Eins-Angebote nicht nur für den Kauf mehrerer Artikel desselben Inventargegenstands gelten, sondern für mehrere Artikel in einer Inventarkategorie. An diesem Punkt erheben wir unsere Hände und geben dem InventoryItem einfach die Bestellposition und lassen es über Accessoren über das Objektreferenzdiagramm fahren, um die benötigten Informationen zu erhalten: InventoryItem.GetPrice (this)
TL; DR Ich möchte eine geringe Kopplung in Objekten haben, aber Geschäftsregeln zwingen mich oft dazu, von überall auf Informationen zuzugreifen, um bestimmte Entscheidungen zu treffen.
Gibt es gute Techniken, um damit umzugehen? Finden andere das gleiche Problem?