modificação feita na estrutura interna de um software para deixá-lo mais simples de compreender e menos custoso para alterar, sem que seu comportamento seja modificado.
em um trecho de código que pode ser extraída para uma variável com um nome descritivo. Essa técnica ajuda a melhorar a legibilidade, compreensão e manutenção do código.
entender ou que seja usada várias vezes no código. Em seguida, você a extrai para uma variável separada e atribui um nome significativo a essa variável.
variável, tornando-a privada e fornecendo métodos de acesso (getters e setters) para manipulá-la. Essa técnica ajuda a melhorar a encapsulação, controle e consistência do acesso aos dados.
diretamente de fora da classe e a torna privada. Em seguida, você cria métodos de acesso (getters) e possivelmente métodos de modificação (setters) para interagir com essa variável.
relacionados está sendo passado repetidamente para um método ou função. Essa técnica envolve a criação de um novo objeto que encapsula esses parâmetros relacionados, simplificando a chamada do método e melhorando a legibilidade do código.
são frequentemente passados juntos e os agrupa em um objeto. Esse novo objeto é então passado como um único parâmetro para o método ou função relevante.
duas ou mais fases distintas ou diferentes tipos de tarefas. Essa técnica envolve a separação dessas fases em métodos ou funções separados, para melhorar a legibilidade, modularidade e facilidade de manutenção do código.
tarefas que estão sendo executadas em um único método ou função. Em seguida, você extrai cada fase para um método ou função separados, permitindo que cada um seja mais focado e específico em sua responsabilidade.
funcionalidades que podem ser melhor organizadas em uma nova classe separada. Essa técnica envolve a criação de uma nova classe e a transferência de atributos e métodos relacionados para essa nova classe.
dentro de uma classe existente que estão relacionados a uma responsabilidade ou funcionalidade específica. Em seguida, você extrai esses atributos e métodos para uma nova classe, tornando-os mais coesos e facilitando a manutenção do código.
um intermediário desnecessário entre outras classes. Essa técnica envolve a eliminação do intermediário, permitindo que as chamadas de método sejam feitas diretamente entre as classes relevantes.
como um intermediário, simplesmente repassando chamadas de método para outra classe sem adicionar qualquer valor ou lógica significativa. Em seguida, você direciona as chamadas de método diretamente para a classe que estava sendo intermediada.
direto a um objeto delegado e esse acesso direto está sendo utilizado em excesso ou violando o princípio de encapsulamento. Essa técnica envolve ocultar o objeto delegado por trás de métodos da classe que o encapsulam, limitando o acesso direto ao delegado.
está expondo o objeto delegado e fornecendo acesso direto a ele. Em seguida, você oculta o delegado por trás de métodos da classe que agem como intermediários, permitindo que a classe controle como o delegado é acessado e evitando o acesso direto descontrolado.
localizado em uma classe que não é a mais apropriada para abrigá-lo. Essa técnica envolve mover a função para outra classe que possui uma responsabilidade mais adequada ou onde a função possa ser mais facilmente reutilizada.
em uma classe onde não se encaixa bem em termos de responsabilidade ou coesão. Em seguida, você move essa função para uma classe mais apropriada, garantindo que a funcionalidade seja colocada no contexto correto.
que não são mais utilizados e não têm impacto no funcionamento do programa. Essa técnica envolve a remoção desses trechos de código desnecessários, simplificando e tornando o código mais limpo e legível.
são mais acessadas ou executadas devido a alterações em requisitos, lógica ou fluxo de execução. Essas partes podem incluir variáveis não utilizadas, métodos ou funções não chamados, blocos condicionais que nunca são verdadeiros ou falsos, entre outros.
objeto que é usado como um valor, mas você percebe que é necessário tratá-lo como um objeto com identidade própria. Essa técnica envolve substituir a representação de valor por uma representação de referência, permitindo que múltiplos objetos se refiram à mesma instância.
ser tratado como uma entidade única e não como um valor. Em seguida, você cria uma nova classe para representar esse objeto, onde a igualdade é baseada na identidade em vez do conteúdo do objeto. Em seguida, substitui as ocorrências do objeto valor por referências à nova classe.
com várias ramificações e a lógica se torna difícil de entender e manter. Essa técnica envolve decompor a condição em partes menores e mais claras, facilitando a compreensão e a manutenção do código.
e extrai cada cláusula em um método ou função separada, com um nome descritivo. Em seguida, você substitui a condição original pela chamada desses métodos ou funções, tornando a lógica mais expressiva e legível.
fim de detectar e capturar erros ou estados inválidos durante o desenvolvimento e depuração. Essa técnica envolve a inserção de afirmações (assertions) para validar condições que devem ser verdadeiras em determinados pontos do código.
necessário garantir uma condição específica. Em seguida, você adiciona uma asserção que verifica essa condição e, se a condição não for verdadeira, um erro ou exceção é lançado.
uma classe com um ou mais construtores que podem ser substituídos por uma função de fábrica. Essa técnica envolve a criação de uma função estática que encapsula a criação do objeto, fornecendo uma interface mais expressiva e flexível para criar instâncias da classe.
construtores em uma classe que podem ser substituídos por uma função de fábrica. Em seguida, você cria uma função estática na classe que encapsula a lógica de criação do objeto, fornecendo uma forma mais descritiva ou personalizada de criar instâncias.
em subclasses e deseja movê-los para a classe pai, a fim de evitar duplicação de código e promover a reutilização. Essa técnica envolve mover um método de uma ou mais subclasses para a classe pai, tornando-o um método comum que pode ser compartilhado por todas as subclasses.
mais subclasses que tem uma implementação semelhante e pode ser movido para a classe pai. Em seguida, você move esse método para a classe pai e ajusta as chamadas correspondentes nas subclasses para chamar o método na classe pai.
está realizando funcionalidades que são específicas de um subconjunto de objetos dessa classe. Essa técnica envolve a criação de uma nova subclasse que representa esse subconjunto específico de objetos e move as funcionalidades relevantes para essa nova subclasse.
uma classe existente que possui comportamentos e características distintas dos demais objetos. Em seguida, você cria uma nova subclasse que representa esse grupo específico de objetos e move os métodos e atributos relevantes para essa subclasse. A subclasse herda da classe original e, assim, compartilha o comportamento comum com os outros objetos da classe pai.
classes onde a diferenciação entre as subclasses se torna desnecessária ou irrelevante. Essa técnica envolve a remoção de uma ou mais subclasses intermediárias, movendo seus atributos e comportamentos diretamente para a classe pai.
não é mais necessária ou relevante. Em seguida, você remove as subclasses intermediárias e move seus atributos e comportamentos diretamente para a classe pai. Isso simplifica a hierarquia, reduz a complexidade e melhora a legibilidade do código.