Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Refatoração - aquela caprichada no código

Refatoração - aquela caprichada no código

Quem nunca pensou em passar um tempo refatorando aquele código bagunçado?

Eu adoro melhorar o código, deixá-lo mais organizado, mais fácil de compreender e claro mais bonito também.

Um dia eu li o famoso livro do Martin Fowler que me ajudou bastante e quero compartilhar o que aprendi: indicativos de necessidade de refatorar e claro soluções também, que muitas vezes são mais simples do que imaginamos.

jucycabrera

August 21, 2021
Tweet

More Decks by jucycabrera

Other Decks in Technology

Transcript

  1. Juciellen Cabrera @jucycabrera Mãe de um menino inteligente Carregando mais

    um bebezinho PHPWomen / Imoye Passo frio na Irlanda Adoro comida, memes e fofoca Software Engineer na Smartbox Group
  2. Uma mudança feita na estrutura interna do software o tornando

    mais compreensível e menos custoso de alterá-lo sem mudar seu comportamento observável. Refatoração (noun) Um erro comum é enxergar refatoração como uma ação para corrigir problemas do passado ou remover um código feio.
  3. A ideia de construir uma aplicação que não sofrerá alterações

    não é verdade na maioria dos casos. As pessoas alteram o código para atingir objetivos a curto prazo, muitas vezes sem entender a arquitetura da aplicação como um todo, dessa forma o código perde sua estrutura. Perda de estrutura tem um efeito acumulativo. Você vai se perceber refatorando código feio, mas um código bonito também precisa ser refatorado.
  4. Um código bem testado não apenas permite refatoração, mas também

    possibilita que novas funcionalidades sejam adicionadas de forma mais segura, já que qualquer possível bug criado com a nova funcionalidade pode ser facilmente encontrado e corrigido. Um lembrete:
  5. Nome misterioso Quando você não consegue pensar num bom nome

    para algo talvez isso seja um sinal de um problema maior.
  6. Código duplicado Toda vez que você olhar pra essas duplicações

    você precisa ler com cuidado para identificar a diferença.
  7. Função longa Quando maior for a função, mais difícil de

    entender Classe grande Uma classe com tanto código é uma péssima oportunidade para código duplicado e caos.
  8. Cirurgia de rifle Toda vez que você muda algo, é

    necessário fazer uma série de pequenas mudanças em várias classes diferentes.
  9. Longa lista de parâmetros Uma função que contém uma lista

    longa de argumentos geralmente fica bem confusa Obsessão por primitivos Às vezes tipos primitivos, tais como inteiros, números com pontos flutuantes e strings não representam o tipo de dados com o qual se está lidando.
  10. Generalidade Especulativa Coisas criadas antes de serem necessárias • Classe

    abstrata sem utilidade • Delegação desnecessária • Funções com argumentos nunca usados
  11. Comentários Quando você sente a necessidade de escrever um comentário,

    primeiro tente refatorar o código de uma forma de comentários se tornem desnecessários. Polemic topic!
  12. Extrair função Se você precisa se esforçar olhando um bloco

    de código tentando entender a sua funcionalidade então você deveria extrair funções. Internalizar função O contrário de extrair função, onde o corpo da função é tão claro quanto o nome.
  13. Extrair classe Quando você se deparar com uma classe tão

    grande a ponto de nao ser facilmente entendida você deveria considerar onde ela pode ser dividida. Internalizar classe Quando não faz mais sentido determinada lógica estar numa classe separada.
  14. Ocultar delegação Encapsulamento significa que módulos pouco precisam saber de

    outras partes do sistema. Lei de Demeter (Não fale com estranhos) Remover intermediário O contrário de ocultar delegação.
  15. Extrair variável Dar nome a uma expressão complexa e complicada

    de ler Internalizar variável Quando a variável não diz mais que a própria expressão. Named properties PHP 8
  16. Mudar declaração de função | Renomear método Um bom nome

    permite que se entenda o propósito da função quando você vê ela sendo invocada. Renomear variável Nomear bem as coisas é o coração da programação clara. Renomear campos Nomes de campos são importantes principalmente quando esses são muito utilizados na aplicação.
  17. Introduzir objeto de parâmetros Grupos de dados que costumam estar

    juntos pode ser substituído por uma estrutura de dados. Substituir primitivo por objeto Exemplo: Número de telefone, valor monetário Preservar objeto inteiro Ao invés de passar vários valores de um objeto como argumento, pode-se passar o objeto inteiro.
  18. Mover função | Mover campo Mover a função ou campo

    para um nível acima ou até mesmo entre classes Deslocar instruções Um código é mais legível quando as coisas correlacionadas aparecem juntas.
  19. Dividir Loop Dessa forma você garante que precisa entender uma

    coisa por vez Separe refatoração de otimização $averageAge = 0; $totalSalary = 0; foreach ($people as $person) { $averageAge += $person->page; $totalSalary += $person->salary; } $averageAge = $averageAge / count($people); $averageAge = 0; $totalSalary = 0; foreach ($people as $person) { $averageAge += $person->page; } foreach ($people as $person) { $totalSalary += $person->salary; } $averageAge = $averageAge / count($people);
  20. Decompor conditional Aplicar “Extrair função” na condição e em cada

    parte dela. if ($date->before(SUMMER_START) || $date->after(SUMMER_END)) { $charge = $quantity * $winterRate + $winterServiceCharge; } else { $charge = $quantity * $summerRate; } if (isSummer($date)) { $charge = summerCharge($quantity); } else { $charge = winterCharge($quantity); }
  21. Substituir condicional aninhada por cláusulas de guarda Invertendo as condições

    por exemplo function getPayAmount() { if ($this->isDead) { $result = $this->deadAmount(); } else { if ($this->isSeparated) { $result = $this->separatedAmount(); } else { if ($this->isRetired) { $result = $this->retiredAmount(); } else { $result = $this->normalPayAmount(); } } } return $result; } function getPayAmount() { if ($this->isDead) { return $this->deadAmount(); } if ($this->isSeparated) { return $this->separatedAmount(); } if ($this->isRetired) { return $this->retiredAmount(); } return $this->normalPayAmount(); }
  22. Substituir condicional por polimorfismo Criar subclasses para cada ramificação da

    estrutura condicional. abstract class Bird { // ... abstract function getSpeed(); // ... } class European extends Bird { public function getSpeed() { return $this->getBaseSpeed(); } } class African extends Bird { public function getSpeed() { return $this->getBaseSpeed() - $this->getLoadFactor() * $this->numberOfCoconuts; } } class NorwegianBlue extends Bird { public function getSpeed() { return ($this->isNailed) ? 0 : $this->getBaseSpeed($this->voltage); } } // Somewhere in Client code. $speed = $bird->getSpeed(); class Bird { // ... public function getSpeed() { switch ($this->type) { case EUROPEAN: return $this->getBaseSpeed(); case AFRICAN: return $this->getBaseSpeed() - $this->getLoadFactor() * $this->numberOfCoconuts; case NORWEGIAN_BLUE: return ($this->isNailed) ? 0 : $this->getBaseSpeed($this->voltage); } throw new Exception("Should be unreachable"); } // ... }
  23. Separar consulta de modificador O famoso caso do findAndDoSomethingElse. Uma

    função que retorna um valor não deveria sofrer efeitos colaterais.
  24. Parametrizar função Funções de lógica semelhante com valores diferentes podem

    ser substituídas por uma única função com parâmetro.
  25. Remover argumento de flag Casos onde uma flag é usada

    para indicar qual lógica a função vai executar. Fica mais mais claro criar funções explícitas para cada tarefa.
  26. Substituir construtor por uma factory Criando um único ponto onde

    a classe é instanciada, evita alto acoplamento. class Employee { // ... public function __construct($type) { $this->type = $type; } // ... } class Employee { // ... static public function create($type) { $employee = new Employee($type); // do some heavy lifting. return $employee; } // ... }
  27. O segredo de uma refatoração eficaz é reconhecer que você

    vai mais rápido quando você dá passos pequenos. Martin Fowler
  28. Dicas Fique de olho nas atualizações Crie testes Passos pequenos

    Não perca a chance de melhorar o código Code review é uma oportunidade para se discutir mudanças
  29. Mais conteúdo by Martin Fowler, with Kent Beck 2018 -

    2nd edition https://martinfowler.com/books/refactoring.html Refactoring Improving the Design of Existing Code https://refactoring.guru