Souvent, mes objets métier ont tendance à avoir des situations où les informations doivent traverser trop souvent les limites des objets. En faisant OO, nous voulons que les informations soient dans un objet et autant que possible tout le code traitant de ces informations devrait être dans cet objet. Cependant, les règles commerciales ne suivent pas ce principe, ce qui me pose problème.
À titre d'exemple, supposons que nous avons une commande qui a un certain nombre de OrderItems qui se réfère à un InventoryItem qui a un prix. J'appelle Order.GetTotal () qui résume le résultat de OrderItem.GetPrice () qui multiplie une quantité par InventoryItem.GetPrice (). Jusqu'ici tout va bien.
Mais ensuite, nous découvrons que certains articles sont vendus avec une offre deux pour un. Nous pouvons gérer cela en demandant à OrderItem.GetPrice () de faire quelque chose comme InventoryItem.GetPrice (quantité) et en laissant InventoryItem s'en occuper.
Cependant, nous découvrons ensuite que l'accord deux pour un ne dure que pour une période donnée. Cette période doit être basée sur la date de la commande. Maintenant, nous changeons OrderItem.GetPrice () pour être InventoryItem.GetPrice (quatity, order.GetDate ())
Mais ensuite, nous devons prendre en charge différents prix en fonction de la durée de vie du client dans le système: InventoryItem.GetPrice (quantité, order.GetDate (), order.GetCustomer ())
Mais il s'avère que les offres deux pour un s'appliquent non seulement à l'achat de plusieurs articles du même inventaire, mais à l'achat de plusieurs articles dans une catégorie d'inventaire. À ce stade, nous levons la main et donnons simplement à InventoryItem l'élément de commande et lui permettons de parcourir le graphique de référence de l'objet via des accesseurs pour obtenir les informations dont il a besoin: InventoryItem.GetPrice (this)
TL; DR Je veux avoir un faible couplage dans les objets, mais les règles métier m'obligent souvent à accéder à des informations de partout pour prendre des décisions particulières.
Existe-t-il de bonnes techniques pour y faire face? D'autres trouvent-ils le même problème?