(Portuguese) Java EE Poliglota

Preview:

DESCRIPTION

Apresentação realizada em 2006 no RioJavaSummit.

Citation preview

www.fragmental.com.br

Java PoliglotaIdéias Para Aplicações Multilíngue

Phillip Calçadohttp://www.fragmental.com.br

www.fragmental.com.br Slide 2

• Mostrar idéias para utilizar linguagens alternativas na sua aplicação

Objetivo

www.fragmental.com.br Slide 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

www.fragmental.com.br Slide 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ê?

www.fragmental.com.br Slide 5

Novas Linguagens da Plataforma Java

www.fragmental.com.br Slide 6

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

www.fragmental.com.br Slide 7

Por Que Utilizar?

?

www.fragmental.com.br Slide 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

www.fragmental.com.br Slide 9

Como Utilizar?

?

www.fragmental.com.br Slide 10

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

www.fragmental.com.br Slide 11

Nosso Estudo de Caso:

www.fragmental.com.br Slide 12

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

www.fragmental.com.br Slide 13

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.nomeprintln usuario.isAdministrador()

www.fragmental.com.br Slide 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("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());

}

}

www.fragmental.com.br Slide 15

Uso Sugerido: Configuração

<!-- Subscription form bean --><form-bean   name="subscriptionForm"  type="org.apache.struts.example.SubscriptionForm"/>

<!-- Edit mail subscription --><action path="/editSubscription"  type="org.apache.struts.example.EditSubscriptionAction"  name="subscriptionForm"  scope="request"  validate="false" >  <forward name="failure" path="/mainMenu.jsp"/>  <forward name="success" path="/subscription.jsp"/></action>

<!-- Registration form bean --><form-bean name="registrationForm"type="org.apache.struts.example.RegistrationForm"/>

<!-- Edit user registration --><action path="/editRegistration"type="org.apache.struts.example.EditRegistrationAction"name="registrationForm"scope="request"validate="false"input="/registration.jsp"><forward name="success" path="/registration.jsp"/></action>

<!-- Global Forward Definitions --><global-forwards> <forward    name="logon"    path="/logon.jsp" /> <forward    name="success"    path="/mainMenu.jsp" /></global-forwards>

www.fragmental.com.br Slide 16

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

www.fragmental.com.br Slide 17

<grupo nome="Funcionarios" nivel="1"> <pessoa login="pcalcado" nome="Phillip Calçado" email="pcalcado@gmail.com"> <parentes> <pessoa login=“ottilia" /> </ parentes > </pessoa>

<pessoa login="ottilia" nome="Ottilia Calçado" email="ocalcado@hotmail.com"> <parentes> <pessoa login="pcalcado" /> </ parentes > </pessoa>

< pessoas-autorizadas > <pessoa login=“pcalcado” /> <pessoa login=“ottilia” /> </pessoas-autorizadas>

<!– Um grupo contêm outros grupos <grupo nome=“Diretoria" nivel=“999"> <pessoa login=“tmota" nome=“Tatiana Mota" email=“taty.mota@gmail.com"> <pessoas-autorizadas><pessoa login=“tmota” /></pessoas-autorizadas> </grupo>

</grupo>

www.fragmental.com.br Slide 18

phillip = new Pessoa()

phillip.nome= "Phillip Calçado"

phillip.email= "pcalcado.gmail.com"

ottilia = new Pessoa()

ottilia.nome= "Ottília Calçado"

ottilia.email= "ocalcado@hotmail.com"

ottilia.adicionarParente phillip

tmota = new Pessoa()

tmota.nome= "Tatiana Mota"

tmota.email= "taty.mota@gmail.com"

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}

www.fragmental.com.br Slide 19

Uso Sugerido: Regras de Negócio

www.fragmental.com.br Slide 20

www.fragmental.com.br Slide 21

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

www.fragmental.com.br Slide 22

public class VendeProduto{public void efetuarVenda(Produto produto, Cliente cliente){

cliente.adicionarProduto(p);}

}

www.fragmental.com.br Slide 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);

}}

