2017-10-02 2 views
0

Dans le domaine que je suis en train de modéliser, il y a 2 classes: ClothingType et TreatmentTypeComment modéliser ce domaine? DDD

public class ClothingType : Entity<Guid> 
{ 
    public string Name { get; protected set; } 

    public ClothingType(Guid id, string name) 
     : base (id) 
    { 
     Name = name; 
    } 
} 

public class TreatmentType : Entity<Guid> 
{ 
    public string Name { get; protected set; } 

    public TreatmentType(Guid id, string name) 
     : base(id) 
    { 
     Name = name; 
    } 
} 

A ClothingType (t-shirt, pantalon, etc.) supportent de nombreux types de (lavage, fer TreatmentType, etc). Et un type de TreatmentType peut être pris en charge par de nombreux types de vêtements. Mais, le prix d'un TreatmentType spécifié varie selon ClothingType.

Imaginez deux types de traitements: laver et repasser. Dans les t-shirts, le lavage coûte 20 $, le pantalon coûte 35 $ et ainsi de suite. Comment modéliser cela?

Merci d'avance.

+0

Je peux identifier deux contextes délimités: Vêtements et la commande avec couche anti-corruption entre eux –

+0

J'ai une classe TreatmentOrder appartenant au ClothesTreatment-bounded-context (mais cela a du sens appartenant à ClothesTreatmentOrdering): https://pastebin.com/NRF1QxQp –

+0

Ne pensez pas aux classes tant que vous n'avez pas identifié correctement les contextes liés. Êtes-vous sûr de cela (ClothesTreatmentOrdering ???)? La commande de bc peut être facilement un sous-domaine générique et implémentée à l'aide d'une solution off-the-shell. –

Répondre

0

Découvrez l'approche d'Alberto Brandolini dans le cadre du programme Event Storming afin de découvrir le domaine auquel vous faites face. La facturation fait-elle partie de votre contexte de base? Si c'est juste un produit de commerce électronique habituel avec un prix, vous devez commencer par définir ClothingType et TreatmentType comme objets de valeur. Je ne suis pas expert Java mais en PHP, il ressemblerait à ceci:

class Cloth { 

    /** @var ClothingType */ 
    private $type; 

    /** @var TreatmentType[]|array */ 
    private $treatments; 

    ... 
} 

Vérifiez également le modèle de l'argent parce que ce pourrait être utile lors de la création de vos ValueObjects.

Je suggère de ne pas plonger dans DDD (en particulier dans la phase tactique) sans une légère compréhension de ses principes. Au moins, essayez de lire DDD distillé de Vaughn.

EDIT: Donner une seconde pensée, je conception plus ou moins comme ceci:

class Treatment { 
    /** @var TreatmentId */ 
    private $treatmentId;   

    /** @var TreatmentType */ 
    private $type; 

    /** @var Money */ 
    private $price; 

    //constructor, getters, etc. 

    public function modifyPrice(int $amount) 
    { 
     $this->price = new Money($amount); 
    } 
} 

class Cloth { 
    /** @var ClothType */ 
    private $type; 

    /** @var Treatment[]|array */ 
    private $treatments; 

    public function addTreatment(Treatment $aTreatment) 
    { 
     array_push($this->treatments, $aTreatment); 
    } 
} 
+0

Merci mon pote (je lirai le livre et verrai l'événement prendre d'assaut). Je viens de faire le cours DDD Fundamentals à Pluralsight. Mon contexte lié implique une facture (c'est la racine agrégée). Je modélise un domaine pour une lessive. ClothingType doit être une entité, car l'utilisateur doit en ajouter de nouveaux si nécessaire, et en même temps spécifier les traitements supportés pour le ClothingType (et les prix bien sûr). –

+0

Si vous partez de zéro, je vous suggère de commencer par le domaine de base: qu'est-ce qui rend l'entreprise dynamique? Je ne considérerais pas la facturation de la partie de celui-ci. Vous devriez commencer à vous demander ce qui se passe lorsqu'un 'Client' place son' Order' - du début à la fin. Je suppose que seul 'Employee 'pourrait modifier' ClothingType'. Si c'est une entité, vous pourriez envisager de passer l'UUID 'ClothingTypeId' à votre objet' Cloth', parce que c'est un objet de valeur - c'est unique.Votre 'ClothingType' pourrait avoir' ClothingTypeId, nom, UserId, costModifier, createdAt, updatedAt' etc –

+0

Merci, quelle bonne idée. Le domaine principal serait ClothesTreatment, les clients fabriquent ClothesTreatmentOrders au cas où. Seuls les employés peuvent créer et modifier de nouveaux types de produits de traitement. Comment fonctionnerait costModifier? Comment puis-je déterminer le coût du type de traitement en fonction du type de tissu choisi? –

1

Type de vêtement et type d'entité sont probablement des valeurs, plutôt que des entités.

Il peut y avoir un catalogue de produits, ou un analogue, avec des méthodes de requête qui prennent un type de vêtement et un type d'entité comme entrées et fournissent une estimation de prix en tant que sortie. Si vous aviez besoin de cette estimation de prix dans votre logique de domaine, vous obtiendriez probablement cela via un service de domaine qui permettait au modèle d'accéder à une copie récente du catalogue de produits pour rechercher les prix.

+0

Je suis en train de modéliser un domaine pour une lessive. Il n'y a pas de catalogue de produits. Mais néanmoins, c'est une bonne idée, le prix devra entrer dans la base de données. Alors, comment gérer cela dans un service de domaine? Ils ne peuvent avoir aucune connaissance de la persistance. –