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.

Tags: , , , , , ,

14 Responses to “Um exemplo prático de Fluent Interface”

  1. daniel gatis says:

    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

  2. Muito legal Guillherme, deu para entender a idéia muito fácil!

  3. Rafael Dx7 says:

    eu ouvi falar em evento? aberto ao público? hum… interessante.

  4. @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) :)

  5. 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

  6. Guilherme, tive a liberdade de reproduzir seu post, devidamente creditado , no meu blog.

    Parabéns pela iniciativa.

  7. Putz…daqui a pouco até minha mãe vai desenvolver software. :)
    Muito bom isso…
    Guilherme…Algum livro sobre isso?? O novo livro do Martin Fowler abordará alguma coisa sobre?

  8. daniel gatis says:

    @Guilherme Chapiewski

    me convenceu! ;)
    []s

  9. Luiz Gustavo Roos says:

    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

  10. lavh says:

    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

  11. Cara, super iniciativa. Parabéns!

  12. @lavh

    Boa idéia! Vou incluir sua alteração no projeto :) Obrigado! Se vc tiver mais ideias legais, entre em contato comigo. Posso te cadastrar lá como commiter pra você me ajudar, se vc tiver interesse.

    [ ]s, gc

  13. [...] por falar em fluent interfaces, o Guilherme Chapiewski fez dois ótimos posts a alguns [...]

  14. Camilo lopes says:

    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