Maison > développement back-end > C++ > le corps du texte

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

DDD
Libérer: 2024-11-05 10:02:02
original
365 Les gens l'ont consulté

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>
Copier après la connexion

ClassAAccessor (ami) :

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

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!