Często moje obiekty biznesowe mają sytuacje, w których informacje zbyt często przekraczają granice obiektów. Kiedy robimy OO, chcemy, aby informacje były w jednym obiekcie i w miarę możliwości cały kod zajmujący się tymi informacjami powinien znajdować się w tym obiekcie. Jednak reguły biznesowe nie są zgodne z tą zasadą, co sprawia mi kłopoty.
Jako przykład załóżmy, że mamy Zamówienie, które ma wiele OrderItems, które odnoszą się do InventoryItem, który ma cenę. Wywołuję Order.GetTotal (), który sumuje wynik OrderItem.GetPrice (), który zwielokrotnia ilość przez InventoryItem.GetPrice (). Na razie w porządku.
Ale potem dowiadujemy się, że niektóre przedmioty są sprzedawane za dwie za jedną ofertę. Możemy sobie z tym poradzić, każąc OrderItem.GetPrice () zrobić coś takiego jak InventoryItem.GetPrice (ilość) i pozwalając InventoryItem sobie z tym poradzić.
Potem jednak dowiadujemy się, że umowa typu „dwa za jednego” trwa tylko przez określony czas. Ten okres musi być oparty na dacie zamówienia. Teraz zmieniamy OrderItem.GetPrice () na InventoryItem.GetPrice (quatity, order.GetDate ())
Ale potem musimy obsługiwać różne ceny w zależności od tego, jak długo klient był w systemie: InventoryItem.GetPrice (ilość, zamówienie.GetDate (), zamówienie.GetCustomer ())
Ale potem okazuje się, że oferty dwa w jednym dotyczą nie tylko zakupu wielu takich samych przedmiotów w ekwipunku, ale wielu dla dowolnego przedmiotu w kategorii InventoryCategory. W tym momencie podnosimy ręce i po prostu przekazujemy InventoryItem element zamówienia i pozwalamy mu poruszać się po wykresie odniesienia obiektu za pośrednictwem akcesoriów, aby uzyskać potrzebne informacje: InventoryItem.GetPrice (this)
TL; DR Chcę mieć niskie sprzężenie w obiektach, ale reguły biznesowe często zmuszają mnie do uzyskiwania dostępu do informacji z całego miejsca w celu podejmowania konkretnych decyzji.
Czy istnieją dobre techniki radzenia sobie z tym? Czy inni znajdują ten sam problem?