5 REVIEW
5.2 Review of concept
5.3.1 Advantages and disadvantages
A m´etrica WOC calcula a soma das complexidades das opera¸c˜oes de uma entidade. Na literatura, n˜ao se especifica como a complexidade de uma opera¸c˜ao ´e medida, ape- nas define-se que est´a relacionado `a quantidade de parˆametros. Para este trabalho, a complexidade de uma opera¸c˜ao ´e definida da seguinte forma:
W OC=
n
∑
i=1
2p(mi),
onde n ´e n´umero de opera¸c˜oes de um componente e p(mi) ´e o n´umero de parˆametros da
5.1 Ferramenta COMETA-Lua 92
uma unidade para a soma do WOC da classe.
Em Lua, os construtores das classes s˜ao declarados como uma fun¸c˜ao de nome “ init”. Assumimos que essa padroniza¸c˜ao estenda-se a construtores de aspectos. Os parˆametros dessa fun¸c˜ao n˜ao s˜ao considerados para o c´alculo de WOC, para que o seu valor n˜ao seja superestimado. N˜ao h´a uma padroniza¸c˜ao para destrutores, por isso n˜ao s˜ao considerados caso especial. Opera¸c˜oes s˜ao declaradas como fun¸c˜oes em Lua. Fun¸c˜oes declaradas dentro de bloco de comando n˜ao ser˜ao consideradas por se entender que s˜ao locais ao bloco e n˜ao pertencem `a classe. Em Lua, quando uma fun¸c˜ao recebe um n´umero vari´avel de parˆametros, usa-se o operador “...”. Esse operador ´e desconsiderado para a soma do n´umero de parˆametros de uma opera¸c˜ao.
No c´odigo-base, as opera¸c˜oes podem ser declaradas de duas formas diferentes. Se a declara¸c˜ao da classe ´e na forma convencional, a opera¸c˜ao ´e declarada como:
function <nome_classe>:<nome_fun¸c~ao> (<lista_parametros>)
Caso a classe seja declarada atrav´es do comando “module”, todas as opera¸c˜oes contidas dentro do arquivo na forma:
function <nome_fun¸c~ao>(<lista_parametros>) s˜ao consideradas membros da classe.
O algoritmo 5 representa o script para a coleta da m´etrica WOC no c´odigo OO. Ini- cialmente, define-se o vetor associativo WOC classes para armazenar os valores parciais de WOC para cada classe do arquivo (linha 1). Enquanto n˜ao for encontrado o fim do arquivo, procura-se por quatro elementos:
(i) defini¸c˜ao convencional de classe: se encontrada, instancia-se uma posi¸c˜ao com ´ın- dice com o nome da classe (linhas 5-7);
(ii) defini¸c˜ao de classe atrav´es do comando “module”: e encontrada, instancia-se uma posi¸c˜ao com ´ındice com o nome do m´odulo (linhas 8-10);
(iii) defini¸c˜ao de fun¸c˜ao na forma
function <nome classe>:<nome fun¸c˜ao> (<lista parametros>): caso seja encontrada, calcula-se o valor parcial de WOC somando o valor atual da vari´avel com a potˆencia do n´umero de parˆametros da opera¸c˜ao na base 2. Como explicado no in´ıcio dessa mesma subse¸c˜ao, o c´alculo de WOC foi assim definido para que, mesmo que uma opera¸c˜ao n˜ao possua parˆametros, ela contribuir´a com uma unidade para o resultado da m´etrica;
(iv) defini¸c˜ao de fun¸c˜ao na forma function <nome fun¸c˜ao>(<lista parametros>): caso seja encontrada, calcula-se o valor parcial de WOC somando o valor atual da va-
ri´avel com a potˆencia do n´umero de parˆametros da opera¸c˜ao na base 2, como no item (iii).
Ao fim do algoritmo, o vetor associativo cont´em os valores finais de WOC para cada classe. Algoritmo 5 Algoritmo para coleta da m´etrica WOC em c´odigo OO
MetricaWOC (arquivo Programa Lua) 1: WOC classes ← {}
2: linha ← le linha(Programa Lua) 3: while linha n˜ao for nula do
4: if linha cont´em defini¸c˜ao de classe convencional then
5: WOC classes{nome classe} ← 0
6: end if
7: if linha cont´em defini¸c˜ao de classe atrav´es do comando module then
8: WOC classes{nome modulo} ← 0
9: end if
10: if linha cont´em defini¸c˜ao de fun¸c˜ao na forma <nome classe>.<nome funcao> then
11: WOC classes{nome classe} ← WOC classes{nome classe} + 2 ↑
#(lista parametros)
12: end if
13: if (WOC classes{nome modulo} existe) and (linha cont´em defini¸c˜ao de fun¸c˜ao) then
14: WOC classes{nome modulo} ← WOC classes{nome modulo} + 2 ↑
#(lista parametros)
15: end if
16: linha ← le linha(Programa Lua) 17: end while
18: print WOC
Para ilustrar a defini¸c˜ao de um aspecto em RE-AspectLua, considere o exemplo de c´odigo a seguir.
1. nome_aspecto = Aspect:new()
2. nome_interface = AspectInterface:new({ name = ’nome_interface’},
{ { refine = ’PontoCorteAbstrato’ , action = nome_advices } } )
3. nome_aspecto:interface(nome_interface)
Na linha 1, define-se o aspecto nome aspecto. Na linha 2, define-se a interface nome interface que associa o advices nome advices ao ponto de corte abstrato PontoCor- teAbstrato. Na linha 3, a interface nome interface ´e associado ao aspecto nome aspecto. Somente nesse ponto, o advices nome advices ´e associado ao aspecto nome aspecto. Em REAspect-Lua, os advices s˜ao definidos como fun¸c˜oes comuns de Lua. O que indica que uma fun¸c˜ao ´e um advices ´e sua associa¸c˜ao a uma interface.
5.1 Ferramenta COMETA-Lua 94
O algoritmo 6 mostra o funcionamento do script para c´alculo de WOC em c´odigo OA. No in´ıcio do algoritmo, instancia-se a vari´avel WOC aspectos que armazenar´a os valores de WOC para cada aspecto (linha 1). Enquanto n˜ao for encontrado o fim do arquivo (linha 3), procura-se por 3 elementos:
(i) defini¸c˜ao de fun¸c˜ao: geralmente se define a fun¸c˜ao do advices antes de associ´a-la a uma interface. Por isso, para cada defini¸c˜ao de fun¸c˜ao encontrada, calcula-se e armazena- se o seu valor de WOC usando como ´ındice o nome da fun¸c˜ao no vetor WOC funcao (linhas 4-6). Se essa fun¸c˜ao fizer parte de alguma defini¸c˜ao de interface, o seu valor de WOC ser´a contado para o WOC do aspecto ao qual a interface estiver associada;
(ii) defini¸c˜ao de interface: quando o algoritmo encontra uma defini¸c˜ao de interface, ele procura por os advices associados a essa interface. Para cada defini¸c˜ao de advices, busca- se o valor de WOC da fun¸c˜ao associada e soma-o ao WOC da interface, armazenando no vetor WOC advices (linhas 7-11);
(iii) associa¸c˜ao aspecto-interface: quando o algoritmo encontra esse tipo de associa¸c˜ao, o vetor WOC aspecto, na posi¸c˜ao que tem como ´ındice o nome do aspecto em quest˜ao, recebe o WOC associado `a interface (linhas 13-15).
Ao fim do algoritmo, o algoritmo imprime os valores de WOC de todos os aspectos do arquivo de entrada (linhas 16).
Algoritmo 6 Algoritmo para coleta da m´etrica WOC em c´odigo OA MetricaWOC (arquivo Programa Lua)
1: WOC aspectos ← {}
2: linha ← le linha(Programa Lua) 3: while linha n˜ao for nula do
4: if linha cont´em defini¸c˜ao de funcao then
5: WOC funcao{nome funcao} ← 2 ↑ #(lista parametros)
6: end if
7: if linha cont´em defini¸c˜ao de interface then
8: WOC advices{nome interface} ← 0
9: while encontrar defini¸c˜ao de advices dessa interface do
10: WOC advices{nome interface} ← WOC advices{nome interface} +
WOC funcao{nome advices}
11: end while
12: end if
13: if linha cont´em associa¸c˜ao entre aspecto e interface then
14: WOC aspecto{nome aspecto} = WOC interface{nome interface}
15: end if
16: end while