Récemment, j'ai commencé imprudemment à étudier le DDD, mais il existe peu d'exemples de Python ...! Alors ・ Organisez vos réflexions sur DDD ・ Proposer un exemple d'écriture en Python J'ai décidé d'écrire un article à cet effet. Pour le moment, cette fois, j'écris sur l'objet de valeur qui semble être le plus facile d'accès.
Il existe de nombreux articles qui sont très faciles à comprendre pour les autres, je vais donc vous les donner, mais si vous l'écrivez brièvement, ValueObject est "une valeur exprimée en utilisant une classe, pas un type primitif tel que int, mais le comportement attendu et la manière d'être", Un constructeur complet peut être considéré comme une méthode pour obtenir un "comportement attendu" ou, au contraire, "ne pas provoquer de comportement inattendu". (Je comprends cela ... est-ce vrai ...?)
Par exemple, si vous souhaitez exprimer «montant», vous pouvez dire «ce ne sera pas une valeur négative». ValueObject est une classe qui définit le comportement attendu. Décrivez ce qui précède "ce ne sera pas une valeur négative" dans le constructeur, C'est un constructeur complet qui se rend compte que "les valeurs qui ne devraient pas exister n'existent pas".
Puisque nous avons parlé du montant d'argent dans la section précédente, écrivons-le brièvement en utilisant le montant d'argent comme exemple.
import dataclasses
@dataclasses.dataclass
class Money:
#Je n'entrerai pas dans les détails, mais les variables listées ici sont pour les classes régulières.__init__Ce sera une variable d'instance décrite dans
amount: int
# __post_init__Est__init__C'est le processus qui est exécuté après.
#L'expression du constructeur complet est décrite ici.(2020/5/9 Correction d'une erreur)
def __post_init__(self):
if self.amount < 0:
raise ValueError()
Il ne peut plus y avoir d’objet Money avec une valeur négative, Il y aura uniquement des objets Money dont les valeurs sont garanties. (Je pense qu'il y a d'autres restrictions qui devraient être imposées, mais cette fois je passerai à ce niveau)
Vous pouvez également rendre les classes immuables à l'aide de classes de données. Immuable rend la réaffectation impossible et améliore la sécurité du code. (Value Object semble être fondamentalement quelque chose qui devrait être immuable) Python est une fonctionnalité importante car il existe peu de moyens d'empêcher la réaffectation aux variables d'instance.
import dataclasses
# frozen=True le rend immuable
@dataclasses.dataclass(frozen=True)
class Money:
amount: int
def __post__init__(self):
if amount < 0:
raise ValueError()
En la rendant immuable, une fois instanciée, la valeur ne peut pas être modifiée même si le montant augmente ou diminue. Maintenant, comment exprimer l'augmentation ou la diminution du montant, créez une nouvelle instance avec la valeur du montant après l'augmentation ou la diminution. Les méthodes peuvent être écrites comme des classes régulières.
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)
#Par exemple, écrivez comme ceci
money1 = Money(1000)
money2 = Money(100)
left_money = money1.lost(money2)
La même chose peut être faite avec la méthode de description conventionnelle, donc ce n'est pas indispensable. cependant, ・ Peut être immuable ・ La quantité de description du constructeur peut être réduite. -La description de la variable d'instance et la description de la logique pour en faire un constructeur complet peuvent être séparées, ce qui facilite la visualisation. À cet égard, j'ai l'impression qu'il vaut mieux utiliser des classes de données. Étant donné que les classes de données ont diverses autres fonctions, je voudrais l'utiliser non seulement pour ValueObject.
J'ai introduit cette fois que ValueObject peut être exprimé même en Python en écrivant comme ceci. Depuis que je viens de commencer à étudier, l'explication sur ValueObject lui-même est mince, mais si vous approfondissez votre compréhension Je souhaite rédiger des articles supplémentaires et rédiger des articles sur les entités.
Veuillez vous référer ici pour l'utilisation des classes de données. https://docs.python.org/ja/3.7/library/dataclasses.html
Recommended Posts