• No results found

Advantages and disadvantages

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

5.1.5

M´etrica de Acoplamento CBO - Acoplamento entre Clas-