Dois-je mettre la logique de calcul dans une entité ou dans la couche métier?

15

Récemment, j'ai été confronté à une question de savoir si un calcul simple devait être placé dans la couche Entité, ou si l'entité devait être pure pour simplement stocker les données brutes et laisser les logiques de calcul dans la couche métier.

Ma question est donc de savoir s'il est judicieux d'encapsuler des calculs simples dans les propriétés d'une classe d'entités?

Kata
la source

Réponses:

21

Cela dépend du type d'architecture que vous souhaitez.

  • Dans la conception pilotée par domaine, vous créeriez un modèle de domaine qui aurait à la fois des données et des fonctionnalités.

Cela signifierait qu'un Orderpossède une propriété (ou une méthode) qui retournerait le prix total de la commande en fonction du OrderLines. Le Orderaurait également une méthode AddOrderItem(Product product, int amount)et Ordervérifierait s'il existe déjà un OrderLinepour ce produit spécifique.

Dans un tel modèle, vous auriez également des objets qui ne sont pas de véritables entités, comme un Repositorypour accéder aux données ou un Factorypour créer des entités. Ils sont appelés services de domaine. Une couche d'application est chargée d'appeler les services de domaine (par exemple pour récupérer une entité de la base de données), puis elle exécutera des fonctionnalités sur l'entité. Le Application Layerdevrait être aussi mince que possible.

Ceci est un bel article sur DDD qui explique ces concepts plus en détail.

  • Vous pouvez également utiliser un modèle de domaine anémique . Cela signifie que vos entités sont constituées de propriétés get / set et ne contiennent aucun comportement. Dans une telle conception, votre couche métier contiendra le comportement, tel que le calcul du Orderprix et la vérification des doublons OrderLines.

Il existe différentes opinions quant à savoir si un modèle de domaine anémique est une mauvaise chose. Personnellement, je préfère un vrai modèle de domaine.

Cet article décrit les différences entre un modèle de domaine anémique et non anémique.

Wouter de Kort
la source
Salut Wouter, merci pour la réponse et les liens. Il me semble que je suis confronté à une mentalité erronée selon laquelle, lorsqu'il est utilisé le modèle de domaine anémique, toutes les logiques métier (même les plus simples) doivent être placées dans la couche métier. Cela semble insensé dans certains cas où les logiques métier dépendent vraiment du modèle lui-même. Par exemple, une propriété est calculée à partir des propriétés existantes dans le modèle. Je n'ai pas trouvé de raison raisonnable de mettre les logiques métier qui dépendent toutes du modèle lui-même dans la couche métier.
Dans un modèle de domaine anémique, comme nous avons des classes métier ainsi que des classes d'entité, comment nommer les classes correctement pour éviter d'être confondu entre elles? Suggérez-vous d'utiliser des suffixes? Si oui, pourriez-vous donner un exemple?
Kwadz
Pour DDD, que faire si la logique de calcul des prix est compliquée? Par exemple, le prix est basé sur le lieu (taxe), les informations utilisateur (remise sur la date de naissance, remise sur l'adhésion), le coupon, la carte de crédit (remise spéciale sur la carte de crédit), etc. Comment pouvons-nous mettre une telle logique dans la Orderclasse?
Sher10ck
1
Votre agrégat de commande doit contenir toutes ces informations nécessaires pour effectuer le calcul. Parce que d'après votre description, cela devrait en fait faire partie de l'agrégat. Mais si la logique devient vraiment complexe et que vous pourriez avoir besoin de la changer, je transmettrais la calculatrice en tant qu'objet au constructeur d'entité et laisserais l'entité utiliser la calculatrice en interne pour fixer le prix.
burzum
Anémique ... le domaine pauvre sonne comme s'il souffrait d'une sorte de maladie. Ne préférez-vous pas être conduit?! Ouais!
Matt Jenkins
1

Eh bien, les objets entité et métier sont presque les mêmes, la plupart du temps. Par exemple, si vous avez une classe de produit et que vous souhaitez exposer une propriété qui prend une propriété existante dans la classe de produit et effectue un calcul, puis l'expose. C'est bien dans le terme que, la logique de création de cette propriété reste avec la classe.

Maintenant, la question peut se poser, où placer votre classe de couches métier. Je préfère utiliser la classe de couche métier qui a une certaine logique pour traiter les problèmes métier. Par exemple, dans votre exemple de produit, un problème commercial pourrait être de facturer de l'argent en utilisant un fournisseur tiers comme paypal.

Une chose clé à retenir est qu'une entité aurait toujours une identité mais un objet métier est une entité sans identification. Par exemple, le produit est une entité mais l'argent n'aurait pas d'identité. 1000 instances d'argent différentes seraient identiques.


la source
Oui. Si la logique métier de la propriété dépend entièrement des propriétés existantes sur le même modèle, il serait préférable d'ajouter simplement la propriété dans le modèle. Cela aiderait à perdre le couple inutile avec la couche de gestion pour les propriétés calculées.