Vor kurzem habe ich rücksichtslos angefangen, DDD zu studieren, aber es gibt nur wenige Beispiele für Python ...! Damit ・ Organisieren Sie Ihre Gedanken zu DDD ・ Schlagen Sie ein Beispiel für das Schreiben in Python vor Ich beschloss, einen Artikel zu diesem Zweck zu schreiben. Zur Zeit schreibe ich über das Wertobjekt, das am einfachsten zu erreichen scheint.
Es gibt viele Artikel, die für andere Menschen sehr leicht zu verstehen sind, deshalb werde ich sie Ihnen geben, aber wenn Sie sie kurz schreiben, ValueObject ist "ein Wert, der mit einer Klasse ausgedrückt wird, nicht mit einem primitiven Typ wie int, sondern mit dem erwarteten Verhalten und der Art zu sein". Man kann sagen, dass ein vollständiger Konstruktor eine Methode ist, um "erwartetes Verhalten" zu erreichen oder umgekehrt "kein unerwartetes Verhalten zu verursachen". (Ich verstehe das ... ist es richtig ...?)
Wenn Sie beispielsweise "Betrag" ausdrücken möchten, können Sie sagen, dass dies kein negativer Wert ist. ValueObject ist eine Klasse, die das zu erwartende Verhalten definiert. Beschreiben Sie den obigen "es wird kein negativer Wert sein" im Konstruktor. Es ist ein vollständiger Konstruktor, der erkennt, dass "Werte, die nicht existieren sollten, nicht existieren".
Da wir im vorherigen Abschnitt über den Geldbetrag gesprochen haben, schreiben wir ihn kurz am Beispiel des Geldbetrags.
import dataclasses
@dataclasses.dataclass
class Money:
#Ich werde nicht auf Details eingehen, aber die hier aufgeführten Variablen gelten für reguläre Klassen.__init__Es wird eine Instanzvariable sein, die in beschrieben wird
amount: int
# __post_init__Ist__init__Dies ist der Prozess, der danach ausgeführt wird.
#Der Ausdruck des vollständigen Konstruktors wird hier beschrieben.(2020/5/9 Ein Fehler wurde behoben)
def __post_init__(self):
if self.amount < 0:
raise ValueError()
Jetzt kann es kein Geldobjekt mit einem negativen Wert geben, Es gibt nur Money-Objekte, die garantiert die richtigen Werte haben. (Ich denke, es gibt andere Einschränkungen, die auferlegt werden sollten, aber dieses Mal werde ich auf diese Ebene übergehen)
Sie können Klassen auch mithilfe von Datenklassen unveränderlich machen. Unveränderlich macht eine Neuzuweisung unmöglich und verbessert die Codesicherheit. (Wertobjekt scheint im Grunde etwas zu sein, das unveränderlich sein sollte) Python ist eine wichtige Funktion, da es nur wenige Möglichkeiten gibt, eine Neuzuweisung zu Instanzvariablen zu verhindern.
import dataclasses
# frozen=True macht es unveränderlich
@dataclasses.dataclass(frozen=True)
class Money:
amount: int
def __post__init__(self):
if amount < 0:
raise ValueError()
Wenn Sie es nach der Instanziierung unveränderlich machen, kann der Wert nicht geändert werden, selbst wenn der Betrag zunimmt oder abnimmt. Erstellen Sie nun eine neue Instanz mit dem Wert des Betrags nach der Erhöhung oder Verringerung, um die Erhöhung oder Verringerung des Betrags auszudrücken. Methoden können wie reguläre Klassen geschrieben werden.
import dataclasses
@dataclasses.dataclass(frozen=True)
class Money:
amount: int
def __post__init__(self):
if amount < 0:
raise ValueError()
def lost(self, loss):
return Money(self.amount - loss.amount)
#Schreiben Sie zum Beispiel so
money1 = Money(1000)
money2 = Money(100)
left_money = money1.lost(money2)
Dasselbe kann mit der herkömmlichen Beschreibungsmethode gemacht werden, daher ist dies nicht unbedingt erforderlich. Jedoch, ・ Kann unveränderlich sein ・ Der Umfang der Beschreibung des Konstruktors kann reduziert werden. -Die Beschreibung der Instanzvariablen und die Beschreibung der Logik, um sie zu einem vollständigen Konstruktor zu machen, können getrennt werden, um die Anzeige zu erleichtern. Insofern habe ich den Eindruck, dass es besser ist, Datenklassen zu verwenden. Da Datenklassen verschiedene andere Funktionen haben, möchte ich sie nicht nur für ValueObject verwenden.
Dieses Mal habe ich eingeführt, dass ValueObject auch in Python ausgedrückt werden kann, indem man so schreibt. Da ich gerade mit dem Studium begonnen habe, ist die Erklärung zu ValueObject selbst dünn, aber wenn Sie Ihr Verständnis vertiefen Ich möchte ergänzende Artikel und Artikel über Entitäten schreiben.
Informationen zur Verwendung von Datenklassen finden Sie hier. https://docs.python.org/ja/3.7/library/dataclasses.html
Recommended Posts