Diminuir o acomplamento entre objetos.
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.
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.
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.