"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como refatorar uma declaração de dependência de “amigo”: um guia passo a passo para remover a interdependência excessiva?

Como refatorar uma declaração de dependência de “amigo”: um guia passo a passo para remover a interdependência excessiva?

Publicado em 2024-11-21
Navegar:530

How to Refactor a \

Como refatorar uma declaração de dependência de "amigo"

Antecedentes

Pode-se encontrar um cenário em que a remoção de uma dependência de "amigo" entre duas classes é desejado, principalmente devido a preocupações com interdependência excessiva, problemas de manutenção e padrões UML desatualizados.

Etapa 1: Introduza uma interface abstrata

Extraia os métodos expostos pela classe "amigo" e criam uma nova interface abstrata. Estabeleça um relacionamento de dependência da classe "amigo" para a interface e uma dependência de "chamada" da outra classe para a interface.

Etapa 2: Mover operações para a interface

Mova as operações que constituem a dependência de "chamada" da classe dependente para a interface abstrata. Faça com que a interface estenda um construtor protegido para fins de herança e oculte a associação de generalização protegida entre a classe dependente e a interface.

Etapa 3: Unir a implementação

Na etapa final, crie um método na classe "amigo" para passar uma referência da interface abstrata para a classe dependente. Chame esse método da classe dependente durante a inicialização para estabelecer a conexão necessária.

Implementação

ClassA (provedor):

class ClassA : protected InternalInterface {
    public:
        attachAccessor(ClassAAccessor &accessor) {
            accessor.setInternalInterfaceRef(*this);
        }
};

ClassAAccessor (amigo):

class ClassAAccessor {
    public:
        ClassAAccessor(ClassA& classA) : internalInterfaceRef(0) {
            classA.attachAccessor(*this);
        }
    private:  
        InternalInterface* internalInterfaceRef;
};

Vantagens

  • Remove dependências desnecessárias entre classes
  • Em conformidade com os padrões UML modernos
  • Aplica o controle de acesso, ocultando operações internas do público

Limitações

  • Pode aumentar o código complexidade
  • Requer interfaces abstratas, impactando o desempenho e o consumo de memória
  • A representação UML do relacionamento de generalização protegido pode ser desafiadora
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3