www.fragmental.com.br Slide 24

Se o cliente utilizar o Cartão Tabajara, 10% de

descontopublic 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);

}}

www.fragmental.com.br Slide 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);

}}

www.fragmental.com.br Slide 26

public class VendeProduto {public void efetuarVenda(Produto produto, Cliente cliente){

preVenda(Produto produto, Cliente cliente);

cliente.adicionarProduto(p);

posVenda(Produto produto, Cliente cliente);

}}

www.fragmental.com.br Slide 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);

}

www.fragmental.com.br Slide 28

Uso Sugerido: Shell

www.fragmental.com.br Slide 29

www.fragmental.com.br Slide 30

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

www.fragmental.com.br Slide 31

--Remove as compras canceladasDELETE FROM COMPRAS WHERE COD_CLIENTE=0223

--Retorna produtos para o estoqueUPDATE ESTOQUE SET QTDADE = 10 WHERE COD_PRODUTO=102UPDATE ESTOQUE SET QTDADE = 6 WHERE COD_PRODUTO=1342UPDATE ESTOQUE SET QTDADE = 977 WHERE COD_PRODUTO=98

-- Atualiza o gasto anual do clienteUPDATE CLIENTES SET TOTAL_GASTO_ANUAL = 0

www.fragmental.com.br Slide 32

Login: adminSenha: ******--- Bem vindo ao Shell do VENDAS WEBvendasweb> cliente = gerenciadorClientes.buscarPeloCodigo(223)vendasweb> cliente.compras.each{ compra -> cliente.cancelar(compra) }

www.fragmental.com.br Slide 33

Uso Sugerido: Scripting

www.fragmental.com.br Slide 34

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

www.fragmental.com.br Slide 35

From: suporte@minhaempresa.com.brTo: cliente@outraempresa.com.brSubject: INSTRUÇÕES PARA REMOVER VENDAS INDEVIDAS

Caro cliente, para efetuar o procedimento, siga os passos:

1 – Entre no sistema como administrador2 – Vá no menu “Vendas”3 – Clique no botão “Vendas Diárias”4 – Clique no menu Arquivo->Exportar como CSV e salve o arquivo5 – Abra o arquivo gerado no Bloco de Notas do Windows, localize as linhas com data igual a data que deseja excluir as vendas6 – Anote o número do código (quarta coluna das separadas por vírgula) de todas as vendas que deseja excluir7 – 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 solicitado9 – Vá no menu Operações->Estornos10 – Selecione as vendas que deseja alterar ATENÇAO: tenha certeza de selecionar apenas as que deseja alterar11 – CLique no botão “cancelar estorno”12 – Anote o número retornado para cada venda...

www.fragmental.com.br Slide 36

Login: adminSenha: ******--- Bem vindo ao Shell do VENDAS WEBvendasweb> carregar_script “c:\correcao_vendas_indevidas.groovy”Digite a data que deseja cancelar as vendas:> 21/02/2006Operação Efetuada com Sucesso, foram canceladas as vendas: 102, 121, 433

From: suporte@minhaempresa.com.brTo: cliente@outraempresa.com.brSubject: 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ção3 – Digite

$ carregar_script <caminho para o arquivo salvo>4 – Entre com a data que deseja cancelar as vendasAtenciosamente,Equipe Suporte

www.fragmental.com.br Slide 37

Domain Specific Languages

www.fragmental.com.br Slide 38

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

www.fragmental.com.br Slide 39

Domain Specific Languages

www.fragmental.com.br Slide 40

Conclusão

!

www.fragmental.com.br Slide 41

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

www.fragmental.com.br Slide 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

www.fragmental.com.br Slide 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

www.fragmental.com.br Slide 44

• 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

www.fragmental.com.br Slide 45

Continua em...

www.fragmental.com.br Slide 46

Contato

http://www.fragmental.com.br

http://www.guj.com.br

http://www.riojug.org

pcalcado@gmail.com

www.fragmental.com.br Slide 47

Obrigado!Que Zahl os Acompanhe...

Recommended