Lucas FigueiredoMarcelo PereiraRanieri ValençaRosana MatosValmir Sena
Inicialmente o dbViz Bugs, bugs e mais bugs...
La Maison Projeto do 4º período (ES + GDI) JAVA (JDBC) Sistema de gerenciamento de eventos
Dados gerais 44 classes 10.327 linhas de código =~ 2065
linhas/aluno Funcionalidades
Clientes Eventos Buffet (comidas, bebidas, serviços diversos) Relatórios
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
Tempo total para marcações 3 dias
Marcações por membro da equipe 9 classes para cada
private JButton getBotaoRemover() { if (botaoRemover == null) { botaoRemover = new JButton(); botaoRemover.setBounds(new java.awt.Rectangle(245,332,100,25)); botaoRemover.setText("Remover"); botaoRemover.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(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 { int res = 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(); } } } }); }return botaoRemover;}
MétricasSLOC CDC CDO DOSC DOSM
Tratamento de Exceções
1518 19 41 0,940 0,961
Regras de Negócio
695 14 97 0,900 0,956
Persistência 1151 11 72 0,868 0,955
Interface com Usuário
6180 15 356 0,934 0,992
Tratamento de Eventos
1025 14 42 0,913 0,970
Conclusões: Concerns Crosscutting:
▪ Interface X Exceções▪ Persistência X Negócio
Exemplos (1/3)
Exemplos (2/3)
Exemplos (3/3)
Configuração
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
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
Concern Persistencia Localizado estritamente na camada de
dados Não foi necessário refatorá-lo
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
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.
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.
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
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.