[JAVA] Quelle est la différence entre les responsabilités de la couche domaine et de la couche application dans l’architecture onion [DDD]

Article de la série: Série de commentaires sur la conception axée sur le domaine

Quelle est l'architecture la plus accessible pour commencer à mettre en œuvre avec la conception axée sur le domaine - laboratoire des petites mains
Domain Driven + Onion Architecture Overview --little hands 'lab
Comme je l'ai écrit dans ces articles, je suis DDD Nous utilisons le terme architecture d'oignon pour décider de l'architecture en couches de. Je l'ai expliqué à diverses personnes jusqu'à présent, et j'ai parlé des responsabilités de couche comme un point qui permet de rester facilement coincé dans la compréhension, alors je vais l'expliquer.

Définition difficile à transmettre d'un seul coup (je pense)

Onion Architecture Is Interesting - DZone Java

Description de chaque couche écrite dans cet article

Traduction en japonais

Je l'ai expliqué à diverses personnes jusqu'à présent, mais dans de nombreux cas, je ne pouvais pas faire les choses correctement avec l'explication ci-dessus. Surtout quand il s'agit de *** logique spécifique à une application ***, le mot «application» est ambigu, donc les gens le perçoivent différemment, et il ne semble pas convenir.

Par conséquent, récemment, je me suis concentré sur le thème des responsabilités et j'ai essayé d'expliquer comme suit.

Définition axée sur les responsabilités

Il peut être un peu trompeur ou contre-argumentant de dire que la responsabilité de la couche de domaine est "l'intégrité des données", mais j'ose le dire en mettant l'accent sur la facilité de communication.

Je vais vous expliquer en détail ci-dessous.

Couche de domaine

Que signifie «garantir l'intégrité des données» à cette couche?

Pour un exemple de code concret, veuillez vous référer à l'article Qu'est-ce qu'exprimer la connaissance du domaine dans un modèle. Cependant, nous visons à «exposer uniquement les méthodes qui peuvent assurer la cohérence aux couches supérieures (ne pas rendre la visibilité publique).

Dans l'exemple de l'article ci-dessus, la règle d'intégrité des données est qu '«une tâche ne peut être reportée que trois fois, un jour à la fois». Afin de garantir cela, il est nécessaire d'effectuer des contrôles tels que «enregistrer le nombre de reports lors du report d'une tâche» et «vérifier le nombre de reports jusqu'à présent avant de reporter et faire une erreur s'il dépasse 3 fois».

Une méthode qui ne garantit pas cela est quelque chose comme "Vous pouvez modifier librement la date d'échéance sans tenir compte du nombre de reports de tâches". C'est exactement ce à quoi tous les setters sont exposés dans le paramètre public, comme les objets de modèle ActiveRecord.

En ne rendant publiques que les méthodes qui peuvent être contrôlées correctement, nous visons un état où «quelle que soit la dureté de la couche supérieure, l'intégrité des données ne peut pas être rompue».

Couche d'application (couche de cas d'utilisation)

J'ai écrit que la responsabilité de cette couche est de "combiner les méthodes exposées par la couche de domaine et d'assembler un cas d'utilisation".

En quoi est-ce différent des responsabilités de la couche de domaine?

Pour donner un autre exemple, disons que la couche de domaine expose une "méthode pour changer l'adresse d'un utilisateur" et une "méthode pour changer un numéro de téléphone fixe" comme méthodes publiques indépendantes.

Cela signifie que la couche de domaine "permet à l'adresse et au numéro de téléphone fixe d'être mis à jour indépendamment pour des raisons d'intégrité des données".

D'autre part, dans la couche application, les cas d'utilisation suivants peuvent être réalisés en combinant les méthodes ci-dessus.

Que vous souhaitiez que l'opération de mise à jour soit effectuée indépendamment ou en même temps peut être librement combinée dans la couche d'application en fonction du cas d'utilisation que vous souhaitez réaliser.

À l'inverse, si la couche de domaine dit: «Pour l'intégrité des données, les adresses et les numéros de téléphone fixes ne peuvent être mis à jour qu'en même temps», la couche d'application devra se conformer.

Les cas d'utilisation (en particulier dans vos propres applications Web) peuvent changer en un cycle court en fonction de votre stratégie. Mais l'intégrité des données changera-t-elle en conséquence? La réponse serait non. En confinant des éléments avec des cycles de vie différents dans chaque couche, vous pouvez rendre la conception résistante au changement.

