(Portuguese) Java EE Poliglota
Upcoming SlideShare
Loading in...5
×
 

(Portuguese) Java EE Poliglota

on

  • 1,800 views

Apresentação realizada em 2006 no RioJavaSummit.

Apresentação realizada em 2006 no RioJavaSummit.

Statistics

Views

Total Views
1,800
Views on SlideShare
1,796
Embed Views
4

Actions

Likes
3
Downloads
20
Comments
0

3 Embeds 4

http://www.slideshare.net 2
http://oracle.sociview.com 1
https://www.linkedin.com 1

Accessibility

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

(Portuguese) Java EE Poliglota (Portuguese) Java EE Poliglota Presentation Transcript

  • Java Poliglota Idéias Para Aplicações Multilíngue Phillip Calçado http://www.fragmental.com.br
    • Mostrar idéias para utilizar linguagens alternativas na sua aplicação
    Objetivo
    • Quem é Você?
    • Novas Linguagens da Plataforma Java
    • Por que Utilizar?
    • Como Utilizar?
    • Nosso Estudo de Caso
    • Uso Sugerido: Configuração
    • Uso Sugerido: Regras de Negócio
    • Uso Sugerido: Shells
    • Uso Sugerido: Scripting
    • Domain Specific Languages
    • Conclusão
    • Bibliografia, Links e Referências
    Agenda
    • Phillip Calçado, a.k.a. Shoes
    • Arquiteto de Sistemas / Consultor
    • Programador desde 1996
    • Com Java desde 2003
    • JUG Leader do RioJUG
    • Coordenador do GUJ
    • Escritor ocasional
    • 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
    Quem é Você?
  • Novas Linguagens da Plataforma Java
  • Novas Linguagens
    • A comunidade Java já produziu centenas de linguagens para a JVM, de BASIC até LISP
    • Grandes empresas (Bea, IBM...) já utilizam há um bom tempo
    • Java não era uma plataforma muito amigável para outras linguagens
    • Lançada a JSR 223: Scripting for the Java TM Platform
    • Integrada ao Java 6 “Mustang” com implementação de JavaScript
    • As linguagens Groovy e BeanShell estão sendo padronizadas pelo JCP
    • Próximas JVM trarão bytecodes não utilizados em Java
    • Você usa todo dia sem perceber
  • Por Que Utilizar? ?
  • Por Que Utilizar?
    • Java não é Panacéia
    • Linguagens especializadas facilitam desenvolvimento
    • Linguagens interpretadas integráveis ao programa
    • Curva de aprendizado reduzida
    • Aproveitar conhecimentos de outras plataformas
    • Portar código legado
    • Reutilizar bibliotecas e frameworks Java
    • Utilizar a infra-estrutura da JVM
    • Aplicativos simples produzidos rapidamente
  • Como Utilizar? ?
  • Como Utilizar?
    • Linguagens geram bytecodes compatíveis ou são interpretadas
    • Geralmente todo o necessário está em um JAR
    • Invocam código Java e vice-versa
    • Podem compilar código durante a execução do programa
  • Nosso Estudo de Caso:
  • Groovy
    • Padronizada pela JSR 241
    • Dinâmica, muito parecida com Ruby e Python
    • Sintaxe facilitada para listas e mapas
    • Sintaxe facilitada para JavaBeans
    • Sobrecarga de operador
    • Autoboxing
    • Expressões Regulares como PERL
    • Diversos Frameworks e bibliotecas próprias
    • A partir de Java SE 1.4
  • class Usuario{ @Property nome; List grupos=new ArrayList(); def adicionar(grupo){ grupos.add grupo } def isAdministrador(){ achei=false; grupos.each{ grupo -> if(grupo=="Administrador") achei=true; } return achei; } } usuario = new Usuario() usuario.nome="Phillip" usuario.adicionar "Administrador" println usuario.nome println usuario.isAdministrador()
  • 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("Administrador")){ achei=true; } return achei; } public static void main(String[] args){ Usuario usuario = new Usuario(); usuario.setNome("Phillip"); usuario.adicionar("Administrador"); System.out.println(usuario.getNome()); System.out.println(usuario.isAdministrador()); } }
  • 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>
  • Configuração
    • Substituindo XML
    • Linguagem imperativa
    • Recursos de loops, condicionais, leitura de teclado e arquivos, alertas, log, funções, objetos...
    • Pode ser modificado em runtime
    • Pode ser debugado
    • Suportado pelo Struts Action, NanoContainer, Mentawai...
  • <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>
  • 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}
  • Uso Sugerido: Regras de Negócio
  •  
  • Regras de Negócio
    • Dinamismo traz flexibilidade
    • Pode-se carregar Regras de Negócio novas
    • Mudanças temporárias facilmente implementáveis
    • Foco no Negócio, não em infra-estrutura
    • Não é o fim das gambiarras, mas sintaxe ajuda a simplificar
    • Aliável com AOP para transparência
  • 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 cliente){ cliente.adicionarProduto(p); //Introduzido para promoção, ***REMOVER EM Junho/2006*** cliente.adicionarBrinde(p); } }
  • 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); } }
  • 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); } }
  • public class VendeProduto { public void efetuarVenda(Produto produto, Cliente cliente){ preVenda(Produto produto, Cliente cliente); cliente.adicionarProduto(p); posVenda(Produto produto, Cliente cliente); } }
  • 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); }
  • Uso Sugerido: Shell
  •  
  • Shell
    • Acesso direto aos objetos de negócio
    • Nada de atualizações via SQL
    • Interface perfeita para administradores avançados e suporte
    • Ótimo para testar objetos dentro de um container
  • --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
  • Login: admin Senha: ****** --- Bem vindo ao Shell do VENDAS WEB vendasweb> cliente = gerenciadorClientes.buscarPeloCodigo(223) vendasweb> cliente.compras.each{ compra -> cliente.cancelar(compra) }
  • Uso Sugerido: Scripting
  • Scripting
    • Todo poder de um Shell
    • Um programa dentro do programa
    • Automatiza tarefas repetitivas
    • Melhor que dizer aos usuários o que fazer
    • Ótimo para testes funcionais
    • Agendável
  • 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 ...
  • 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
  • Domain Specific Languages
  • Domain Specific Languages
    • Tendência forte em MDD
    • Relativamente compatível com MDA
    • Surgindo diversas ferramentas
    • Uma linguagem familiar ao usuário
    • Permite especializar desenvolvedores no domínio
    • Podem ser gráficas ou textuais
  • Domain Specific Languages
  • Conclusão !
  • Conclusão
    • Não existe Tamanho Único em linguagens de programação
    • Java não é a única linguagem da JVM e de Java EE faz algum tempo
    • Java não é mais a única linguagem oficial da JVM
    • Java é a linguagem de Sistemas da plataforma Java
    • Outras linguagens trazem recursos novos e úteis para Aplicações
    • DSLs são uma tendência forte para os próximos anos
    • Existe muito o que fazer com linguagens dinâmicas mas muito precisa ser implementado para fazer uso efetivo
    • Bruce Tate & Justin Gehtland – Beyond Java
    • Andrew Hunt & David Thomas – The Pragmatic Programmer
    • Eric Evans – Domain-Driven Design
    • Bruce Tate & Justin Gehtland – Better, Faster, Lighter Java
    • Rod Johnson – J2EE Developmen Without EJB
    • Dave Thomas et al. – Programming Ruby
    • Dave Thomas et al. – Agile Web Development with Rails
    • Martin Fowler – Refactoring, PEAI, Analisys Patterns...
    Autores Recomendados
    • http://groovy.codehaus.org/
    • http://www.beanshell.org/
    • http://www.jython.org/
    • http://jruby.sourceforge.net/
    • http://www.mozilla.org/rhino/
    • http://www.robert-tolksdorf.de/vmlanguages.html
    • http://www.martinfowler.com/articles/languageWorkbench.html
    • http://developer.sun.com/learning/javaoneonline/2004/corej2se/TS-3814.html
    • http://developer.sun.com/learning/javaoneonline/2004/newcooltech/TS-1027.html
    • http://fragmental.com.br/wiki/index.php?title=Groovy:_Linguagem_de_Script_para_Java
    Para Saber Mais
    • http://www.metacase.com/
    • http://msdn.microsoft.com/vstudio/teamsystem/workshop/sf
    • http://www.onboard.jetbrains.com/is1/articles/04/10/lop/
    Para Saber Mais
  • Continua em...
  • Contato http://www.fragmental.com.br http://www.guj.com.br http://www.riojug.org [email_address]
  • Obrigado! Que Zahl os Acompanhe...