Fluent Interface

Fluent Interface é usada para deixar o código muito mais limpo, fácil de entender e dar manutenção. A idéia é que o código do domínio fique mais parecido com a forma que falamos, para um melhor entendimento do código. O objetivo é fazer uso de uma DSL Interna para se aproximar à linguagem natural, no nosso caso o Português!

Vou mostrar o exemplo de um código e refatorá-lo até que fique fluente. Trata-se de uma aplicação de transação bancária que será demonstrada em três fases.

Fase 1:

Imagem19

Quais são os problemas desse código? Vários! Ele funciona normalmente e vai trazer os resultados esperados, porém ele pode se tornar muito ruim para dar manutenção por não ser fluente. Vamos ver por quê?

A entidade Conta parece não ter inteligência nenhuma, pois ela não sabe debitar ou creditar um valor em seu saldo. Outro problema é que se o calculo do débito ou do crédito mudar, será necessário alterar todo lugar na aplicação que estiver usando esse cálculo pois ele não está centralizado na classe Conta. Esse código precisa de comentários pois ele não é auto-explicativo.

Um objeto deve, em termos de Orientação a Objetos, saber o porquê de sua existência e conhecer seus estados válidos. O objeto não deve fornecer métodos que invalidem seu estado. Nesse exemplo, uma classe cliente poderia esquecer um parênteses de deixar o saldo inválido:

conta.setSaldo(conta.getSaldo() + valor * 2 );

Não devemos pensar em uma classe como uma mera coleção de atributos. Objetos também não são atributos mais funções, e sim estado + comportamento. O Phillip Calçado explica muito bem isso!

Refatorando, o método ficaria assim:

Fase 2:

Imagem20

Um pouco melhor pois agora não precisa de comentários, já que a Conta sabe debitar e creditar. Porém esse código ainda tem muito ruído e pode se tornar mais legível.

Vou dar um exemplo de como ficaria a implementação do mesmo método usando fluent interface.
Fase 3:

Imagem21

O código fica bem mais limpo. A implementação dos outros métodos ficaria assim:

Imagem22

Nesse último exemplo utilizei o conceito de Repositório, o qual faz mais sentido no domínio do que os DAOs. A validação do valor do dinheiro no primeiro exemplo agora fica no construtor na classe dinheiro, o que faz mais sentido.

Imagem23

O Guilherme explicou muito bem no blog dele sobre o assunto nesses posts. Vale a pena dar uma espiadinha. 🙂
Publicado em design. Tags: , . 11 Comments »