Maison >développement back-end >tutoriel php >Comprendre le domaine et constituer l'équipe : les fondements du changement (II)
Se lancer dans un projet complexe nécessite une collecte de contexte complète tout en abordant simultanément les connaissances du domaine sous un angle nouveau, en tirant parti des connaissances des experts du domaine. Cette approche aligne l'équipe technique sur les objectifs commerciaux et établit une feuille de route fondamentale pour une prise de décision éclairée tout au long du cycle de vie du produit.
Les premières sessions de collecte de connaissances avec l'équipe précédente et les utilisateurs actuels de l'application se sont révélées improductives. Nous avons brièvement envisagé de procéder de manière indépendante, malgré les risques inhérents.
En tant que responsable technique, j'ai défendu dès le départ une approche axée sur le domaine, compte tenu de la complexité du projet et du besoin d'appropriation de l'équipe. Cela a centré le domaine, favorisant une compréhension partagée (langage omniprésent) qui a rationalisé la communication et facilité la cartographie de l'état actuel de l'application.
Nous avons lancé des sessions EventStorming en utilisant un modèle Miro, fournissant une structure et une légende pour une concentration efficace. Une connaissance préalable des concepts d'EventStorming, que ce soit par le biais d'une préparation pré-session ou d'explications initiales, est très bénéfique.
Notre processus structuré EventStorming comprenait :
EventStorming a fourni non seulement une compréhension du domaine, mais également une base pour appliquer les principes de la Conception pilotée par domaine (DDD) de manière stratégique et tactique.
Une première étape cruciale consistait à structurer stratégiquement le domaine. La complexité du système et la nécessité d'un alignement technique/métier ont conduit à l'adoption des principes DDD. La Context Mapping s'est avérée inestimable, même au sein de notre monolithe en attente de refactorisation. Nous avons identifié des Contextes limités, fonctionnant dans un contexte technique unique avec un noyau partagé. Cette analyse, bien que peu approfondie, a guidé le projet vers une architecture orientée domaine, améliorant à la fois le développement technique et la collaboration entre les équipes.
Identification des Contextes délimités a clarifié les relations entre les systèmes et les systèmes externes, simplifiant la complexité et établissant une base pour une modularisation future. Ces décisions initiales guideront la décomposition du monolithe en composants gérables alignés sur des contextes définis. Cela a également facilité la priorisation et l’identification des domaines nécessitant une simplification, un découplage ou une élimination. Nous nous sommes concentrés sur la mise en œuvre de Couches anti-corruption (ACL) pour l'interaction avec le système externe, préservant ainsi l'intégrité du système.
Cinq contextes clés ont été identifiés :
Ces décisions ont favorisé une architecture durable et aligné le développement sur les besoins de l'entreprise.
L'établissement d'un langage robuste et omniprésent s'est avéré vital. Les avantages d'un langage partagé, créé grâce à la collaboration entre experts du domaine et développeurs, dépassent de loin les efforts de traduction ou les erreurs d'interprétation. Cette ressource vivante a mis en relation l'équipe technique avec des experts du domaine, améliorant ainsi la communication, réduisant les malentendus et garantissant une représentation précise du domaine dans le code. Cela a favorisé des solutions techniques efficaces et adaptées aux besoins de l'entreprise.
En suivant le cadre stratégique, nous avons mis en œuvre les principes tactiques DDD pour structurer le code, reflétant la réalité du domaine et garantissant la durabilité à long terme.
Comprendre la distinction entre les entités et les objets de valeur est crucial.
Les entités possèdent une identité unique et persistante, même avec des changements d'attributs. Les exemples incluent :
Les objets de valeur manquent d'identité individuelle ; leur valeur les définit. Des attributs identiques signifient une équivalence. Ils sont immuables et idéaux pour encapsuler les concepts apparaissant dans le domaine. Les exemples incluent :
Cette approche a créé un code plus compréhensible et modulaire avec des responsabilités clairement définies.
Exemple d'objet de valeur :
<code class="language-php"><?php readonly class ProductEan13 { public string $value; public function __construct(string $value) { $pattern = '/^\d{13}$/'; if (!preg_match($pattern, $value)) { throw new \Exception('Invalid product Ean13'); } $this->value = $value; } }</code>
Les services sont classés par objectif et modèles mis en œuvre.
Les services de domaine encapsulent une logique métier qui ne correspond pas à des entités ou des valeurs, fonctionnant strictement selon les règles du domaine sans dépendances d'infrastructure.
<code class="language-php"><?php readonly class ProductEan13 { public string $value; public function __construct(string $value) { $pattern = '/^\d{13}$/'; if (!preg_match($pattern, $value)) { throw new \Exception('Invalid product Ean13'); } $this->value = $value; } }</code>
Les services d'application coordonnent les opérations du domaine avec les interactions externes, centralisant les opérations complexes et séparant le domaine et l'infrastructure. Ceux-ci incluent les cas d'utilisation, les gestionnaires de commandes et les gestionnaires d'événements.
Les services d'infrastructure gèrent les interactions avec les composants externes (bases de données, systèmes de fichiers, etc.), agissant comme des adaptateurs pour maintenir l'agnosticisme du domaine.
<code class="language-php"><?php class CheapestCarrierGetter { public function get( DeliveryOptionCarrierCollection $deliveryOptionCarriers, Weight $orderWeight, Country $country, PostalCode $postalCode, bool $isCashOnDelivery = false, ): Carrier { // Logic to get the cheapest carrier } }</code>
Les services sont classés par fonction et modèles de conception associés : transformateurs, constructeurs, usines, présentateurs, notificateurs, validateurs et clients.
Cette modélisation initiale du domaine, bien qu'incomplète et itérative, a favorisé la participation et l'engagement des équipes. D'autres raffinements et restructurations étaient attendus.
Ressources DDD recommandées :
L'adoption du DDD a suivi la formation d'équipes, en suivant les étapes de Tuckman (Forming, Storming, Norming, Performing).
Les membres de l'équipe initiale ont examiné le projet, documenté les opérations et établi les bases techniques et organisationnelles (processus, normes, outils).
Des désaccords mineurs ont conduit à définir des styles de travail, des méthodes de communication et des processus de prise de décision.
Des accords d'équipe, des normes de codage, des processus de développement, des limites WIP, des règles de déploiement, une gestion de la dette technique et des ADR ont été établis.
Le cadre établi a permis un développement de produits efficace, en donnant la priorité aux initiatives précieuses et en favorisant une culture d'amélioration continue.
La documentation a été gérée à l'aide de GitLab Pages et Jekyll avec le thème Just the Docs, suivant le modèle Diátaxis : Tutoriels, Guides, Explications et Références. L'automatisation de la documentation à l'aide d'Event Catalog et d'AsyncAPI était prévue mais pas entièrement mise en œuvre.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!