Categories
Engenharia de software

Um exemplo prático de Fluent Interface

Há alguns meses escreví um post sobre Fluent Interfaces, mostrando um trabalho que fizemos aqui na empresa para tornar nossa API interna mais fácil de se utilizar. Depois disso, algumas pessoas me pediram códigos e exemplos de uso da WebMediaAPI, mas o código é da empresa e não posso compartilhá-lo.

Fiquei então com a idéia de criar uma demonstração de uso de Fluent Interfaces na cabeça, mas eu queria usar um domínio fácil para que as pessoas pudessem entender melhor. A WebMediaAPI pode ser até legal, mas o fato é que ninguém conhece o modelo de mídias da Globo.com e fica difícil de explicar ou discutir o que está sendo feito.

Há duas semanas, conversando com o Evandro sobre uma apresentação que faremos mês que vem no evento de tecnologia da Globo.com, ele deu uma idéia super simples e bem legal. Todas as pessoas já trabalharam com e-mail, seja enviando mensagens para outras pessoas ou então escrevendo código para enviar e-mails em diversas linguagens. Esse é um domínio extramanete fácil para todo mundo, e também, é pequeno o suficiente para ser implementado rapidamente em um dia.

Então, nasceu a Fluent Mail API. A Fluent Mail API é uma API simples que utiliza a JavaMail API da Sun para enviar e-mails. Meu objetivo não é criar mais uma ferramenta para envio de e-mails, é apenas demonstrar o uso de Fluent Interfaces como wrapper de um framework maior, simplificando seu uso. A idéia é fazer com que enviar um e-mail seja tão fácil quanto isso:

new EmailMessage()
    .from("demo@guilhermechapiewski.com")
    .to("destination@address.com")
    .withSubject("Fluent Mail API")
    .withBody("Demo message")
    .send();

Você pode ver os códigos-fonte e uma descrição mais detalhada no site do “projeto”. Se alguém quiser discutir, opinar, tirar dúvidas ou qualquer outra coisa, é só comentar.

14 replies on “Um exemplo prático de Fluent Interface”

Bem legal!
Será que o construtor não poderia ficar inline tambem?! Algo como:

EmailMessage.new()
.from(“demo@guilhermechapiewski.com”)
.to(“destination@address.com”)
.withSubject(“Fluent Mail API”)
.withBody(“Demo message”)
.send();

ou até mesmo

EmailMessage.
.from(“demo@guilhermechapiewski.com”)
.to(“destination@address.com”)
.withSubject(“Fluent Mail API”)
.withBody(“Demo message”)
.send();

[]’s

@Daniel

Cara, tecnicamente até é possível fazer do jeito que você fez, mas eu vejo alguns problemas. Na opção (1), por exemplo, a interface fica menos fluente. Experimente ler as duas em inglês e vai perceber que “new e-mail message from fulano…” é mais natural que “e-mail message new to fulano…”, sem contar que o new precisaria ser estático. Já na opção (2), o problema é que vocë precisaria de métodos estáticos e você teria mais trabalho para gerenciar o estado do objeto.

@Rafael

Infelizmente os eventos não são abertos (ainda) 🙂

De fato, “brincar” com as DSLs é a melhor forma de assimilar e difundir o conceito. Parabéns, a idéia da API de e-mails é bem legal! Semana passada escrevi uma wrapper aqui no trabalho para facilitar operações de autenticação/autorização num servidor LDAP. 😉

[]s

A configuração do Module do Guice é assim, eu achei demais, mas não sabia que tinha nome (Fluent Interface), vou pesquisar mais sobre isso, fica até legal de desenvolver assim hehe.
Parabéns pelo post

Em primeiro lugar PARABÉNS! Ficou muito bom o seu exemplo…

Eu baixei o código para analisar e fiz uma alteração que acho que ficou mais legal. Eu mudei o parâmetro de dois métodos para usar varargs

EmailBuilder cc(String… address);

EmailBuilder bcc(String… address);

Assim acho que fica mais legal. Porque vamos supor que a lista de e-mails de cc vem de um repository…então não tem como vc ficar fazendo:

cc(email1).cc(email2).cc(email3). Então usando varargs resolve este problema, você passa a lista direto.

[]’s

ola! Guilherme, realmente muito show. A respeito da sugestao EmailBuilder bcc(String… address); se implementar no projeto, deve lembrar quem baixar o novo code, deve ter o java 5, ja que var-args nasceu na versao 1.5.

abraco

Leave a Reply to daniel gatis Cancel reply

Your email address will not be published. Required fields are marked *