1) O documento apresenta um resumo de um seminário sobre refatoração de expressões OCL (Object Constraint Language);
2) Os principais tópicos discutidos incluem "OCL Smells", que são estruturas em OCL que sugerem a necessidade de refatoração, e refatorações como substituir cadeias de implicações e expressões prolixas;
3) Foi realizado um estudo experimental para avaliar os efeitos da aplicação de refatorações em expressões OCL, comparando o desempenho de desenvolvedores ao responder perguntas sobre expressões com e sem
Cartilha 1º Ano Alfabetização _ 1º Ano Ensino Fundamental
XXI Simpósio Brasileiro de Engenharia de Software
1. SBES 2007
XXI Simpósio Brasileiro de Engenharia de Software
Enhancing the Understandability of OCL Specifications
Alexandre Correa, Cláudia Werner
COPPE/UFRJ – Universidade Federal do Rio de Janeiro(UFRJ)
Márcio Barros
UNIRIOTEC – Universidade Federal do Estado do Rio de Janeiro(UNIRIO)
Seminário de Metodologia de Desenvolvimento de Software
Aluna: Gislene dos Santos Carvalho
1
2. Resumo
OCL(Object Constraint Language)
Linguagem padronizada pelo OMG para a especificação precisa de restrições
associadas a modelos compatíveis com o MOF(Meta Object Facility);
Especificação precisa de elementos aonde as notações gráficas da UML não são
capazes de representar, como, por exemplo, restrições, expressões associadas
a atributos derivados, expressões de consulta e definições contratuais de
operações.
Problemas
OCL Smells.
Objetivos deste seminário
Soluções
OCL Refactorings;
Estudo experimental.
2
3. Introdução
Introdução
• Características da linguagem OCL:
Linguagem declarativa, precisa e tipada;
Construções semelhantes as encontradas em POO;
MDA/padrão OMG QVT - ajuda a remover os potenciais problemas de
ambiguidade que pode estar presente nas especificações da linguagem
natural, como aconteceu com o primeiro padrão UML primeiro.
• Problemas e Soluções:
Code Smells: OCL Smells -> Problema;
Refactorings: OCL Refactorings -> Solução;
Estudo Experimental -> avaliação da usabilidade e potencial da
solução.
3
4. Code Smells e Refactoring
Code Smell Refactoring
São certas estruturas presentes no Corresponde a alterações feitas para a
código de um software que sugerem a estrutura interna de um software,
necessidade de uma reestruturação preservando a sua semântica
(FOWLER, 1999); comportamental, que visa melhorar os
fatores de qualidade como modularidade
Duplicação de código, implementação de compreensibilidade, e extensibilidade
métodos grandes e complexos, [Homens e Tourwe 2004].
encadeamento de mensagens são
alguns exemplos; Outras melhorias: reusabilidade,
manutenibilidade, eficiência.
Afeta negativamente a legibilidade e
manutenibilidade do código. Facilita a evolução do software.
4
5. OCL
Todas instâncias do tipo Account não pode A operação select resulta em subgrupo de
ter saldo negativo. contas de um determinado cliente(self) tendo a
operação isGold é a avaliada como verdadeira.
A operação size indica o tamanho do
subconjunto resultante.
OCL é uma linguagem tipada. Toda expressão tem um tipo que define o
as operações que podem ser aplicadas para o seu resultado.
5
6. OCL Smells e Refactorings
UML 1.3 (OMG 1999)
A Figura 4 é utilizado como um exemplo, que até mesmo regras simples
pode resultar em expressões OCL difíceis de ler e compreender.
Essa restrição, no entanto, poderia ter sido definida com uma expressão
tão simples como:
self.allConnections-> isUnique(name).
Essa expressão da figura é conhecida como Expressão Prolixa.
6
7. OCL Smells
UML 1.3 (OMG 1999)
À primeira vista, a complexidade é devido a várias chamadas para oclIsKindOf e
operações oclAsType [Vaziri e Jackson 2002].
Uma análise mais aprofundada revela, porém, que a falta de um supertipo para
ClassifierRole e tipos AssociationRole resultou em expressões complexas e
muito semelhantes separadas somente pelo operador and.
7
8. OCL Smell: Cadeias de Implicações
• O OCL Smell Cadeia de Implicações corresponde a expressões que
possuam a estrutura T implies E. A gramática abaixo determina que a
configuração mínima para este OCL Smell corresponde a uma expressão
da forma A implies B implies C, ou seja, uma expressão contendo pelo
menos duas implicações em sequência.
ImpliesChainSmell ::= T implies E
T ::= OCLExpression //expressão OCL do tipo Boolean
E ::= Left_par T „implies‟ (T | E) Right_par
Left_par ::= „(„
Right_par ::= „)‟
8
9. Exemplo
Toda transição em uma máquina de transição de estados (statemachine) que
tiver como origem (source) um pseudo-estado do tipo fork, deve ter como
destino (target) um elemento do tipo State.
9
10. Refactoring – Substituir Cadeia de Implicações por
uma Única Implicação
• a => (b => c) ≡ (a and b) => c;
• Se a expressão resultante é um conjunto complexo de forma a b1 e b2 e b3 ...
e bn, deve-se refatorar esta expressão para extrair a definição de propriedades
auxiliares ou operações de partes desse conjunto. A definição de propriedades
auxiliares ou operações de uma expressão OCL corresponde as refatorações
seguintes:
Adicionar definição de operação e substituir expressão pela chamada da operação:
promover o encapsulamento e reuso através de uma especificação.
evitar a duplicação de expressões que são utilizadas em várias partes de uma
especificação;
Adicionar definição de propriedade e substituir expressão por chamada de
propriedade:
Criação e utilização de operações auxiliares em OCL.
10
11. Exemplo refatorado
As seguintes refatorações foram efetuadas: Substituir as cadeias de implicações por um
única implicação que substituiu duas implicações, por uma conjunção; Adicionar definição
de propriedade, que acrescentou a propriedade sourceIsFork para a classe de Transição;
e Substituir expressão por chamada de propriedade que substituiu o antecedente da
restrição pela expressão self.sourceIsFork..
11
12. OCL Smell: Expressão Prolixa
• Este OCL smell ocorre em expressões OCL definidas de forma mais
extensa que o necessário.
• Duas formas usuais de expressões prolixas são as seguintes:
Expressões que contém mais chamadas de operação do que o necessário: estas
expressões podem ser abreviados pela simplificação das chamadas de operação,
que consiste em reescrever uma expressão OCL de formar a utilizar menos
chamadas de operação.
Invariantes definidas de maneira errada: uma invariante pode ser descrita de muitas
maneiras, dependendo da sua classe de contexto, anexando uma invariante para o
contexto errado geralmente torna mais difícil de especificar e manter. Uma
refatoração é a mudança de contexto, ou seja, reescrever uma invariante utilizando
um contexto diferente.
12
14. OCL Smell: Cadeias ForAll
• Cadeias ForAll é um caso especial de expressão prolixa que corresponde
a expressões contendo a seguinte estrutura:
X -> forAll (a1 | a1.B-> forAll (b1 | b1.C-> forAll (c1 | P (c1)))),
Suponha-se que X é um grupo de elementos de tipo A, e existe uma
associação entre as classes A e B, e entre as classes B e C.
• Refatoração: aplicar um sistema de navegação, de A à C, ou seja, XBC ->
forAll (c1 | P1 (c1)). Tal modificação correspondente à aplicação da
substituição de cadeia de quantificadores universais por navegações.
14
15. OCL Smell: Downcasting
• Downcasting é uma construção bastante conhecida na comunidade de
programação orientada a objetos.
• Em OCL, esta construção se manifesta através da utilização de expressões
contendo a estrutura x.oclAsType(Y).z, normalmente precedidas por uma
expressão com o formato x.oclIsKindOf(Y). O objetivo desse tipo de
construção é tornar possível a referência a uma propriedade z definida em um
tipo Y, dada uma expressão x de um tipo X do qual Y é uma especialização.
• Exemplo:
15
16. OCL Smell: Expressões Condicionais Relacionadas a Tipos
• Este OCL Smell corresponde a expressões if-then-else-endif que
possuam, na parte correspondente à condição da expressão, chamadas a
operações que verificam se um elemento é de um determinado tipo.
• A forma geral dessas expressões é dada por: if x.oclIsKindOf(A) then
<exp1> else if x.oclIsKindOf(B) then <exp2> else … endif, ou seja, a
expressão terá o valor determinado por <exp1>, se a classe de x for A ou
alguma especialização de A, <exp2> se a classe de x for B ou alguma
especialização de B, e assim por diante para outras eventuais ocorrências
desse tipo de condição.
• Resultam em especificações mais complexas e menos legíveis, além de
indicar a possível ausência de uma estrutura de generalização no modelo.
• Refatoração: introdução de polimorfismo.
16
17. Exemplo
[1] os pinos de entrada de
uma ação de ligação
(LinkAction)
são os mesmos pinos
associados aos dados de
cada extremidade de
uma ligação mais os pinos
de inserção (insertAt).
17
18. OCL Smell: Downcasting
• Downcasting é uma construção bastante conhecida na comunidade de
programação orientada a objetos.
• Em OCL, esta construção se manifesta através da utilização de expressões
contendo a estrutura x.oclAsType(Y).z, normalmente precedidas por uma
expressão com o formato x.oclIsKindOf(Y). O objetivo desse tipo de
construção é tornar possível a referência a uma propriedade z definida em um
tipo Y, dada uma expressão x de um tipo X do qual Y é uma especialização.
• Exemplo:
18
19. Refatoração: Introdução de polimorfismo
• Ao introduzir polimorfismo substitui-se expressões complexas if-then-else-endif que fazem uso
considerável de operações, tais como oclIsKindOf, oclIsTypeOf, oclAsType, por uma combinação de
operações genéricas e específicas definidas em uma hierarquia de classes. Outras refatorações
utilizadas ao modelo subjacente: adicionar classe, adicionar generalização, Pull Up, Push Down,
adicionar operações entre outros.
Figura 10
19
20. Um estudo experimental para avaliação de OCL Refactorings
• Definição do Estudo:
• Analisar o efeito da aplicação de refatorações em restrições especificadas
em OCL que contenham OCL smells;
• Com o propósito de caracterizar a viabilidade do uso e da continuidade do
desenvolvimento desses conceitos;
• Referente aos benefícios obtidos em relação ao entendimento de
restrições especificadas em OCL;
• Do ponto de vista do pesquisador;
• No contexto de 23 desenvolvedores de software graduados com 40 horas
de curso em UML/OCL oferecido pela UFRJ. Conhecimento restrito sintaxe
e semântica básica em OCL.
20
21. Contexto e Material
Questão tipo S: questões de interpretação de restrições com a presença de OCL smells;
Questão tipo R: questões de interpretação de restrições obtidas a partir de
Refatorações aplicadas às expressões presentes nas questões do tipo S do
questionário aplicado ao outro grupo.
21
22. Formulação das hipóteses
• A variável independente deste estudo é o tipo de expressões OCL presente
em cada questão respondida. Com dois valores: S(presença de OCL
smells) e R(restrições refatoradas).
• Impacto da variável independente sobre as variáveis dependentes:
– Pontuação na questão(QS): um ponto para o sim / não parte da
resposta e um ponto para a parte justificação. As variáveis SS = soma
de QS em questões tipo S e RS = soma de QS em questões tipo R;
– Tempo para responder as questões(QT): tempo em segundos gastos
para responder completamente uma questão. ST e RT são definidas
como a soma de QT em questões do tipo S e R;
• Hipótese Nula(H0): HO: μSS = μRS and μST = μRT -> não existe diferença
de precisão e tempo para responder as perguntas do tipo S e R.
• Hipótese Alternativa(H1): H1: μSS < μRS or μST > μRT ->
22
23. Instrumentação
1. Tutorial: Cada sujeito foi dada duas semanas para estudar um tutorial de OCL;
2. Avaliação em OCL: indivíduos foram agrupados em dois blocos de 11 sujeitos
cada(pontuações mais altas e mais baixas pontuação) de acordo com a mediana de
seus pontos em um teste de 10 perguntas sobre OCL. Um sujeito foi alocado para testar
a instrumentação.
3. Sessão principal: cada participante respondeu o conjunto de 10 perguntas atribuído ao
seu grupo (SI ou SII). Cada indivíduo teve que responder plenamente uma pergunta
para proceder para o próximo. Eles não foram autorizados a alterar as respostas das
perguntas anteriores. Isto foi preciso para recolher o tempo gasto pelos sujeitos em cada
pergunta. Não houve limite de tempo;
4. Avaliação subjetiva: classificar cada pergunta - o nível de dificuldade e a qualidade
percebida das expressões OCL. Para a avaliação do nível de dificuldade cada pergunta,
foi utilizada uma escala de Likert de 1 a 5 (1-muito fácil, 2-fácil, 3-médio, 4 - difícil, 5-
muito difícil). A qualidade das expressões OCL presentes em cada questão foi avaliada
de acordo com a seguinte escala nominal: 1 - restrição é mal escrito, 2 - não tenho
certeza se a restrição é bem ou mal escrito, 3 - restrição é bem escrito.
23
24. Estudo Experimental: Resultados e ameaças à validade
• Análise dos instrumentos:
Para esta avaliação, utilizamos o teste de análise de variância (ANOVA), com um
nível de significância (α) de 0.05 (WOHLIN et al., 2000), sobre o seguinte
conjunto de dados:
1. Pontuação e tempo gasto em cada conjunto de perguntas;
2. Pontuação e tempo gasto em questões do mesmo tipo em cada conjunto de
questões.
• Resultados:
Os resultados não mostraram diferença significativa na pontuação e tempo para
responder entre os grupos. Assim, não há nenhuma evidência de que as
diferenças ao longo dos instrumentos deve impor ameaças a outras análises.
24
25. Scores
Um teste de análise de variância (α = 0,05) foi aplicada para a contagem de cada tipo de
questão (μSS e μRS). Os resultados mostrados rejeitam a hipótese nula em
favor da hipótese alternativa: μSS <μRS, ou seja, a pontuação média em no tipo S de
perguntas foi menor do que a média em tipo R de perguntas. Portanto, os resultados
indicam que, pelo menos na amostra analisada no estudo, a presença de OCL smells
impacta negativamente a compreensão de restrições OCL.
25
26. Tempo de resposta
Um teste de análise de variância (α nível de significância = 0,05) foi aplicada para o tempo para
responder a cada tipo de questão (μST e μRT). O resultado rejeita a hipótese nula em
favor da hipótese alternativa: μST> μRT, ou seja, o tempo médio para resposta de tipo S
questões foi maior do que a média de tempo para responder a perguntas do tipo R. Portanto, o
resultados indicam que, pelo menos na amostra analisada no estudo, a presença de OCL
Smells pode impactar negativamente o tempo necessário para compreender os limites OCL.
26
27. Avaliação subjetiva
• Mais de 60% de perguntas do tipo R foram classificadas como fácil ou
muito fácil, e apenas 10% das perguntas do tipo R foram julgadas como
difícil ou muito difícil;
• Por outro lado, menos de 30% das perguntas do tipo S foram classificadas
como fácil ou muito fácil, enquanto 30% deles foram julgadas como difícil
ou muito difícil.
• Esta avaliação também mostrou que existe uma diferença significativa na
percepção da qualidade das expressões presentes em perguntas do tipo S
e do tipo R.
• Ao passo que apenas 4% das avaliações das perguntas do tipo R foram
classificadas como de má qualidade, a porcentagem foi expressiva nas
perguntas do tipo S: 36%.
• 80% das expressões do tipo R foram avaliadas como de boa qualidade. No
entanto, um número significativo das avaliações (44%) das expressões
contendo OCL smells(tipo S) foram avaliadas como de boa qualidade.
27
28. Conclusões
• Apesar da reduzida população deste estudo (22 participantes), os resultados dos testes
estatísticos confirmam, no universo analisado, a estrutura das expressões OCL pode
influenciar no desempenho dos participantes em relação à compreensão e ao tempo gasto
para entender uma restrição OCL;
• OCL smells afeta negativamente a compreensão de restrição OCL;
• Os resultados obtidos na avaliação subjetiva da qualidade das expressões presentes nas
questões refletem, de certo modo, a inexperiência dos participantes com a OCL.
• O estudo apontou indícios de que a técnica de refatoração em expressões OCL pode ser
viável, mas é preciso repetição de estudo em outros contextos e com populações
maiores.
• Necessidade de investimento em criação de ferramentas para identificação automática de
OCL smells e de modelos de refatoração.
28
29. Referências
• Correa,A., Werner,C.,Barros,M.(2007),”Enhancing the
Understandability the OCL Specifications”.In: XXI
Simpósio Brasileiro de Engenharia de Software, In
English.
• Correa, A. (2006), “Refactoring OCL Model Constraints
Specifications”, Doctoral Thesis – COPPE/UFRJ, In
Portuguese.
29