260 likes | 402 Views
Lucas Figueiredo Marcelo Pereira Ranieri Valença Rosana Matos Valmir Sena. La Maison des Evenements. Projeto. Projeto. Inicialmente o dbViz Bugs, bugs e mais bugs... La Maison Projeto do 4º período (ES + GDI) JAVA (JDBC) Sistema de gerenciamento de eventos. Projeto. Projeto.
E N D
Lucas Figueiredo Marcelo Pereira Ranieri Valença Rosana Matos Valmir Sena La Maison desEvenements
Projeto • Inicialmente o dbViz • Bugs, bugs e mais bugs... • La Maison • Projeto do 4º período (ES + GDI) • JAVA (JDBC) • Sistema de gerenciamento de eventos
Projeto • Dados gerais • 44 classes • 10.327 linhas de código =~ 2065 linhas/aluno • Funcionalidades • Clientes • Eventos • Buffet (comidas, bebidas, serviços diversos) • Relatórios
Concerns • Exceções • Espalhadas em pontos distintos do código • Negócio • Existentes em classes que não são de controle • Persistência • Regras relacionadas ao controle de transação misturadas com as regras de negócio • Interface • Maior porcentagem do projeto • Eventos • Espalhados pelo código de interface
Concerns • Tempo total para marcações • 3 dias • Marcações por membro da equipe • 9 classes para cada
Concerns privateJButtongetBotaoRemover() { if (botaoRemover == null) { botaoRemover = newJButton(); botaoRemover.setBounds(newjava.awt.Rectangle(245,332,100,25)); botaoRemover.setText("Remover"); botaoRemover.addActionListener(newjava.awt.event.ActionListener() { publicvoidactionPerformed(java.awt.event.ActionEvent e) { String cpf = (String) tableFuncionario.getValueAt(0, 1); if( cpf.trim().equalsIgnoreCase("resultados.") ||cpf == null ||cpf.trim().equalsIgnoreCase("")) { JOptionPane.showMessageDialog(null,"Nenhum Funcionario Selecionado.“, "Erro", JOptionPane.INFORMATION_MESSAGE); } else { try { intres = JOptionPane.showConfirmDialog(null, "Deseja excluir o cliente selecionado?"); if( res == JOptionPane.OK_OPTION ) { TelaProcurarFuncionario.this.pai.getFachada().removerFuncionario( cpf ); JOptionPane.showMessageDialog(null,"Funcionario removido com sucesso","Sucesso",JOptionPane.INFORMATION_MESSAGE); tableFuncionario.setValueAt("Sem ",0,0); tableFuncionario.setValueAt("resultados.",0,1); } } catch (SQLException e1) { JOptionPane.showMessageDialog(null,"Erro na remoção","Falha",JOptionPane.ERROR_MESSAGE); e1.printStackTrace(); } } } }); } returnbotaoRemover; }
Concerns • Métricas
Concerns • Conclusões: • Concerns Crosscutting: • Interface X Exceções • Persistência X Negócio
Clones • Exemplos (1/3)
Clones • Exemplos (2/3)
Clones • Exemplos (3/3)
Clones • Configuração
Clones • Resultados • 293 clones • Concerns Envolvidos • Interface com Usuário • Persistência • Composição • 33 Clones de Persistência • 260 Clones de Interface com Usuário
Refatorando • Concern Eventos • Código de eventos desviado para um aspecto • Basicamente adição e implementação de métodos dos listeners da GUI. • Resultou em 1100 linhas de código
Refatorando • Concern Persistencia • Localizado estritamente na camada de dados • Não foi necessário refatorá-lo
Refatorando • Concern GUI • Muita repetição de código • No entanto são declaração de atributos e métodos Gets e Sets. • Não foi encontrada uma solução razoável para o problema. • Herança seria uma solução no entanto as classes de GUI já extendem algum elemento javax.swing
Refatorando • Concern Negócio • Muitos métodos executavam a mesma coisa • Ex: set(int n) • If( n >= 0 ) • Esse tipo de redundância foi fatorada e colocada em aspectos. • Um aspecto chegou a atuar em 75 posições diferentes do código.
Refatorando • Concern Validação • Esse concern foi desentrelaçado do concern GUI • Para cada campo (JTextField) da interface gráfica havia um tipo de mascara, que limitava os tipos de caracter que podiam ser entrados tais como: somente números, somente texto, validar CPF e etc. • Todo esse código validação foi retirado da GUI e colocado em Aspectos.
Refatorando • Refatores Utilizados • Foi utilizado no eclipse o refactor “extract method” 6 vezes, nas classes do pacote dados, para se retirar clones. • Foram usadas as seguintes leis descritas no artigo “Deriving Refactorings for AspectJ”. • Add empty aspect – 5 vezes • Add after-call – 50 vezes • Add around-call – 8 vezes • Merge advices – 16 vezes
Refatorando • Clones após colocação de aspectos • Pela ferramenta CCFINDER os clones foram reduzidos de 293 para 270, ficando a grande maioria destes clones restantes na GUI, por terem sidos gerados pelo visual editor. • A remoção destes clones do código, impossibilitaria o funcionamento do visual editor, o que aumentaria o tempo de manutenção da GUI.