defesa mestrado
Post on 13-Jan-2015
642 Views
Preview:
DESCRIPTION
TRANSCRIPT
UNIRIOUniversidade Federal do Estado do Rio de Janeiro
CodeMI – Source Code as XMIUma Representação Estrutural de Código-fonte para Coleta de Métricas
João Paulo Oliveira dos Santos
Márcio de Oliveira Barros
joao.santos@uniriotec.br
Agenda
• Contexto
• Motivação
• Problema
• Solução Proposta
• Atividades Realizadas
• Limitações e Contribuições
• Conclusões
• Trabalhos Futuros
joao.santos@uniriotec.br
• Evolução de Software
– Pesquisas nesta área estudam o comportamento de projetos de software ao longo do tempo
– Em geral, estes estudo se baseiam em repositórios de sistemas de controle de versão
Contexto
joao.santos@uniriotec.br
Contexto
• Estudos em evolução de software
– Análise de repositórios de controle de versão de softwares
– Coleta de métricas a partir do código-fonte ou de outros artefatos desenvolvidos
– Formação de séries temporais com dados colhidos através das métricas
– Análise (estatística) das séries históricas
joao.santos@uniriotec.br
Contexto
• Concentração dos estudos em repositórios de software livre
– Ex: SourceForge, GNU, Apache, Eclipse, ...
• Problemas:
– Projetos extintos e revisões anteriores perdidas
– Software comercial/industrial é desenvolvido de forma diferente do software livre
– Formulação de teorias baseadas neste tipo de repositório
joao.santos@uniriotec.br
Motivação
• Poucos estudos são realizados sobre software desenvolvido segundo um modelo industrial
– Empresas desenvolvedoras de software restringem o acesso ao código-fonte de seus produtos
• Consequências
– Falta de métricas colhidas de softwares industriais
– Métricas colhidas de forma oportunista (muitas vezes sem associação com uma pesquisa)
– Falta de teorias evolutivas sobre estes softwares
joao.santos@uniriotec.br
Como realizar estudos de evolução de software baseados em sistemas industriais
sem ferir restrições de propriedade intelectual e sem definir, antes de planejar os objetivos
da pesquisa, quais métricas devem ser analisadas?
Problema
joao.santos@uniriotec.br
Solução Proposta
Prover uma representação de código-fonte que evidencie as características estruturais do código sem deixar explícita a lógica que ele
implementa (propriedade intelectual).
joao.santos@uniriotec.br
• Representação de código em XML• Facilidade de manipulação
• Diversidade de mecanismos de consulta –Xpath, Xquery, XSLT
Principais Representações
joao.santos@uniriotec.br
Críterios JavaMLM&K
JavaML1.0
XJava JavaML2.0
Elementos essenciais
Informações textuais
Verbosidade Alta Média Baixa Alta
Linhas em branco
Comentários
Representa AST
Exposição do código
Granularidade Classe Classe Sistema Classe
Critérios Desejáveis
• Verbosidade baixa
– facilita a realização de consultas
– viabiliza análise de grandes sistemas
• Não exposição do código
– impede a extração do código-fonte
– restrições de propriedade
joao.santos@uniriotec.br
• CodeMI
– Baseado no formato XMI v2.1
• Requisitos
– Baixa verbosidade
– Baixa exposição do código-fonte
– Granularidade em nível de pacote
– Independência de linguagem de programação
– Alinhamento ao paradigma OO
Representação Proposta
joao.santos@uniriotec.br
Formato XMI
• Troca de modelos entre ferramentas
– Arquitetura MOF (4 camadas)
joao.santos@uniriotec.br
Nível Descrição
M3 MOF
M2 Metamodelo UML(elemento: “Classe”)
M1 Elemento UML(classe: “Hóspede”)
M0 Instâncias de elementos UML(hospede: “João”)
CodeMI
• Extensão XMI – elementos do código-fonte
<xmi:extension>
//elementos estruturais do código-fonte do método
</xmi:extension>
• Mapeamento dos elementos estruturais
– Condições: if, switch, …
– Repetições: loop, for, while, …
– Comandos
– Declarações
joao.santos@uniriotec.br
CodeMI (cont...)
Marcadores Atributos
<if> </if> conditions
<else> </else>
<switch> </switch>
<case> </case>
<break>
<for> </for> conditions
<while> </while> conditions
<try> </try>
<catch> </catch>
<statement>
<localvar> type
<return>
joao.santos@uniriotec.br
• Conjunto reduzido de marcadores
• 1 marcador por linha de código-fonte
Baixa verbosidade
CodeMI – Esboço Intramétodo
<xmi:extension>
<statement />
<localvar type="int"/>
<statement />
<localvar type="Enumeration"/>
<while>
<statement />
<localvar type="Aluguel"/>
<statement />
</while>
<return />
</xmi:extension>
joao.santos@uniriotec.br
Construindo a Representação
• Criação do Parser Java
– Análise dos lexemas da linguagem Java
– Verificação da ordem dos lexemas
– Geração da CodeMI
– JRefactory & Gramática do Java 1.5
joao.santos@uniriotec.br
Código-fonte
JavaParser Java
Representação
CodeMI
Pacote: org.compiere.processClasse: CompiereService
Método: terminate
Teste do Parser – Código-fonte
joao.santos@uniriotec.br
Engenharia Reversa & CodeMI
• Engenharia Reversa– Obtenção de informações de projeto
• CodeMI– Estendida do formato XMI
– Importação por ferramenta CASE
– Obtenção dos elementos do modelo UML
• Resultados– Diagramas estruturais (classe, pacote)
• Alto nível de Abstração
• Baixa completeza (detalhamento)
joao.santos@uniriotec.br
Reengenharia & CodeMI
• Reengenharia
– Reconstrução do sistema
– Utilizando documentação – Engenharia Reversa
– Dificultada (baixa completeza)
• CodeMI
– Inviabilidade de extração do código-fonte (XSLT)
joao.santos@uniriotec.br
Preservação dos detalhes do código-fonte da CodeMI.
Avaliação - Extração de Métricas
• Coleta de métricas
– Suíte de métricas de Lorenz & Kidd (projeto)
– Suíte de métricas de Chidamber & Kemerer
– Complexidade ciclomática (McCabe – Myers)
– Tamanho (LOC)
• Utilização de transformações XSLT
joao.santos@uniriotec.br
Avaliação – Exemplo XSLT
• Complexidade Ciclomática - McCabe
joao.santos@uniriotec.br
<xsl:for-each select="packagedElement/packagedElement">
<xsl:for-each select="ownedOperation">
<xsl:value-of select="(
count(xmi:extension//if) +
count(xmi:extension//for) +
count(xmi:extension//while) +
count(xmi:extension//case) +
count(xmi:extension))"/>
</xsl:for-each>
</xsl:for-each>
Avaliação - Estudo de Caso
• Compiere
– Médio porte
– Gestão empresarial - ERP
– Gestão de relacionamento com cliente - CRM
– Open source
– Comércio, indústria e serviços
joao.santos@uniriotec.br
Obter Repositório
CVS
Extrair Versão do Código-fonte
Converter Código-
fonte para CodeMI
Coletar Métricas
Estudo de Caso - Conversão
compiere.model.xmi org.compiere.common.constants.xmi org.compiere.print.xmi
org.apache.ecs.filter.xmi org.compiere.common.xmi org.compiere.process.xmi
org.apache.ecs.storage.xmi org.compiere.controller.xmi org.compiere.report.core.xmi
org.apache.ecs.xhtml.xmi org.compiere.db.xmi org.compiere.report.xmi
org.apache.ecs.xmi org.compiere.esb.xmi org.compiere.server.xmi
org.apache.ecs.xml.xmi org.compiere.excel.xmi org.compiere.session.xmi
org.compiere.acct.xmi org.compiere.framework.xmi org.compiere.sla.xmi
org.compiere.api.xmi org.compiere.grid.ed.xmi org.compiere.sqlj.xmi
org.compiere.apps.form.xmi org.compiere.grid.tree.xmi org.compiere.startup.xmi
org.compiere.apps.graph.xmi org.compiere.grid.xmi org.compiere.swing.xmi
org.compiere.apps.info.xmi org.compiere.images.xmi org.compiere.test.xmi
... ... ...
66 pacotes CodeMI
joao.santos@uniriotec.br
Estudo de Caso – Coleta de Métricas
joao.santos@uniriotec.br
Lorenz & Kidd
Tamanho do Método (LOC)
Tamanho Médio do Método
Número de Métodos Públicos de Instância (PIM)
Número de Métodos de Instância numa Classe (NIM)
Média dos Métodos de Instância por Classe (ANIM)
Número de Atributos de Instância numa Classe (NIA)
Média de Atributos de Instância por Classe (ANIA)
Número de Métodos de Classe numa Classe (NCM)
Média dos Métodos de Classe por Classe (ANCM)
Número de Atributos de Classe numa Classe (NCA)
Média dos Atributos de Classe por Classe (ANCA)
Número de Parâmetros por Método (PPM)
Complexidade Ciclomática
McCabe
Myers
Chidamber & Kemerer
Métodos Ponderados por Classe (WMC)
Número de Filhos (NOC)
Estudo de Caso - Resultado
Pacote: org.compiere.grid
joao.santos@uniriotec.br
Total de Classes Total de Metodos Total de Comandos ANIM ANIAANCAANCM C.C. Média C.C. Total
13 160 2652 12.08 17.460.23 0.23 4.16 665
Nome da Classe LOC/NM PIM NIM NIA NCM NCA NA NM LOC WMC NOC CC Média CC Total CCM Média CCM Total
APanelTab 0 4 4 0 0 0 0 4 0 4 0 1 4 1:1 4:4
GridController 11.72 34 36 21 0 0 22 36 422 134 0 3.72 134 3.72:4.94 134:178
RecordAccessDialog 19.63 2 8 21 0 0 21 8 157 28 0 3.5 28 3.5:3.63 28:29
VCreateFrom 12.24 7 17 32 0 0 32 17 208 42 3 2.47 42 2.47:2.76 42:47
VCreateFromInvoice 18.27 5 11 4 0 0 4 11 201 48 0 4.36 48 4.36:5.73 48:63
VCreateFromShipment 18.08 5 11 3 1 0 3 12 217 45 0 3.75 45 3.75:5.25 45:63
VCreateFromStatement 11.1 4 10 2 0 0 2 10 111 22 0 2.2 22 2.2:2.9 22:29
VPanel 14 8 14 16 2 2 21 16 224 65 0 4.06 65 4.06:5.69 65:91
VPayment 63.82 4 11 94 0 0 94 11 702 151 0 13.73 151 13.73:22.45 151:247
VSortTab 19.38 9 13 25 0 1 30 13 252 59 0 4.54 59 4.54:5.92 59:77
VTabbedPane 8.67 9 9 5 0 0 5 9 78 31 0 3.44 31 3.44:4.11 31:37
VTable 7.33 5 6 2 0 0 2 6 44 17 0 2.83 17 2.83:3.67 17:22
XLookup 5.14 7 7 2 0 0 2 7 36 19 0 2.71 19 2.71:3.71 19:26
cla
sse
Ambiente de Suporte a Pesquisas
• CodeMI – Coletas periódicas
• Acompanhar evolução das métricas
• Elaboração de séries temporais
• Proposição de novas métricas
• Evolução de softwares industriais
• Interface com as empresas
joao.santos@uniriotec.br
Contribuições
• Conjunto de marcadores - Métricas estruturais
• CodeMI
• Parser Java
• XSLT – suíte de métricas
• Estudo de Caso – Compiere
• Proposta do ambiente de suporte à pesquisa
joao.santos@uniriotec.br
Limitações
• Parser – Gramática Java 1.5
• Engenharia Reversa parcial (baixa completeza)
• XSLT - coletar métricas em nível de sistema
– Ausência de operação de junção (join)
joao.santos@uniriotec.br
Conclusões
• Representação Genérica
• Granularidade em Nível de Pacote
• Baixa Verbosidade
• Baixa Exposição do Código-Fonte
joao.santos@uniriotec.br
Trabalhos Futuros
• Implementação do ambiente proposto
• Analisar repositórios industriais de controle de versão
• Construção do parser/plug-in para outras linguagens
• Extrair métricas ao longo do tempo
• Utilização da representação para construção de séries históricas das métricas
• Realização de estimativas e simulações utilizando estas séries históricas
joao.santos@uniriotec.br
top related