Guest User

Untitled

a guest
Oct 21st, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.79 KB | None | 0 0
  1. # Law of Demeter
  2.  
  3. ## Motivação
  4.  
  5. Diminuir o acomplamento entre objetos.
  6.  
  7. ## Como?
  8.  
  9. A lei sugere que objetos só podem falar com seus "amigos" e não com "estranhos". Essa ideia faz com que um objeto não conheça a estrutura interna de outro objeto e, se por um caso surja essa necessidade a API deve ser modificada para evitar que isso aconteça.
  10.  
  11. ## Exemplo
  12.  
  13. O exemplo clássico é:
  14.  
  15. ```php
  16. <?php
  17.  
  18. class Paperboy {
  19. public function receiveFrom($user, $amount)
  20. {
  21. if ($user->wallet->getTotalAmount() > $amount) {
  22. $newTotal = $this->wallet->getTotalAmount() + $amount;
  23. $this->wallet->setTotalAmount($newTotal);
  24. $user->wallet->setTotalAmount($user->wallet->getTotalAmount() - $amount);
  25. }
  26. }
  27. }
  28. ```
  29.  
  30. De acordo com a regra o `Paperboy` não deveria saber da existência do objeto `Wallet` do usuário e, pior ainda saber como opera-lo (o `Wallet` faz parte do estado inter do `$user` que pode mudar pra alguma outra coisa, como `CreditCard`). Pra resolver o problema podemos criar um método `pay` no `$user` e evitar com que o estado interno do `$user` seja manipulado por outros objetos diminuindo o acoplamento estrutural.
  31.  
  32. ## Builders
  33.  
  34. Um builder é usado pra construir um objeto complexo. Mas, não necessariamente ele precisa saber do estado interno (a estrutura) do objeto a ser construído para isso, existem duas maneiras que me vem a mente agora usar *setters* ou "acumular" os parâmetros para construção desse objeto. Apesar de não ser fã de *setters* eles **devem** abstrair o estado interno do objeto não dando nenhuma pista de como o dado é armazenado no objeto e **não devem** chamar cadeias de métodos pra essa construção. "Acumulando" podemos usar uma estrutura de dados ou estado interno do próprio builder pra construir o objeto em questão.
Add Comment
Please, Sign In to add comment