defesa mestrado

33
UNIRIO Universidade Federal do Estado do Rio de Janeiro CodeMI Source Code as XMI Uma Representação Estrutural de Código-fonte para Coleta de Métricas João Paulo Oliveira dos Santos Márcio de Oliveira Barros [email protected]

Upload: joao-paulo-santos

Post on 13-Jan-2015

642 views

Category:

Education


1 download

DESCRIPTION

Minha Defesa de Mestrado

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

[email protected]

Agenda

• Contexto

• Motivação

• Problema

• Solução Proposta

• Atividades Realizadas

• Limitações e Contribuições

• Conclusões

• Trabalhos Futuros

[email protected]

• 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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

• Representação de código em XML• Facilidade de manipulação

• Diversidade de mecanismos de consulta –Xpath, Xquery, XSLT

Principais Representações

[email protected]

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

[email protected]

• 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

[email protected]

Formato XMI

• Troca de modelos entre ferramentas

– Arquitetura MOF (4 camadas)

[email protected]

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”)

Pacote: org.compiere.processClasse: CompiereService

[email protected]

Exemplo XMI

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

[email protected]

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>

[email protected]

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

[email protected]

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

[email protected]

Código-fonte

JavaParser Java

Representação

CodeMI

Pacote: org.compiere.processClasse: CompiereService

Método: terminate

Teste do Parser – Código-fonte

[email protected]

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)

[email protected]

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)

[email protected]

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

[email protected]

Avaliação – Exemplo XSLT

• Complexidade Ciclomática - McCabe

[email protected]

<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

[email protected]

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

[email protected]

Estudo de Caso – Coleta de Métricas

[email protected]

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

[email protected]

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

[email protected]

Arquitetura do Ambiente

[email protected]

Atividades do Ambiente

[email protected]

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

[email protected]

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)

[email protected]

Conclusões

• Representação Genérica

• Granularidade em Nível de Pacote

• Baixa Verbosidade

• Baixa Exposição do Código-Fonte

[email protected]

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

[email protected]