3 votes

Modèle de conception "facade" et couplage étroit

Lorsque j'ai appris le modèle de conception Facade, j'ai trouvé ce genre d'exemples partout :

public class SystemA
{
 public void CreateCreditCard(){//implementation}
 //other methods here
}

public class SystemB
{
 public void CheckCreditCard(){//implementation}
//other methods here
}

public class Facade
{
 SystemA subsystemA = new SystemA();
 SystemB subsystemB = new SystemB();

 public void CreateAccount()
 {
   subsystemA.CreateCreditCard();
   subsystemB.CheckCreditCard();
 }
}

Je ne sais pas si je me trompe mais cela ne crée-t-il pas un couplage étroit entre la classe Facade et les systèmes (SystemA et SystemB), même si SystemA et SystemB sont hérités d'une classe ou d'une interface abstraite.

4voto

Darjan Bogdan Points 2125

Dans le sens où vous avez écrit votre exemple, oui, cela va coupler étroitement votre code. Principalement en raison de new qui agit comme un mot-clé glue à vos dépendances.

Gardez à l'esprit que le modèle Facade ne vous empêchera pas de créer des dépendances ou du code étroitement couplés. L'objectif principal de son utilisation est de rendre votre composant logiciel plus facile à utiliser, plus lisible, plus facile à maintenir et enfin, plus facile à tester.

Si vous voulez éviter un couplage étroit, vous devez passer des dépendances abstraites dans votre classe Facade :

public class Facade
{
 private readonly ISystemA subsystemA;
 private readonly ISystemB subsystemB;

 public Facade(ISystemA subsystemA, ISystemB subsystemB)
 {
    this.subsystemA = subsystemA;
    this.subsystemB = subsystemB;
 }

 public void CreateAccount()
 {      
   this.subsystemA.CreateCreditCard();
   this.subsystemB.CheckCreditCard();
 }
}

Vous devez créer des interfaces (ou des classes abstraites) :

public interface ISystemA
{
 void CreateCreditCard();
 //other methods here
}

public interface ISystemB
{
  void CheckCreditCard();
  //other methods here
}

De cette façon, vous vous assurez que votre façade ne dépend pas de l'implémentation, mais plutôt de l'abstraction. Vous pourrez passer n'importe quelle implémentation qui implémente ISystemA o ISystemB les interfaces.

Je vous suggère d'en lire plus sur Injection de dépendances et des conteneurs qui vous aideront grandement à envelopper les graphes de dépendance des classes et à automatiser l'injection de constructeurs dans ces classes.

0voto

dstar55 Points 670

Motifs de façade Le système de gestion de l'information, qui cache la complexité du système et fournit une interface au client à partir de laquelle ce dernier peut accéder au système.
L'exemple typique est le compilateur. En tant que client, vous pouvez invoquer la méthode de compilation, mais vous ne voyez pas les étapes internes comme le balayage, l'analyse syntaxique, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X