Digital solutions
Design Patterns avec Laravel

Adapter Pattern vs DTO Pattern

1. Adapter Pattern

  • Objectif principal : Adapter des interfaces incompatibles pour les faire fonctionner ensemble sans modifier leur code d'origine.
  • Utilisation : Lorsque deux systèmes ou formats doivent interagir et qu'ils n'ont pas les mêmes interfaces, l'Adapter Pattern permet de créer une passerelle pour les rendre compatibles.
  • Exemple : Imaginons un système de gestion de commandes où les données des commandes sont reçues en XML mais doivent être envoyées au service de facturation en JSON. Un adaptateur permet de transformer ces données XML en JSON avant de les transmettre au service.

2. DTO Pattern

  • Objectif principal : Transférer des données entre différentes couches de l'application sans y inclure de logique métier ou de détails sensibles.
  • Utilisation : Lorsque l’on doit envoyer ou recevoir des données via une API ou entre différentes couches de l'application, le DTO Pattern permet de structurer et de simplifier les données à transférer, sans manipuler directement les objets complexes.
  • Exemple : Dans le même système de gestion de commandes, un OrderDTO est utilisé pour transférer uniquement les informations nécessaires de la commande (comme le montant total, l'adresse de livraison, etc.) à l'API d'un transporteur, sans transmettre des détails non pertinents comme les remises internes ou les informations sensibles du client.

Comparaison directe :

Caractéristique Adapter Pattern DTO Pattern
Objectif principal Connecter des interfaces incompatibles Transférer des données entre couches sans logique métier
Transformation des données Oui, adapte les données ou l'interface à un autre format Non, encapsule uniquement les données à transférer
Responsabilité métier Aucun, il transforme simplement les interfaces Aucun, il ne contient pas de logique métier
Exemple d'application Adapter XML en JSON pour la facturation Transférer des données de commande à un service d'expédition

Exemples

Prenons un système de gestion de commandes dans lequel des commandes sont reçues en format XML, et où ces données doivent être soit transformées pour être envoyées à un service de facturation en JSON, soit encapsulées dans un DTO pour être transmises à un service d'expédition.

1. Adapter Pattern

L'adaptateur est utilisé ici pour convertir une commande au format XML en JSON avant de la transmettre au service de facturation.

// Adapter pour convertir XML en JSON
$adapter = new XmlToJsonAdapter(new IncomingOrderXmlLibrary());
$jsonOrder = $adapter->getData(); // Conversion de XML à JSON

// Envoi des données JSON au service de facturation
$billingService = new BillingService();
$billingService->sendInvoice($jsonOrder);

2. DTO Pattern

Le DTO est utilisé pour encapsuler les données pertinentes d'une commande et les transférer au service de livraison, sans exposer de détails sensibles ou inutiles.

// Création d'un DTO pour transférer les données d'une commande
$orderDTO = OrderDTO::fromOrder($order);

// Transfert des données via une API de livraison
$shippingService = new ShippingService();
$shippingService->createShipment($orderDTO->toArray());

Explications

  • Dans le cas de l’Adapter Pattern, il s'agit de transformer une commande au format XML pour qu'elle soit compatible avec un service de facturation qui ne prend en charge que le format JSON. Cela permet d'assurer que le système de facturation puisse traiter les commandes sans que son interface ne doive gérer plusieurs formats de données.

  • Avec le DTO Pattern, les données d'une commande sont filtrées et encapsulées dans un objet OrderDTO pour être envoyées au service de livraison. Ce DTO permet de ne transmettre que les informations nécessaires à la livraison (comme l'adresse, le poids, et le contenu), sans inclure de détails internes comme les remises ou les commentaires internes.

Cas d'utilisation des patterns

  • Le Adapter Pattern est particulièrement utile lorsque tu dois intégrer des systèmes qui n'ont pas les mêmes interfaces ou formats de données. Dans notre exemple, l'adaptation de XML en JSON permet d'envoyer une commande à un service de facturation qui n'accepte que le format JSON, sans changer la structure de la commande d'origine.

  • Le DTO Pattern est idéal lorsque tu as besoin de transférer des données spécifiques d'un objet complexe à travers une API ou entre différentes couches de ton application. Dans notre cas, le OrderDTO encapsule uniquement les données nécessaires à l'expédition, évitant ainsi de transmettre des informations non pertinentes ou sensibles.

Conclusion

  • Le Adapter Pattern est utile pour rendre interopérables des systèmes ou des formats de données qui ne sont pas compatibles d’origine. Il permet de simplifier les interactions entre des services ou des bibliothèques tierces, comme la conversion de XML en JSON dans notre exemple de facturation.

  • Le DTO Pattern est plus adapté pour organiser et transmettre des données entre les couches d'une application sans exposer toute la complexité des objets métiers. Il aide à filtrer et à simplifier les données envoyées, comme dans le cas de l’envoi des informations de commande au service de livraison.

Ces deux patterns permettent une meilleure modularité, réutilisabilité, et maintenabilité du code, tout en étant utilisés dans des contextes bien distincts.