Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Java Poliglota Idéias Para Aplicações Multilíngue Phillip Calçado http://www.fragmental.com.br
<ul><li>Mostrar idéias para utilizar linguagens alternativas na sua aplicação </li></ul>Objetivo
<ul><li>Quem é Você? </li></ul><ul><li>Novas Linguagens da Plataforma Java </li></ul><ul><li>Por que Utilizar? </li></ul><...
<ul><li>Phillip Calçado,  a.k.a.   Shoes </li></ul><ul><li>Arquiteto de Sistemas / Consultor </li></ul><ul><li>Programador...
Novas Linguagens da  Plataforma Java
Novas Linguagens <ul><li>A comunidade Java já produziu centenas de linguagens para a JVM, de BASIC até LISP </li></ul><ul>...
Por Que Utilizar? ?
Por Que Utilizar? <ul><li>Java não é Panacéia </li></ul><ul><li>Linguagens especializadas facilitam desenvolvimento </li><...
Como Utilizar? ?
Como Utilizar? <ul><li>Linguagens geram bytecodes compatíveis ou são interpretadas </li></ul><ul><li>Geralmente todo o nec...
Nosso Estudo de Caso:
Groovy <ul><li>Padronizada pela JSR 241 </li></ul><ul><li>Dinâmica, muito parecida com Ruby e Python </li></ul><ul><li>Sin...
class Usuario{   @Property nome; List grupos=new ArrayList();   def adicionar(grupo){ grupos.add grupo } def isAdministrad...
import java.util.List; import java.util.ArrayList; import java.util.Iterator; class Usuario{ private String nome; private ...
Uso Sugerido: Configuração <!-- Subscription form bean --> <form-bean    name=&quot;subscriptionForm&quot;   type=&quot;or...
Configuração <ul><li>Substituindo XML </li></ul><ul><li>Linguagem imperativa  </li></ul><ul><li>Recursos de loops, condici...
<grupo nome=&quot;Funcionarios&quot; nivel=&quot;1&quot;> <pessoa login=&quot;pcalcado&quot; nome=&quot;Phillip Calçado&qu...
phillip = new Pessoa() phillip.nome= &quot;Phillip Calçado&quot; phillip.email= &quot;pcalcado.gmail.com&quot; ottilia = n...
Uso Sugerido:  Regras de Negócio
 
Regras de Negócio <ul><li>Dinamismo traz flexibilidade </li></ul><ul><li>Pode-se carregar Regras de Negócio novas </li></u...
public class VendeProduto{ public void efetuarVenda(Produto produto, Cliente cliente){ cliente.adicionarProduto(p); } }
Este mês, comprando 1 você ganha um grátis public class VendeProduto{ public void efetuarVenda(Produto produto, Cliente cl...
Se o cliente utilizar o Cartão Tabajara, 10% de desconto public class VendeProduto{ public void efetuarVenda(Produto produ...
Não estamos aceitando Capivara Card public class VendeProduto{ public void efetuarVenda(Produto produto, Cliente cliente){...
public class VendeProduto { public void efetuarVenda(Produto produto, Cliente cliente){ preVenda(Produto produto, Cliente ...
def preVenda(produto, cliente){ if(cliente.cartaoCredito.bandeira== “CAPIVARA”) throw new CaloteiroException(); } def posV...
Uso Sugerido: Shell
 
Shell <ul><li>Acesso direto aos objetos de negócio </li></ul><ul><li>Nada de atualizações via SQL </li></ul><ul><li>Interf...
--Remove as compras canceladas DELETE FROM COMPRAS WHERE COD_CLIENTE=0223 --Retorna produtos para o estoque UPDATE ESTOQUE...
Login: admin Senha: ****** --- Bem vindo ao Shell do VENDAS WEB vendasweb>  cliente = gerenciadorClientes.buscarPeloCodigo...
Uso Sugerido: Scripting
Scripting <ul><li>Todo poder de um Shell </li></ul><ul><li>Um programa dentro do programa </li></ul><ul><li>Automatiza tar...
From:  [email_address] To:  [email_address] Subject: INSTRUÇÕES PARA REMOVER VENDAS INDEVIDAS Caro cliente, para efetuar o...
Login: admin Senha: ****** --- Bem vindo ao Shell do VENDAS WEB vendasweb>  carregar_script “c:correcao_vendas_indevidas.g...
Domain Specific Languages
Domain Specific Languages <ul><li>Tendência forte em MDD </li></ul><ul><li>Relativamente compatível com MDA </li></ul><ul>...
Domain Specific Languages
Conclusão !
Conclusão <ul><li>Não existe Tamanho Único em linguagens de programação </li></ul><ul><li>Java não é a única linguagem da ...
<ul><li>Bruce Tate & Justin Gehtland  – Beyond Java </li></ul><ul><li>Andrew Hunt & David Thomas –  The Pragmatic Programm...
<ul><li>http://groovy.codehaus.org/ </li></ul><ul><li>http://www.beanshell.org/ </li></ul><ul><li>http://www.jython.org/ <...
<ul><li>http://www.metacase.com/ </li></ul><ul><li>http://msdn.microsoft.com/vstudio/teamsystem/workshop/sf </li></ul><ul>...
Continua em...
Contato http://www.fragmental.com.br http://www.guj.com.br http://www.riojug.org [email_address]
Obrigado! Que Zahl os Acompanhe...
Upcoming SlideShare
Loading in …5
×

(Portuguese) Java EE Poliglota

1,346 views

Published on

Apresentação realizada em 2006 no RioJavaSummit.

Published in: Technology, News & Politics
  • Be the first to comment

(Portuguese) Java EE Poliglota

  1. 1. Java Poliglota Idéias Para Aplicações Multilíngue Phillip Calçado http://www.fragmental.com.br
  2. 2. <ul><li>Mostrar idéias para utilizar linguagens alternativas na sua aplicação </li></ul>Objetivo
  3. 3. <ul><li>Quem é Você? </li></ul><ul><li>Novas Linguagens da Plataforma Java </li></ul><ul><li>Por que Utilizar? </li></ul><ul><li>Como Utilizar? </li></ul><ul><li>Nosso Estudo de Caso </li></ul><ul><li>Uso Sugerido: Configuração </li></ul><ul><li>Uso Sugerido: Regras de Negócio </li></ul><ul><li>Uso Sugerido: Shells </li></ul><ul><li>Uso Sugerido: Scripting </li></ul><ul><li>Domain Specific Languages </li></ul><ul><li>Conclusão </li></ul><ul><li>Bibliografia, Links e Referências </li></ul>Agenda
  4. 4. <ul><li>Phillip Calçado, a.k.a. Shoes </li></ul><ul><li>Arquiteto de Sistemas / Consultor </li></ul><ul><li>Programador desde 1996 </li></ul><ul><li>Com Java desde 2003 </li></ul><ul><li>JUG Leader do RioJUG </li></ul><ul><li>Coordenador do GUJ </li></ul><ul><li>Escritor ocasional </li></ul><ul><li>Aplicações para análise de risco, redes GSM, gestão de conteúdo, setor financeiro, biologia, logística... a grande maioria utilizando Java EE </li></ul>Quem é Você?
  5. 5. Novas Linguagens da Plataforma Java
  6. 6. Novas Linguagens <ul><li>A comunidade Java já produziu centenas de linguagens para a JVM, de BASIC até LISP </li></ul><ul><li>Grandes empresas (Bea, IBM...) já utilizam há um bom tempo </li></ul><ul><li>Java não era uma plataforma muito amigável para outras linguagens </li></ul><ul><li>Lançada a JSR 223: Scripting for the Java TM Platform </li></ul><ul><li>Integrada ao Java 6 “Mustang” com implementação de JavaScript </li></ul><ul><li>As linguagens Groovy e BeanShell estão sendo padronizadas pelo JCP </li></ul><ul><li>Próximas JVM trarão bytecodes não utilizados em Java </li></ul><ul><li>Você usa todo dia sem perceber </li></ul>
  7. 7. Por Que Utilizar? ?
  8. 8. Por Que Utilizar? <ul><li>Java não é Panacéia </li></ul><ul><li>Linguagens especializadas facilitam desenvolvimento </li></ul><ul><li>Linguagens interpretadas integráveis ao programa </li></ul><ul><li>Curva de aprendizado reduzida </li></ul><ul><li>Aproveitar conhecimentos de outras plataformas </li></ul><ul><li>Portar código legado </li></ul><ul><li>Reutilizar bibliotecas e frameworks Java </li></ul><ul><li>Utilizar a infra-estrutura da JVM </li></ul><ul><li>Aplicativos simples produzidos rapidamente </li></ul>
  9. 9. Como Utilizar? ?
  10. 10. Como Utilizar? <ul><li>Linguagens geram bytecodes compatíveis ou são interpretadas </li></ul><ul><li>Geralmente todo o necessário está em um JAR </li></ul><ul><li>Invocam código Java e vice-versa </li></ul><ul><li>Podem compilar código durante a execução do programa </li></ul>
  11. 11. Nosso Estudo de Caso:
  12. 12. Groovy <ul><li>Padronizada pela JSR 241 </li></ul><ul><li>Dinâmica, muito parecida com Ruby e Python </li></ul><ul><li>Sintaxe facilitada para listas e mapas </li></ul><ul><li>Sintaxe facilitada para JavaBeans </li></ul><ul><li>Sobrecarga de operador </li></ul><ul><li>Autoboxing </li></ul><ul><li>Expressões Regulares como PERL </li></ul><ul><li>Diversos Frameworks e bibliotecas próprias </li></ul><ul><li>A partir de Java SE 1.4 </li></ul>
  13. 13. class Usuario{ @Property nome; List grupos=new ArrayList(); def adicionar(grupo){ grupos.add grupo } def isAdministrador(){ achei=false; grupos.each{ grupo -> if(grupo==&quot;Administrador&quot;) achei=true; } return achei; } } usuario = new Usuario() usuario.nome=&quot;Phillip&quot; usuario.adicionar &quot;Administrador&quot; println usuario.nome println usuario.isAdministrador()
  14. 14. import java.util.List; import java.util.ArrayList; import java.util.Iterator; class Usuario{ private String nome; private List grupos= new ArrayList(); public void setNome(String nome){ this.nome=nome; } public String getNome(){ return nome; } public void adicionar(String grupo){ grupos.add(grupo); } public boolean isAdministrador(){ boolean achei=false; for(Iterator it = grupos.iterator();it.hasNext();){ if(it.next().equals(&quot;Administrador&quot;)){ achei=true; } return achei; } public static void main(String[] args){ Usuario usuario = new Usuario(); usuario.setNome(&quot;Phillip&quot;); usuario.adicionar(&quot;Administrador&quot;); System.out.println(usuario.getNome()); System.out.println(usuario.isAdministrador()); } }
  15. 15. Uso Sugerido: Configuração <!-- Subscription form bean --> <form-bean    name=&quot;subscriptionForm&quot;   type=&quot;org.apache.struts.example.SubscriptionForm&quot; /> <!-- Edit mail subscription --> <action path=&quot;/editSubscription&quot;   type=&quot;org.apache.struts.example.EditSubscriptionAction&quot;   name=&quot;subscriptionForm&quot;   scope=&quot;request&quot;   validate=&quot;false&quot;  >   <forward name=&quot;failure&quot; path=&quot;/mainMenu.jsp&quot;/>   <forward name=&quot;success&quot; path=&quot;/subscription.jsp&quot;/> </action> <!-- Registration form bean --> <form-bean name=&quot;registrationForm&quot; type=&quot;org.apache.struts.example.RegistrationForm&quot;/> <!-- Edit user registration --> <action path=&quot;/editRegistration&quot; type=&quot;org.apache.struts.example.EditRegistrationAction&quot; name=&quot;registrationForm&quot; scope=&quot;request&quot; validate=&quot;false&quot; input=&quot;/registration.jsp&quot;> <forward name=&quot;success&quot; path=&quot;/registration.jsp&quot;/> </action> <!-- Global Forward Definitions --> <global-forwards>  <forward     name=&quot;logon&quot;     path=&quot;/logon.jsp&quot;  />  <forward     name=&quot;success&quot;     path=&quot;/mainMenu.jsp&quot;  /> </global-forwards>
  16. 16. Configuração <ul><li>Substituindo XML </li></ul><ul><li>Linguagem imperativa </li></ul><ul><li>Recursos de loops, condicionais, leitura de teclado e arquivos, alertas, log, funções, objetos... </li></ul><ul><li>Pode ser modificado em runtime </li></ul><ul><li>Pode ser debugado </li></ul><ul><li>Suportado pelo Struts Action, NanoContainer, Mentawai... </li></ul>
  17. 17. <grupo nome=&quot;Funcionarios&quot; nivel=&quot;1&quot;> <pessoa login=&quot;pcalcado&quot; nome=&quot;Phillip Calçado&quot; email=&quot;pcalcado@gmail.com&quot;> <parentes> <pessoa login=“ottilia&quot; /> </ parentes > </pessoa> <pessoa login=&quot;ottilia&quot; nome=&quot;Ottilia Calçado&quot; email=&quot;ocalcado@hotmail.com&quot;> <parentes> <pessoa login=&quot;pcalcado&quot; /> </ parentes > </pessoa> < pessoas-autorizadas > <pessoa login=“pcalcado” /> <pessoa login=“ottilia” /> </pessoas-autorizadas> <!– Um grupo contêm outros grupos  <grupo nome=“Diretoria&quot; nivel=“999&quot;> <pessoa login=“tmota&quot; nome=“Tatiana Mota&quot; email=“taty.mota@gmail.com&quot;> <pessoas-autorizadas><pessoa login=“tmota” /></pessoas-autorizadas> </grupo> </grupo>
  18. 18. phillip = new Pessoa() phillip.nome= &quot;Phillip Calçado&quot; phillip.email= &quot;pcalcado.gmail.com&quot; ottilia = new Pessoa() ottilia.nome= &quot;Ottília Calçado&quot; ottilia.email= &quot;ocalcado@hotmail.com&quot; ottilia.adicionarParente phillip tmota = new Pessoa() tmota.nome= &quot;Tatiana Mota&quot; tmota.email= &quot;taty.mota@gmail.com&quot; funcionarios = new Grupo() funcionarios.nivel = 1 diretoria = new Grupo() diretoria.nivel = 999 funcionarios.adicionarGrupo diretoria funcionarios.adicionarPessoa ottilia funcionarios.adicionarPessoa phillip diretoria.adicionarPessoa tmota funcionarios.each {f -> f.autorizar} diretoria.each {f -> f.autorizar}
  19. 19. Uso Sugerido: Regras de Negócio
  20. 21. Regras de Negócio <ul><li>Dinamismo traz flexibilidade </li></ul><ul><li>Pode-se carregar Regras de Negócio novas </li></ul><ul><li>Mudanças temporárias facilmente implementáveis </li></ul><ul><li>Foco no Negócio, não em infra-estrutura </li></ul><ul><li>Não é o fim das gambiarras, mas sintaxe ajuda a simplificar </li></ul><ul><li>Aliável com AOP para transparência </li></ul>
  21. 22. public class VendeProduto{ public void efetuarVenda(Produto produto, Cliente cliente){ cliente.adicionarProduto(p); } }
  22. 23. Este mês, comprando 1 você ganha um grátis public class VendeProduto{ public void efetuarVenda(Produto produto, Cliente cliente){ cliente.adicionarProduto(p); //Introduzido para promoção, ***REMOVER EM Junho/2006*** cliente.adicionarBrinde(p); } }
  23. 24. Se o cliente utilizar o Cartão Tabajara, 10% de desconto public class VendeProduto{ public void efetuarVenda(Produto produto, Cliente cliente){ cliente.adicionarProduto(p); //Introduzido para promoção, ***REMOVER EM Junho/2006*** cliente.adicionarBrinde(p.clone()); //***REMOVER DIA 21/04/2006*** //Por 15 dias se o cliente utilizar Tabajara Card //reduza do total 10% do valor da compra. Malditas gambiarras. if(cliente.getCartaoCredito().getBandeira()equals(“Tabajara”) cliente.setTotal((cliente.getTotal()-cliente.getTotal())/10); } }
  24. 25. Não estamos aceitando Capivara Card public class VendeProduto{ public void efetuarVenda(Produto produto, Cliente cliente){ //Não aceitamos Capivara até eles pagarem a dívida. if(cliente.getCartaoCredito().getBandeira().equals(“CAPIVARA”)) throw new CaloteiroException(); cliente.adicionarProduto(p); //Introduzido para promoção, ***REMOVER EM Junho/2006*** cliente.adicionarBrinde(p.clone()); //***REMOVER DIA 21/04/2006*** //Por 15 dias se o cliente utilizar Tabajara Card //reduza do total 10% do valor da compra. Malditas gambiarras. if(cliente.getCartaoCredito().getBandeira().equals(“Tabajara”)) cliente.setTotal((cliente.getTotal()-cliente.getTotal())/10); } }
  25. 26. public class VendeProduto { public void efetuarVenda(Produto produto, Cliente cliente){ preVenda(Produto produto, Cliente cliente); cliente.adicionarProduto(p); posVenda(Produto produto, Cliente cliente); } }
  26. 27. def preVenda(produto, cliente){ if(cliente.cartaoCredito.bandeira== “CAPIVARA”) throw new CaloteiroException(); } def posVenda(produto, cliente){ cliente.adicionarBrinde(p.clone()); if(cliente.cartaoCredito.bandeira==“Tabajara”) cliente.total = (cliente.total - cliente.total)/10); }
  27. 28. Uso Sugerido: Shell
  28. 30. Shell <ul><li>Acesso direto aos objetos de negócio </li></ul><ul><li>Nada de atualizações via SQL </li></ul><ul><li>Interface perfeita para administradores avançados e suporte </li></ul><ul><li>Ótimo para testar objetos dentro de um container </li></ul>
  29. 31. --Remove as compras canceladas DELETE FROM COMPRAS WHERE COD_CLIENTE=0223 --Retorna produtos para o estoque UPDATE ESTOQUE SET QTDADE = 10 WHERE COD_PRODUTO=102 UPDATE ESTOQUE SET QTDADE = 6 WHERE COD_PRODUTO=1342 UPDATE ESTOQUE SET QTDADE = 977 WHERE COD_PRODUTO=98 -- Atualiza o gasto anual do cliente UPDATE CLIENTES SET TOTAL_GASTO_ANUAL = 0
  30. 32. Login: admin Senha: ****** --- Bem vindo ao Shell do VENDAS WEB vendasweb> cliente = gerenciadorClientes.buscarPeloCodigo(223) vendasweb> cliente.compras.each{ compra -> cliente.cancelar(compra) }
  31. 33. Uso Sugerido: Scripting
  32. 34. Scripting <ul><li>Todo poder de um Shell </li></ul><ul><li>Um programa dentro do programa </li></ul><ul><li>Automatiza tarefas repetitivas </li></ul><ul><li>Melhor que dizer aos usuários o que fazer </li></ul><ul><li>Ótimo para testes funcionais </li></ul><ul><li>Agendável </li></ul>
  33. 35. From: [email_address] To: [email_address] Subject: INSTRUÇÕES PARA REMOVER VENDAS INDEVIDAS Caro cliente, para efetuar o procedimento, siga os passos: 1 – Entre no sistema como administrador 2 – Vá no menu “Vendas” 3 – Clique no botão “Vendas Diárias” 4 – Clique no menu Arquivo->Exportar como CSV e salve o arquivo 5 – Abra o arquivo gerado no Bloco de Notas do Windows, localize as linhas com data igual a data que deseja excluir as vendas 6 – Anote o número do código (quarta coluna das separadas por vírgula) de todas as vendas que deseja excluir 7 – No sistema, clique em “Entrar número de vendas estornadas” 8 – Entre com o número de código das vendas e pressione Ok, confirme quando solicitado 9 – Vá no menu Operações->Estornos 10 – Selecione as vendas que deseja alterar ATENÇAO: tenha certeza de selecionar apenas as que deseja alterar 11 – CLique no botão “cancelar estorno” 12 – Anote o número retornado para cada venda ...
  34. 36. Login: admin Senha: ****** --- Bem vindo ao Shell do VENDAS WEB vendasweb> carregar_script “c:correcao_vendas_indevidas.groovy” Digite a data que deseja cancelar as vendas: > 21/02/2006 Operação Efetuada com Sucesso, foram canceladas as vendas: 102, 121, 433 From: suporte@ minhaempresa .com.br To: cliente@ outraempresa .com.br Subject: INSTRUÇÕES PARA REMOVER VENDAS INDEVIDAS Caro cliente, para efetuar o procedimento, siga os passos: 1 – Salve o arquivo que veio em anexo a este e-mail (correcao_vendas_indevidas.groovy) 2 – Abra o Shell da Aplicação 3 – Digite $ carregar_script <caminho para o arquivo salvo> 4 – Entre com a data que deseja cancelar as vendas Atenciosamente, Equipe Suporte
  35. 37. Domain Specific Languages
  36. 38. Domain Specific Languages <ul><li>Tendência forte em MDD </li></ul><ul><li>Relativamente compatível com MDA </li></ul><ul><li>Surgindo diversas ferramentas </li></ul><ul><li>Uma linguagem familiar ao usuário </li></ul><ul><li>Permite especializar desenvolvedores no domínio </li></ul><ul><li>Podem ser gráficas ou textuais </li></ul>
  37. 39. Domain Specific Languages
  38. 40. Conclusão !
  39. 41. Conclusão <ul><li>Não existe Tamanho Único em linguagens de programação </li></ul><ul><li>Java não é a única linguagem da JVM e de Java EE faz algum tempo </li></ul><ul><li>Java não é mais a única linguagem oficial da JVM </li></ul><ul><li>Java é a linguagem de Sistemas da plataforma Java </li></ul><ul><li>Outras linguagens trazem recursos novos e úteis para Aplicações </li></ul><ul><li>DSLs são uma tendência forte para os próximos anos </li></ul><ul><li>Existe muito o que fazer com linguagens dinâmicas mas muito precisa ser implementado para fazer uso efetivo </li></ul>
  40. 42. <ul><li>Bruce Tate & Justin Gehtland – Beyond Java </li></ul><ul><li>Andrew Hunt & David Thomas – The Pragmatic Programmer </li></ul><ul><li>Eric Evans – Domain-Driven Design </li></ul><ul><li>Bruce Tate & Justin Gehtland – Better, Faster, Lighter Java </li></ul><ul><li>Rod Johnson – J2EE Developmen Without EJB </li></ul><ul><li>Dave Thomas et al. – Programming Ruby </li></ul><ul><li>Dave Thomas et al. – Agile Web Development with Rails </li></ul><ul><li>Martin Fowler – Refactoring, PEAI, Analisys Patterns... </li></ul>Autores Recomendados
  41. 43. <ul><li>http://groovy.codehaus.org/ </li></ul><ul><li>http://www.beanshell.org/ </li></ul><ul><li>http://www.jython.org/ </li></ul><ul><li>http://jruby.sourceforge.net/ </li></ul><ul><li>http://www.mozilla.org/rhino/ </li></ul><ul><li>http://www.robert-tolksdorf.de/vmlanguages.html </li></ul><ul><li>http://www.martinfowler.com/articles/languageWorkbench.html </li></ul><ul><li>http://developer.sun.com/learning/javaoneonline/2004/corej2se/TS-3814.html </li></ul><ul><li>http://developer.sun.com/learning/javaoneonline/2004/newcooltech/TS-1027.html </li></ul><ul><li>http://fragmental.com.br/wiki/index.php?title=Groovy:_Linguagem_de_Script_para_Java </li></ul>Para Saber Mais
  42. 44. <ul><li>http://www.metacase.com/ </li></ul><ul><li>http://msdn.microsoft.com/vstudio/teamsystem/workshop/sf </li></ul><ul><li>http://www.onboard.jetbrains.com/is1/articles/04/10/lop/ </li></ul>Para Saber Mais
  43. 45. Continua em...
  44. 46. Contato http://www.fragmental.com.br http://www.guj.com.br http://www.riojug.org [email_address]
  45. 47. Obrigado! Que Zahl os Acompanhe...

×