[DUMD 11/24] Le design pattern Facade

Auteur du billet de blog : Nicolas Hilaire - Neotech Solutions

Nicolas Hilaire

Consultant .NET
  Publié le jeudi 1 décembre 2016

Artisan logiciel particulièrement intéressé par les technologies .NET. Polyvalent et curieux, je suis néanmoins à l'écoute des autres technologies du marché. MVP (Microsoft Most Valuable Professional) de 2007 à 2014, je suis également auteur d'un ouvrage pour apprendre le C#, à destination des débutants et de plusieurs MOOCs sur le C#, Windows Phone ou ASP.NET MVC...

Onzième billet sur comment devenir un meilleur développeur. Pour retrouver le sommaire ainsi que tous les liens, rendez-vous sur le premier billet.

Le design pattern Façade est très facile à comprendre et également très facile à implémenter. Vous vous en servez sans doute déjà naturellement sans forcément trop y penser.

Le but de la façade est de simplifier l'interface d'un sous-système complexe. Elle protège les consommateurs du système complexe et expose une interface simplifiée d'utilisation. Elle peut être utilisée pour orchestrer plusieurs opérations dans un ordre bien précis afin d'obtenir un résultat exploitable.

Imaginons que je sois à la maison et qu'il est l'heure de me coucher. Je dois passer dans chaque pièce et fermer chaque volet, puis éteindre chaque lumière. Si je disposais d'un système de domotique évolué, je pourrais appuyer sur un unique bouton et que ça enchaîne toutes les actions que je viens de décrire. Ce bouton agirait comme une façade. De la même façon, il pourrait y avoir un autre bouton qui permettrait de faire ces actions dans l'ordre inverse pour le réveil. Ou pourquoi pas un bouton qui ne fermerait que les volets qui sont du côté du soleil, pour me préserver des grosses chaleurs en été.

Bref, vous avez compris, la façade permet de simplifier un système complexe.

 

La façade en action

Imaginez que nous travaillons pour un bar qui souhaite un logiciel qui automatise ses commandes. Un de vos collègues vous a fourni une multitude de classes permettant de faire le café, disons :

 

 

Il a aussi fait la même chose pour le thé, pour la bière, etc.

Votre travail est d'utiliser toutes ces classes pour préparer les commandes. Nous pouvons utiliser le pattern façade pour orchestrer tous les éléments de ce système complexe et fournir une interface simplifiée. Ainsi, nos collègues qui réalisent l'interface graphique vont pouvoir plus facilement utiliser ces éléments, sans avoir à se soucier de la complexité des autres classes. Voilà comment on pourrait créer une telle classe façade :

 

 

Vous avez compris le principe, rien de transcendant. La façade expose une méthode qui fait le café et encapsule les différentes étapes pour le faire. Voici un bon exemple d'encapsulation visant à réduire la complexité.

Cela peut-être aussi très utile pour utiliser des bibliothèques tierces complexes. Prenez par exemple les classes du framework .NET. Elles sont conçues pour pouvoir faire plein de choses afin de répondre au maximum de besoins. Mais il est fort probable que si je veux manipuler des fichiers pour créer un fichier zip, je n'ai pas besoin de toutes les méthodes qui permettent d'ajouter un fichier après coup, ou de supprimer un fichier dans le zip, etc. Ma façade consistera à avoir une méthode qui prend en paramètre une liste de fichiers et qui me renvoi un zip. Et puis c'est tout, le reste je n'en ai pas besoin.

La façade est pratique pour travailler avec du code legacy que l'on ne peut pas (ou veut pas) toucher. Plutôt que de tout refaire si jamais le design n'est plus adapté, on peut créer une nouvelle abstraction pour améliorer le design.

On peut également s'en servir pour rendre une classe testable sans avoir à y modifier le reste du code. Vous pouvez sans soucis faire en sorte que votre classe façade implémente une interface et puisse être bouchonnée.

 

Conclusion

Bien que très simple, la façade a un vrai intérêt et de multiples utilisations. Vous en avez sans doute réalisées sans forcément vous rendre compte que c'était un design pattern éprouvé.

La façade est très pratique pour fournir une interface unifiée permettant de rendre un sous-système plus facile à utiliser. N'hésitez pas à voir d'autres exemples sur internet et pour une fois, la page française de wikipedia sur le sujet en propose un plutôt pas mal que je vous encourage à aller consulter.

 

Prochain billet sur le patron de conception template method.