Modèles de conception Le modèle de façade

Quand il s'agit de concevoir des modèles, vous pouvez avoir des questions:

Pourquoi devrions-nous utiliser des modèles de conception dans la programmation? Notre code peut très bien fonctionner sans cela.

À cela, ma question opposée serait: "Préférez-vous vivre dans une maison luxueuse ou dans un simple établissement à quatre murs?" Après tout, les deux servent notre but.

Généralement, nous recherchons une maison luxueuse, car elle offre de meilleures installations et nécessite moins d’entretien, et l’entretien peut se faire avec moins de tracas, car les bases sont déjà là.. 

La même chose s’applique à la programmation: le code qui utilise des modèles de conception est facile à comprendre, à maintenir et à étendre.. 

Dans cette série de didacticiels, nous aborderons différents modèles de conception disponibles pour la programmation. Vous en apprendrez plus sur leurs avantages et inconvénients, ainsi que sur les facteurs indiquant où nous devrions les utiliser.. 

Tout au long de ces tutoriels, je prendrai PHP comme langage de base pour démontrer les modèles de conception; Cependant, ils sont en réalité un concept qui peut être appliqué à n'importe quel langage de programmation. Il suffit simplement de changer la syntaxe en fonction de votre langue préférée..

Les règles de conception sont séparées en quatre catégories:

  • modèles de création
  • modèles structurels
  • les comportements
  • modèles de concurrence

Dans ce tutoriel, nous allons couvrir le modèle de conception de façade. Il entre dans la catégorie des modèles structurels, car il traite de la façon dont votre code doit être structuré pour le rendre facilement intelligible et le maintenir correctement à long terme..

Modèle de conception de façade

L'UML

Problème

Supposons que vous ayez quelques opérations à effectuer en séquence et que la même action soit requise à plusieurs endroits de votre application. Vous devez placer le même code encore et encore dans des endroits différents. Vous l'avez fait, mais au bout de quelques jours, vous constatez qu'il faut modifier quelque chose dans ce code.. 

Voyez-vous le problème? Nous devons introduire les changements dans tous les endroits où le code existe. C'est douloureux, n'est-ce pas?

Solution

En guise de solution, vous devriez créer un contrôleur principal qui gère tout le code répété. Du point de vue de l'appelant, nous allons simplement appeler le contrôleur principal pour effectuer des actions en fonction des paramètres fournis.. 

Maintenant, si nous devons introduire un changement dans le processus, nous devrons simplement changer le contrôleur principal au lieu de le modifier à tous les endroits où nous avons utilisé ce code..

Exemple

Dans ce didacticiel, choisissons une leçon pour rendre les choses plus lisibles. Disons que vous avez pour tâche de planifier le mariage de votre ami. Si vous faites tout vous-même, imaginez ce que vous devez couvrir. Cela créera un risque d'erreur plus élevé et augmentera le risque d'omettre quelque chose qui pourrait affecter considérablement le mariage de votre ami..

Dans ce cas, au lieu de tout faire vous-même, vous devez utiliser un planificateur de mariage et vous assurer que le travail est effectué de manière bien gérée avec moins de risque d'erreur..

Ici, vous vous comportez comme un client qui initie le processus, et le planificateur de mariage fonctionne comme une "façade" pour vous, complétant le travail en fonction de votre direction..

Exemple de code

Dans cette section, nous verrons un autre exemple, très courant pour les sites Web, avec bien sûr un exemple de code. Nous verrons une mise en œuvre du modèle de conception de façade utilisant un processus de validation du produit. Mais avant de vérifier le code parfait avec le motif de façade, regardons un code qui a un problème.

Un processus de paiement simple comprend les étapes suivantes:

  1. Ajouter le produit au panier.
  2. Calculer les frais d'expédition.
  3. Calculer remise.
  4. Générer une commande.

Problème

// Processus de contrôle simple $ productID = $ _GET ['productId']; $ qtyCheck = new productQty (); if ($ qtyCheck-> checkQty ($ productID)> 0) // Ajouter un produit au panier $ addToCart = new addToCart ($ productID); // Calculer les frais d'expédition $ shipping = new shippingCharge (); $ shipping-> updateCharge (); // Calculer la remise Sur la base de la remise $ = nouvelle remise (); $ discount-> applyDiscount (); $ order = new order (); $ order-> generateOrder (); 

Dans le code ci-dessus, vous constaterez que la procédure de paiement inclut divers objets qui doivent être produits pour terminer l'opération de paiement. Imaginez que vous deviez mettre en œuvre ce processus à plusieurs endroits. Si tel est le cas, la modification du code posera problème. Il est préférable de faire ces changements partout à la fois. 

Solution

Nous allons écrire la même chose avec le motif de façade, ce qui rend le même code plus facile à gérer et à étendre..

class productOrderFacade public $ productID = "; fonction publique __construct ($ pID) $ this-> productID = $ pID; fonction publique generateOrder () if ($ this-> qtyCheck ()) // Ajouter un produit au panier $ this-> addToCart (); // Calculer les frais d'expédition $ this-> calulateShipping (); // Calculer Remise s'il en existe $ this-> applyDiscount (); // Placez et confirmez la commande $ this-> placeOrder ();  fonction privée addToCart () / *… ajouter un produit au panier… * / fonction privée qtyCheck () $ qty = 'extraire la quantité de produit de la base de données'; if ($ qty> 0) return true; else return true; fonction privée calulateShipping () $ shipping = nouvelle shippingCharge (); $ shipping-> CalculateCharge (); fonction privée applyDiscount () $ discount = nouvelle remise (); $ discount-> applyDiscount (); fonction privée placeOrder () $ order = nouvelle commande (); $ order-> generateOrder ();

A présent, nous avons préparé notre façade de commande de produits. Tout ce que nous avons à faire est de l’utiliser avec quelques canaux de communication de code, au lieu d’un paquet de code comme indiqué dans la partie précédente.. 

Veuillez cocher la quantité de code ci-dessous que vous devrez investir pour pouvoir passer à la caisse à plusieurs postes..

// Remarque: nous ne devrions pas utiliser les valeurs d'extraction directe pour les requêtes à la base de données afin d'empêcher l'injection SQL $ productID = $ _GET ['productId']; // Seulement 2 lignes de code à tous les endroits, au lieu d'un processus long partout $ order = new productOrderFacade ($ productID); $ order-> generateOrder ();

Maintenant, imaginez quand vous devez apporter des modifications à votre processus de paiement. Maintenant, vous créez simplement des modifications dans la classe de façade que nous avons créée, plutôt que d'introduire des modifications à chaque endroit où elle a été appliquée.

Conclusion

En termes simples, nous pouvons dire que le motif de façade doit être réalisé dans une situation où vous avez besoin d’une interface unique pour effectuer plusieurs procédures, comme dans l’exemple du planificateur de mariage qui travaille comme façade pour vous permettre de réaliser plusieurs procédures..

S'il vous plaît laissez des commentaires ou des questions dans le flux ci-dessous.