[Python] Generieren Sie ValueObject mit dem vollständigen Konstruktor mithilfe von Datenklassen

Einführung

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.

Was ist ein ValueObject und ein vollständiger Konstruktor ...

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".

Versuchen Sie, ValueObject mit Datenklassen auszudrücken

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)

Mach es unveränderlich

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()

Wie man die Änderung des Betrags ausdrückt

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)

Soll ich Datenklassen verwenden?

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.

Schließlich

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.

Referenz

Informationen zur Verwendung von Datenklassen finden Sie hier. https://docs.python.org/ja/3.7/library/dataclasses.html

Recommended Posts

[Python] Generieren Sie ValueObject mit dem vollständigen Konstruktor mithilfe von Datenklassen
Erstellen Sie ein Verzeichnis mit Python
Erstellen Sie mit tkinter eine Python-GUI
Erstellen Sie eine virtuelle Umgebung mit Python!
Erstellen Sie mit Class einen Python-Funktionsdekorator
Erstellen Sie mit Python + PIL ein Dummy-Image.
[Python] Erstellen Sie mit Anaconda eine virtuelle Umgebung
Erstellen wir mit Python eine kostenlose Gruppe
[Python] Erstellen Sie eine Stapelumgebung mit AWS-CDK
Erstellen Sie mit Python 3.4 einen Worthäufigkeitszähler
Erstellen Sie mit Mecab aus Python3 ein Tool, das Furigana automatisch mit HTML schüttelt
Erstellen Sie mit dem Python-Anforderungsmodul einen Datensatz mit Anhängen in KINTONE
Erstellen Sie mit tkinter [Python] einen Rahmen mit transparentem Hintergrund.
Erstellen Sie eine GIF-Datei mit Pillow in Python
Erstellen Sie mit Minette für Python einen LINE BOT
Erstellen Sie eine virtuelle Umgebung mit conda in Python
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
[Hinweis] Erstellen Sie mit Python eine einzeilige Zeitzonenklasse
Sie können auch mit Python problemlos eine GUI erstellen
Erstellen Sie mit Sublime Text3 eine Python3-Build-Umgebung
Erstellen Sie eine Webmap mit Python und GDAL
Erstellen Sie eine Farbleiste mit Python + Qt (PySide)
Schritte zum Erstellen eines Twitter-Bots mit Python
Erstellen Sie mit Python einen Entscheidungsbaum von 0 (1. Übersicht)
Erstellen Sie eine neue Seite im Zusammenfluss mit Python
Erstellen Sie mit Python + Qt (PySide) ein farbspezifisches Widget.
Erstellen Sie mit Python eine Datei im Photoshop-Format (.psd)
Erstellen Sie eine MIDI-Datei in Python mit pretty_midi
Erstellen Sie einfach eine Python-Konsolenanwendung mit Click
Erstellen Sie ein Python-Modul
Erstellen Sie eine Python-Umgebung
Erstellen Sie mit Selenium einen Datenerfassungsbot in Python
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 1 ~
Warum nicht einfach mit Python eine stilvolle Tabelle erstellen?
Erstellen Sie eine Python-Entwicklungsumgebung mit Vagrant + Ansible + Fabric
Registrieren Sie Tickets mit der Redmine-API mithilfe von Python-Anforderungen
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
[Python] Erstellen Sie mit np.arange ein Datumsarray mit beliebigen Inkrementen
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 2 ~
[Python] So erstellen Sie mit Matplotlib ein zweidimensionales Histogramm
[Python] Erstellen Sie mit cx_Freeze eine Verteilungsdatei für das Tkinter-Programm
Erstellen Sie mit Quarry einen gefälschten Minecraft-Server in Python
Verwenden Sie Python-Programme mit dem Ausführungs-Plugin exec_filter von fluentd
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 3 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 4 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 5 ~
Erstellen Sie eine 2D-CAD-Datei ".dxf" mit Python [ezdxf]
Verwenden Sie Python-Programme mit dem exec Output Plugin von fluentd
Erstellen Sie ein Wox-Plugin (Python)
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Wörterbuch in Python
Verwenden von Quaternion mit Python ~ numpy-quaternion ~
Erstellen Sie ein 3D-GIF mit Python3
[Python] Verwenden von OpenCV mit Python (Basic)
Erstellen Sie eine Homepage mit Django
Erstellen Sie JIRA-Tickets mit Python
Erstellen Sie ein Python-Numpy-Array
Verwenden eines Druckers mit Debian 10