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

Refactoring: porque, quando e como

Refactoring: porque, quando e como

No geral, códigos são mais lidos do que escritos, então é necessário ter um code base que seja fácil de ler, entender e manter. Esta apresentação visa mostrar seu público quais são as motivações para refatorar o código, quando se deve refatorar e técnicas de como fazer. Serão apresentados conceitos como code smells e técnicas de refactoring.

Ian Rodrigues

June 09, 2018
Tweet

More Decks by Ian Rodrigues

Other Decks in Technology

Transcript

  1. O que é Refactoring? • É o processo de alterar

    um software de tal forma que o seu comportamento externo não é alterado, mas a sua estrutura interna é melhorada; — Martin Fowler, Refactoring • Não adiciona funcionalidade; • Desenvolvimento em 2 fases.
  2. Por que fazer refactoring? • Melhora legibilidade; • Mais tempo

    lendo, do que escrevendo; • Mantém o código limpo; • Reduz duplicação; • Melhora a mantenabilidade — ajuda novos membros da equipe;
  3. Quando fazer refactoring? • Não existe um momento específico —

    faça em curtas iterações; • Faça em pequenos passos, com constância; • Adicionar… Refatorar… Adicionar… Refatorar…; • Faça do Refactoring uma prioridade.
  4. Como fazer Refactoring? • Código está sob controle de versão

    — git, svn, etc; • Seu código deve estar funcionando, não refatore código quebrado — testes?; • Deve ser feito passo-a-passo; • Seus testes não podem quebrar, seus testes estão verdes e devem continuar assim; • Doença x Tratamento.
  5. Code Smells • Indicativos de potenciais problemas; • Code Smell

    !== Código Ruim — Ele indica que ali podem existir problemas; • Todo desenvolvedor precisa conhecer.
  6. Object-Orientation Abusers • Switch Statements; • Temporary Field; • Refused

    Bequest; • Alternative Classes with Different Intefaces.
  7. Dispensables • Comments; • Duplicate Code; • Lazy Class; •

    Data Class; • Dead Code; • Speculative Generality.
  8. Refactoring Techniques • Passo-a-Passo de Refactoring; • Eles tem seus

    pros e contras; • Motivação devida, aplicação com cautela.
  9. Composing Methods • Extract Method; • Inline Method; • Extract

    Variable; • Inline Temp; • Replace Temp with Query; • Split Temporary Variable; • Remove Assignments to Parameters; • Replace Method with Method Object; • Substitute Algorithm.
  10. Moving Features between Objects • Move Method; • Move Field;

    • Extract Class; • Inline Class; • Hide Delegate; • Remove Middle Man; • Introduce Foreign Method; • Introduce Local Extension.
  11. Organizing Data • Self Encapsulate Field; • Replace Data Value

    with Object; • Change Value to Reference; • Change Reference to Value; • Replace Array with Object; • Duplicate Observed Data; • Change Unidirectional Association to Bidirectional; • Change Bidirectional Association to Unidirectional; • Replace Magic Number with Symbolic Constant; • Encapsulate Field; • Encapsulate Collection; • Replace Type Code with Class; • Replace Type Code with Subclasses; • Replace Type Code with State/ Strategy; • Replace Subclass with Fields.
  12. Simplifying Conditional Expressions • Decompose Conditional; • Consolidate Conditional Expression;

    • Consolidate Duplicate Conditional Fragments; • Remove Control Flag; • Replace Nested Conditional with Guard Clauses; • Replace Conditional with Polymorphism; • Introduce Null Object; • Introduce Assertion.
  13. Simplifying Method Calls • Rename Method; • Add Parameter; •

    Remove Parameter; • Separate Query from Modifier; • Parameterize Method; • Replace Parameter with Explicit Methods; • Preserve Whole Object; • Replace Parameter with Method Call; • Introduce Parameter Object; • Remove Setting Method; • Hide Method; • Replace Constructor with Factory Method; • Replace Error Code with Exception; • Replace Exception with Test.
  14. Dealing with Generalization • Pull Up Field; • Pull Up

    Method; • Pull Up Constructor Body; • Push Down Method; • Push Down Field; • Extract Subclass; • Extract Superclass; • Extract Interface; • Collapse Hierarchy; • Form Template Method; • Replace Inheritance with Delegation; • Replace Delegation with Inheritance.
  15. Extract Method public function printProduct() { $this->printBanner(); // print details

    print("name: " . $this->name); print("amount " . $this->getOutstanding()); }
  16. Extract Method public function printProduct() { $this->printBanner(); $this->printDetails(); } public

    function printDetails() { print("name: " . $this->name); print("amount " . $this->getOutstanding()); }
  17. Replace Conditional w/ Polymorphism class Bird { ... function getSpeed()

    { switch ($this->type) { case EUROPEAN: return $this->getBaseSpeed(); case AFRICAN: return $this->getBaseSpeed() - $this->getLoadFactor(); case NORWEGIAN_BLUE: return ($this->isNailed) ? 0 : $this->getBaseSpeed($this->voltage); } throw new Exception("Should be unreachable”); } ... }
  18. Replace Conditional w/ Polymorphism abstract class Bird { ... abstract

    function getSpeed(); ... } class EuropeanBird extends Bird { ... function getSpeed() { return $this->getBaseSpeed(); } ... }
  19. Replace Conditional w/ Polymorphism abstract class Bird { ... abstract

    function getSpeed(); ... } class AfricanBird extends Bird { ... function getSpeed() { return $this->getBaseSpeed() - $this->getLoadFactor(); } ... }
  20. Replace Conditional w/ Polymorphism abstract class Bird { ... abstract

    function getSpeed(); ... } class NorwegianBlueBird extends Bird { ... function getSpeed() { return ($this->isNailed) ? 0 : $this->getBaseSpeed($this->voltage); } ... }