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

Melhore a Qualidade do seu Código com Object Calisthenics

Melhore a Qualidade do seu Código com Object Calisthenics

Um código com qualidade é essencial para um projeto de sucesso e existem diversas práticas que ajudam a alcançar esse objetivo. Object Calisthenics é uma série de boas práticas que ajudarão a tornar o seu legível, manutenível, testável e compreensível. Com uma dose pequena de exercícios diários, você notará a diferença no seu código.

Marcel dos Santos

November 28, 2017
Tweet

More Decks by Marcel dos Santos

Other Decks in Programming

Transcript

  1. Learning OOP in PHP Tutoriais, vídeos, slides, livros sobre OOP,

    OOD, design patterns, refatoração e arquitetura. bit.ly/Learning-OOP-in-PHP
  2. function productsWithDiscount($products) { $productsWithDiscount = []; if (isset($products) !&& count($products))

    { foreach ($products as $product) { if ($product['has_discount']) { $productsWithDiscount[] = $product; } } } return $productsWithDiscount; } Exemplo 1
  3. function productsWithDiscount($products) { $productsWithDiscount = []; if (isset($products) !&& count($products))

    { foreach ($products as $product) { if ($product['has_discount']) { $productsWithDiscount[] = $product; } } } return $productsWithDiscount; } Exemplo 1 0 1 2 3
  4. function productsWithDiscount($products) { $productsWithDiscount = []; if (isset($products) !&& count($products))

    { foreach ($products as $product) { if ($product['has_discount']) { $productsWithDiscount[] = $product; } } } return $productsWithDiscount; } Exemplo 1 0 1 2 3 três níveis de indentação
  5. function productsWithDiscount($products) { $productsWithDiscount = []; if (isset($products) !&& count($products))

    { foreach ($products as $product) { if ($product['has_discount']) { $productsWithDiscount[] = $product; } } } return $productsWithDiscount; } Exemplo 1
  6. function productsWithDiscount($products) { $productsWithDiscount = []; if (isset($products) !&& count($products))

    { foreach ($products as $product) { if ($product['has_discount']) { $productsWithDiscount[] = $product; } } } return $productsWithDiscount; } Exemplo 1 remover condições desnecessárias
  7. function productsWithDiscount($products) { $productsWithDiscount = []; foreach ($products as $product)

    { if ($product['has_discount']) { $productsWithDiscount[] = $product; } } return $productsWithDiscount; } Exemplo 1 0 1 2
  8. function productsWithDiscount($products) { $productsWithDiscount = []; foreach ($products as $product)

    { if ($product['has_discount']) { $productsWithDiscount[] = $product; } } return $productsWithDiscount; } Exemplo 1
  9. function productsWithDiscount($products) { $productsWithDiscount = []; foreach ($products as $product)

    { if ($product['has_discount']) { $productsWithDiscount[] = $product; } } return $productsWithDiscount; } Exemplo 1 extrai para um método utiliza função para filtragem
  10. * facilita a leitura
 * reduz a complexidade ciclomática *

    favorece o SRP e o KISS * encoraja o reuso Benefícios
  11. function login($username, $password) { if ($this!->isValid($username, $password)) { return redirect('homepage');

    } else { addFlash('error', 'invalid login'); return redirect('login'); } } Exemplo 2
  12. function login($username, $password) { !// defensive approach if ($this!->isValid($username, $password))

    { return redirect('homepage'); } addFlash('error', 'invalid login'); return redirect('login'); } Exemplo 2
  13. function login($username, $password) { !// optimistic approach if (! $this!->isValid($username,

    $password)) { addFlash('error', 'invalid login'); return redirect('login'); } return redirect('homepage'); } Exemplo 2
  14. * facilita a leitura
 * reduz a complexidade ciclomática *

    evita a duplicidade de código Benefícios
  15. class User { private $name; private $email; public function !__construct(string

    $name, string $email) { $this!->name = $name; $this!->email = $email; } } $user = new User('Alice', '[email protected]'); !// ok $anotherUser = new User('Bob', '1122334455'); !// ok Exemplo 3
  16. class Email { private $email; public function !__construct(string $email) {

    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { throw new InvalidArgumentException('invalid format'); } $this!->email = $email; } } $user = new User(‘Alice', new Email('[email protected]')); !// ok $anotherUser = new User('Bob', new Email('1122334455')); !// not ok Exemplo 3
  17. * uso de type hinting
 * encoraja o reuso *

    evita a duplicidade de código Benefícios
  18. There are only two hard things in Computer Science: cache

    invalidation and naming things. Phil Karlton
  19. Tell Don’t Ask não peça informações para fazer o seu

    trabalho, apenas diga para o objeto que possui a informação para fazer o trabalho para você
  20. !// Game class private $score; public function setScore($score) { $this!->score

    = $score; } public function getScore() { return $this!->score; } !// Usage $game!->setScore($game!->getScore() + ENEMY_DESTROYED_SCORE); Exemplo 4
  21. !// Game class private $score; public function setScore($score) { $this!->score

    = $score; } public function getScore() { return $this!->score; } !// Usage $game!->setScore($game!->getScore() + ENEMY_DESTROYED_SCORE); Exemplo 4 está pedindo informações para realizar seu trabalho
  22. !// Game class public function addScore($delta) { this!->score += $delta;

    } !// Usage $game!->addScore(ENEMY_DESTROYED_SCORE); Exemplo 4 está dizendo para o objeto realizar o trabalho para você
  23. 1. somente um nível de indentação por método 2. não

    utilizar a palavra-chave else 3. encapsular todos tipos primitivos e strings 4. coleções de primeira classe 5. um ponto por linha Revisão
  24. 6. não abrevie
 7. mantenha todas as entidades pequenas 8.

    nenhuma classe com mais de duas variáveis de instância 9. sem getters, setters ou propriedades Revisão (continuação)