Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Law of Demeter
- ## Motivação
- Diminuir o acomplamento entre objetos.
- ## Como?
- 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.
- ## Exemplo
- O exemplo clássico é:
- ```php
- <?php
- class Paperboy {
- public function receiveFrom($user, $amount)
- {
- if ($user->wallet->getTotalAmount() > $amount) {
- $newTotal = $this->wallet->getTotalAmount() + $amount;
- $this->wallet->setTotalAmount($newTotal);
- $user->wallet->setTotalAmount($user->wallet->getTotalAmount() - $amount);
- }
- }
- }
- ```
- 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.
- ## Builders
- 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