Maison  >  Article  >  développement back-end  >  Comment refactoriser une déclaration de dépendance « Ami » : un guide étape par étape pour supprimer les interdépendances excessives ?

Comment refactoriser une déclaration de dépendance « Ami » : un guide étape par étape pour supprimer les interdépendances excessives ?

DDD
DDDoriginal
2024-11-05 10:02:02372parcourir

How to Refactor a

Comment refactoriser une déclaration de dépendance « ami »

Contexte

On peut rencontrer un scénario dans lequel supprimer une dépendance « ami » entre deux classes est souhaité, notamment en raison de préoccupations concernant une interdépendance excessive, des problèmes de maintenance et des normes UML obsolètes.

Étape 1 : Introduire une interface abstraite

Extraire les méthodes exposées par la classe « ami » et créer un nouvelle interface abstraite. Établissez une relation de dépendance de la classe « ami » vers l'interface et une dépendance « d'appel » de l'autre classe vers l'interface.

Étape 2 : Déplacer les opérations vers l'interface

Déplacer les opérations qui constituent la dépendance "d'appel" de la classe dépendante à l'interface abstraite. Faites en sorte que l'interface étende un constructeur protégé à des fins d'héritage et masquez l'association de généralisation protégée entre la classe dépendante et l'interface.

Étape 3 : Collez l'implémentation ensemble

Dans la dernière étape, créez une méthode dans la classe "friend" pour transmettre une référence de l'interface abstraite à la classe dépendante. Appelez cette méthode depuis la classe dépendante lors de l'initialisation pour établir la connexion nécessaire.

Implémentation

ClassA (fournisseur) :

<code class="cpp">class ClassA : protected InternalInterface {
    public:
        attachAccessor(ClassAAccessor &accessor) {
            accessor.setInternalInterfaceRef(*this);
        }
};</code>

ClassAAccessor (ami) :

<code class="cpp">class ClassAAccessor {
    public:
        ClassAAccessor(ClassA& classA) : internalInterfaceRef(0) {
            classA.attachAccessor(*this);
        }
    private:  
        InternalInterface* internalInterfaceRef;
};</code>

Avantages

  • Supprime les dépendances inutiles entre les classes
  • Conforme aux normes UML modernes
  • Applique le contrôle d'accès en cachant les opérations internes au public

Limitations

  • Peut augmenter la complexité du code
  • Nécessite des interfaces abstraites, ce qui a un impact sur les performances et l'empreinte mémoire
  • La représentation UML d'une relation de généralisation protégée peut être difficile

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn