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

(Portuguese) Java EE Poliglota

  • 1.
    Java Poliglota IdéiasPara Aplicações Multilíngue Phillip Calçado http://www.fragmental.com.br
  • 2.
    Mostrar idéias parautilizar linguagens alternativas na sua aplicação Objetivo
  • 3.
    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
  • 4.
    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ê?
  • 5.
    Novas Linguagens da Plataforma Java
  • 6.
    Novas Linguagens Acomunidade 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
  • 7.
  • 8.
    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
  • 9.
  • 10.
    Como Utilizar? Linguagensgeram 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
  • 11.
  • 12.
    Groovy Padronizada pelaJSR 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
  • 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.
    import java.util.List; importjava.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.
    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.
    Configuração Substituindo XMLLinguagem 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...
  • 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.
    phillip = newPessoa() 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.
    Uso Sugerido: Regras de Negócio
  • 20.
  • 21.
    Regras de NegócioDinamismo 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
  • 22.
    public class VendeProduto{public void efetuarVenda(Produto produto, Cliente cliente){ cliente.adicionarProduto(p); } }
  • 23.
    Este mês, comprando1 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); } }
  • 24.
    Se o clienteutilizar 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); } }
  • 25.
    Não estamos aceitandoCapivara 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); } }
  • 26.
    public class VendeProduto{ public void efetuarVenda(Produto produto, Cliente cliente){ preVenda(Produto produto, Cliente cliente); cliente.adicionarProduto(p); posVenda(Produto produto, Cliente cliente); } }
  • 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); }
  • 28.
  • 29.
  • 30.
    Shell Acesso diretoaos 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
  • 31.
    --Remove as comprascanceladas 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
  • 32.
    Login: admin Senha:****** --- Bem vindo ao Shell do VENDAS WEB vendasweb> cliente = gerenciadorClientes.buscarPeloCodigo(223) vendasweb> cliente.compras.each{ compra -> cliente.cancelar(compra) }
  • 33.
  • 34.
    Scripting Todo poderde 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
  • 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 ...
  • 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
  • 37.
  • 38.
    Domain Specific LanguagesTendê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
  • 39.
  • 40.
  • 41.
    Conclusão Não existeTamanho Ú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
  • 42.
    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
  • 43.
    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
  • 44.
  • 45.
  • 46.
  • 47.
    Obrigado! Que Zahlos Acompanhe...