mérite

Enfin, je voudrais écrire sur les mérites de la raison pour laquelle une telle superposition est effectuée.

Résumé

Lors de la conception d'un DDD, il est toujours nécessaire de se demander "où est ce processus responsable?" C'est un concept très important qui est au cœur de la conception de couches de DDD. Veuillez l'utiliser comme référence lors de la conception.

Recommended Posts

Quelle est la différence entre les responsabilités de la couche domaine et de la couche application dans l’architecture onion [DDD]
Quelle est la représentation de la connaissance du domaine dans le modèle [DDD]?
Quelle est la différence entre un serveur Web et un serveur d'applications?
Quelle est la différence entre SimpleDateFormat et DateTimeFormatter? ??
Quelle est la différence entre System Spec et Feature Spec?
[Rails] Quelle est la différence entre la redirection et le rendu?
[JAVA] Quelle est la différence entre interface et abstract? ?? ??
Quelle est la différence entre ignorer et en attente? [RSpec]
[Rails] Quelle est la différence entre l'installation et la mise à jour du bundle?
Quelle est la différence entre une action et une méthode d'instance?
[Java] Quelle est la différence entre form, entity et dto? [Haricot]
Différences entre les classes et les instances dans Ruby
Existe-t-il une différence de performances entre Oracle JDK et OpenJDK à la fin de 2017?
Comprenez en 3 minutes! Une explication très approximative de la différence entre session et cookie
[DDD] Quelle est l'architecture la plus accessible pour démarrer avec la conception pilotée par domaine?
[Docker-compose] Différence entre env_file et environnement. À propos de la priorité de l'application de variable d'environnement
Je vais expliquer la différence entre le développement d'applications Android et le développement d'applications iOS du point de vue des ingénieurs iOS
Maintenant dans la troisième année, le malentendu que j'ai remarqué est la différence entre la méthode equals et ==
L'évaluation des courts-circuits est-elle vraiment rapide? Différence entre && et & en Java
Sortie de la différence entre chaque champ de deux objets en Java
Qu'est-ce que @Override ou @SuppressWarnings ("SleepWhileInLoop") devant la fonction? ?? ??
Différence entre l'étiquette d'interface utilisateur par habillage de caractères et par habillage de mots dans l'affichage japonais
[DDD] Présentation de l'architecture basée sur le domaine + Onion
'% 02d' Quel est le% de% 2?
Structure de l'application Web par Java et flux de traitement dans la couche de présentation
Le contenu de la valeur de retour de executeBatch est différent entre 11g et 12c
Comprendre la différence entre int et Integer et BigInteger en java et float et double
L'application absorbe la différence de code de caractère
Différence entre final et immuable en Java
Qu'est-ce qu'un test? ・ À propos de l'importance d'un test
Différence entre pop () et peek () dans la pile
Différence entre isEmpty et isBlank de StringUtils
Quelle est la méthode principale en Java?
Quelle est la structure des données d'ActionText?
Différence entre getText () et getAttribute () de Selenium
À propos de la différence entre irb et pry
Différence entre "|| =" et "instance_variable_defined?" Dans Ruby memo
Différence entre EMPTY_ELEMENTDATA et DEFAULTCAPACITY_EMPTY_ELEMENTDATA dans ArrayList
Différence entre int et Integer en Java
J'ai essayé de créer une application Web qui recherche les tweets avec vue-word cloud et examine la tendance de ce qui est écrit dans le profil associé
[Java] Différence entre equals et == dans une chaîne de caractères qui est un type de référence
J'ai reçu les données du voyage (application agenda) en Java et j'ai essayé de les visualiser # 001
Récupérer le premier jour de la semaine dans les paramètres régionaux actuels (quel jour est-il aujourd'hui?)
[Java] Comprendre la différence entre List et Set
[iOS] Comprendre la différence entre le cadre et les limites
[Rails / Active Record] À propos de la différence entre créer et créer!
Différence entre next () et nextLine () dans Java Scanner
Comprenez la différence entre les classes abstraites et les interfaces!
Différence entre le membre et la collection de rails routes.rb
Quels sont les avantages de DI et de Thymeleaf?