11 Stimmen

DDD: Namenskonventionen für Domänenmodell-Namespace

Ich schreibe eine Anwendung mit einem Domänenmodell in PHP und frage mich, welche Benennungskonvention ich übernehmen sollte.

Angenommen, ich habe einen Kunde, der eine Adresse innerhalb seines Aggregatwurzels hat.
Ich habe auch ein Produkt, das eine Option innerhalb seines Aggregatwurzels hat.

Ich habe zwei Alternativen:

  1. Aggregatwurzeln im Wurzelverzeichnis des Domänenmodells belassen:

    Kunde
    Kunde\Adresse
    Produkt
    Produkt\Option

    Pro: Ich kann sowohl Kunde als auch Produkt im gleichen Namensraum verwenden
    Con: Kunde muss seine eigene Adresse als Kunde\Adresse referenzieren

  2. Alle Aggregatklassen im gleichen Namensraum gruppieren, einschließlich des Aggregatwurzels:

    Kunde\Kunde
    Kunde\Adresse
    Produkt\Produkt
    Produkt\Option

    Pro: Kunde kann seine Adresse als Adresse referenzieren
    Con: Aus meinem Stamm-Domänen-Namensraum muss ich wie folgt referenzieren:

    • Kunde als Kunde\Kunde
    • Produkt als Produkt\Produkt

5voto

Alfwed Punkte 3307

Ich habe vor einiger Zeit ein kleines Framework geschrieben und mich dafür entschieden, die erste Lösung zu verwenden, die du vorschlägst.

Behalte Aggregate Roots an der Wurzel des Domain-Modells:

Warum?

Eigentlich habe ich mir die gleiche Frage gestellt, die du heute stellst, und nach etwas Diskussion mit meinen Teamkollegen waren wir uns einig, dass es logischer erschien, den Klassennamen nicht im Namespace zu wiederholen.


Lass uns sehen, wie du deine Klassen mit Lösung Nr. 2 instanzierst

Customer\Customer
Customer\Address

Du musst schreiben:

$customer = new Customer\Customer();
$address = new Customer\Address();

Siehst du die Wiederholung? Es fühlt sich irgendwie nicht richtig an für mich. Meiner Meinung nach ist es wie

$customer->getCustomerId();

Warum den Kunden im Methodennamen wiederholen? Wir wissen, dass es die Kunden-ID ist, da wir ein Customer-Objekt verwenden.

Ein weiteres "schlechtes Ding" bei diesem Modell ist die Unmöglichkeit, reservierte Schlüsselwörter als Klassenname zu verwenden.

Zum Beispiel könntest du mit der Pear-Konvention die Klasse haben

Customer_Abstract

In Customer/Abstract.php, was für mich in Ordnung ist, aber wenn du versuchst, es mit einem Namespace zu übersetzen, erhältst du

namespace Customer;

class Abstract {}

was zu einem schwerwiegenden Fehler führt. Also müsstest du erneut das Domain im Klassennamen wiederholen:

namespace Customer;

class AbstractCustomer {}

$customer = new Customer\AbstractCustomer();

Jetzt sehen wir, wie du deine Klassen mit Lösung Nr. 1 instanzierst

Customer
Customer\Address

Du wirst schreiben:

$customer = new Customer();
$address = new Customer\Address();

Wir müssen den Kunden nicht mehr zweimal wiederholen, um die Customer-Klasse instanziiert. Es ist jedoch immer noch klar, dass Address mit Customer verbunden ist.

Das ist der Grund, warum ich mich für dieses Modell entschieden habe.

EDIT : Zend Framework 2 verwendet auch diese Konvention

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X