Interface Fluente e StepBuilders
Interface Fluente
Por que criar interfaces fluentes (Fluent Interfaces)?
Simples, lembra do Builder? Este padrão de projeto nos ajuda a escrever códigos menos complexos e intuitivos, minimizando os erros durante o desenvolvimento.
A interface fluente é muito parecida com o builder, é muito usada na criação de API e utilitários, fazendo com que o desenvolvedor seja guiado, auto explicando seu uso a cada passo.
Mas por onde começar? Suponha que tem a classe Nf possua alguns atributo e uma lista de ItemNf:
Para instanciarmos essa classe fazemos assim:
Essa classe por ser pequena, não trás grande complexidade, olhando a forma de uso, mesmo verboso criar uma instancia de Nf é simples.
Refatoremos agora a classe Nf usado o padrão Interface fluente:
Pouca coisa foi mudado certo? Vejamos o uso:
O que acharam? Mais intuitivo? Essa é a grande vantagem a Interface Fluente, a forma de uso ficou bem mais clara, a própria classe explica, guia o desenvolvedor no seu uso.
Mas ainda existe um problema aqui, se usarmos os métodos na ordem errada nossa interface ficará não fluente. Exemplo:
Esquisito né? A leitura já não está fluente, além disso, nada impede de esquecer o preenchimento do cliente:
Para quem esses itens foram vendidos? Isso pode causar erro, caso o cliente seja obrigatório em uma NF.
StepBuilders
Para resolver esse problema, existe um outro padrão de projeto bem interessante, chamado StepBuilders.
Ele tem o objetivo de resolver problemas do builder tradicional e da interface fluente, tais como:
- Não guiar o usuário corretamente para criação de um objeto;
- O usuário pode finalizar a construção do objeto a qualquer momento, chamando o método que finaliza a execução, mesmo sem todas as informações necessárias. Deixando o objeto em um estado incoerente
O StepBuilder funciona simplesmente encadeando interfaces, cada uma representando um passo na criação de um objeto ou execução de uma ação.
Usando o mesmo exemplo da Nf, vejamos agora com fica nossa interface fluente implementando também o padrão StepBuilder:
O uso é bem parecido com a anterior, a diferença é que a IDE vai te ajudar e não errar.
Caso você tente trocar a ordem dos métodos, o Java lançará um erro de compilação, algo parecido com isso:
Error:(34, 25) java: D:\workspace\untitled\src\Nf.java:34: cannot find symbol
symbol : method paraCliente(java.lang.String)
location: interface Nf.NumeroStep
Eu gosto muito de escrever interfaces fluentes, principalmente na criação de utilitários. Assim que der falo sobre alguns utilitários que criei.
Se gostou deixe-me um comentário.
Abraços.
Fontes:
Originally published at edermfl.wordpress.com on January 5, 2016.