Skip to content

Instantly share code, notes, and snippets.

@nelsonsar
Created October 21, 2017 01:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save nelsonsar/e4eef20a64b0696de2541f002f5a226d to your computer and use it in GitHub Desktop.
Save nelsonsar/e4eef20a64b0696de2541f002f5a226d to your computer and use it in GitHub Desktop.
Explicação Law of Demeter

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

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment