• No results found

O padrão Quantificar Recurso fornece quatro maneiras de quantificar os recursos de negócio de uma aplicação: a) em que o recurso pode ser tratado como único, em situações em que não é necessário ter o controle de uma instância específica do recurso, como um carro que passa por uma manutenção; b) instanciável, em situações em que é necessário ter o controle de uma instância específica do recurso, como em sistema de biblioteca, em que um livro (o recurso) contém várias cópias; c) mensurável, em situações em que é necessário lidar com quantidades específicas de recurso; ou d) em lotes, em situações em que o recurso necessita ser tratado como lotes (BRAGA et al., 1999).

Na implementação dessas variantes no GRENJ-OO há entrelaçamento de interesses, em que cada uma dessas variantes está altamente acoplada uma com a outra. Outro problema desse padrão no framework é que sua implementação está espalhada por unidades que implementam o padrão Identificar Recurso.

Capítulo 5 - Modularização dos Padrões da Linguagem GRN no GRENJ 67 Para resolver esses problemas na primeira etapa do processo – Identificar as Unidades Originais do Interesse – foram analisados a descrição textual e o modelo de classes do padrão, extraídos da linguagem de padrões GRN (BRAGA et al., 1999). Com base nessas informações, o código fonte do framework foi analisado com o objetivo de identificar as unidades que foram originalmente projetadas para implementar o padrão Quantificar Recurso. Como resultado, foi verificado que as classes QuantificationStrategy, SingleResource, MeasurableResource, InstantiableResource, MeasureUnity e ResourceInstance foram originalmente projetadas para implementar esse padrão. Assim como na modularização do padrão Identificar Recurso, não houve dificuldades na realização desta etapa porque as informações presentes na descrição textual e no modelo de classes do padrão foram suficientes, deixando óbvio que essas classes foram originalmente projetadas para implementá-lo.

Na segunda etapa – Identificar Espalhamento de Interesses – as unidades originais do padrão, a descrição textual e o modelo de classes do padrão foram analisados para extrair um conjunto de palavras-chave que representam indícios de interesses relacionados ao padrão Quantificar Recurso e suas variantes. Com base nessas informações, o código fonte do

framework foi analisado para identificar atributos e operações de suas classes que contribuem

para a implementação do padrão e de suas variantes. Além das unidades originais, foi verificada a presença de código relacionado ao padrão Quantificar Recurso na classe Resource, que foi originalmente projetada para implementar o padrão Identificar Recurso.

Durante a realização desta etapa foram encontrados indícios de interesses relacionados a todas as variantes do padrão Quantificar Recurso na classe QuantificationStrategy. Isso faz com que as classes SingleResource, MeasurableResource e InstantiableResource, que a estendem, e que respectivamente implementam as variantes Recurso Único, Recurso Mensurável e em Lotes e Recurso Instanciável, implementem métodos relacionados a todas as variantes do padrão, sendo que cada classe foi exclusivamente projetada para implementar uma única variante. Isso denota que as implementações das variantes do padrão Quantificar Recurso estão espalhadas por essas classes.

Após a análise do código fonte do framework em busca de indícios relacionados ao padrão Quantificar Recurso, foi elaborado o modelo de classes do padrão a partir das unidades originais e de outras unidades do framework que contêm indícios do padrão, como mostrado na Figura 5.6. Os atributos e operações relacionados ao padrão Quantificar Recurso e suas

Capítulo 5 - Modularização dos Padrões da Linguagem GRN no GRENJ 68 variantes que estão na classe Resource, que implementa o Identificar Recurso, e as classes QuantificationStrategy, SingleResource, MeasurableResource e InstantiableResource, MeasureUnity e ResourceInstance, foram marcados com os estereótipos <<QR>>, <<QR-V1>>, <<QR-V2>>, <<QR-V3>> e <<QR-V4>>, que respectivamente representam o padrão Quantificar Recurso e suas variantes Recurso Único, Recurso Mensurável, Recurso em Lotes e Recurso Instanciável.

Figura 5.6. Modelo de classes do padrão Quantificar Recurso com indícios de espalhamento de

interesses.

Na terceira etapa – Identificar Entrelaçamento de Interesses –, com base no conhecimento de domínio, na lista de unidades originais do padrão e nas palavras-chave que representam indícios de interesses relacionados ao padrão (obtidas na etapa 2), cada uma das unidades originais do padrão foi analisada em busca de atributos e operações não relacionados ao padrão. Essa análise se iniciou pela classe QuantificationStrategy, seguida das classes SingleResource, MeasurableResource e InstantiableResource. Foi observado nessas classes a presença de operações relacionadas aos padrões Locar Recurso e Comercializar Recurso, como calculateAvailabilityToRent() e calculateAvailabilityToSell().

Após a análise do código fonte das unidades originais do padrão, o modelo de classes obtido como saída da etapa “Identificar Espalhamento de Interesses” foi refinado, como ilustrado na Figura 5.7. Atributos e operações relacionados a outros padrões que estão nas classes QuantificationStrategy, SingleResource, MeasurableResource e InstantiableResource foram adicionados a esse modelo e marcados com os estereótipos <<LR>> e <<CR>>, que respectivamente representam os padrões Locar Recurso e Comercializar Recurso. As classes MeasuryUnity e ResourceInstance, também

Capítulo 5 - Modularização dos Padrões da Linguagem GRN no GRENJ 69 pertencem ao padrão Quantificar Recurso, mas não possuem atributos e métodos que contribuem para a implementação de outros padrões.

Figura 5.7. Modelo de classes do padrão Quantificar Recurso refinado com indícios de

entrelaçamento de interesses.

Na quarta etapa do processo – Modularizar com Aspectos –, foi efetuada a análise do modelo de classes do padrão, gerado na etapa “Identificar Entrelaçamento de Interesses”, e do código fonte do framework, com objetivo de identificar o que deve ser modularizado por meio de inter-type declarations e o que deve ser modularizado com advices de AspectJ. Em seguida, com base no conhecimento de domínio do framework, foi definida uma estratégia para modularizar o padrão com aspectos. Essa estratégia consiste em criar um aspecto para separar o código relacionado ao padrão Quantificar Recurso da classe Resource e criar aspectos para modularizar a implementação de cada variante desse padrão, como mostrado na Figura 5.8.

Para separar o código relacionado ao padrão Quantificar Recurso da classe Resource, esse código foi removido dessa classe e encapsulado no aspecto ResourceWithQuantificationContainerLoaderAspect, que novamente introduz por inter-type declarations, atributos e operações relacionados ao padrão Quantificar Recurso em Resource. Esse aspecto também utiliza advices para adicionar comportamento relacionado ao padrão Quantificar Recurso nessa classe.

Capítulo 5 - Modularização dos Padrões da Linguagem GRN no GRENJ 70

Figura 5.8. Implementação OA do padrão Quantificar Recurso.

Para modularizar as variantes do padrão Quantificar Recurso, foram criados dois aspectos, um para modularizar a implementação da variante Recurso Mensurável ou em Lotes e outro para a variante Recurso Instanciável. Em virtude da variante Recurso Único não possuir métodos que são exclusivamente relacionados à sua implementação não foi necessário criar um aspecto para modularizá-la, como mostrado na Figura 5.8a). O aspecto ResourceWithQuantificationContainerLoaderAspect, que encapsula a implementação do padrão Quantificar Recurso da classe Resource, é comum a todas as variantes do padrão.

Na implementação OA da variante Recurso Mensurável ou em Lotes, mostrada na Figura 5.8b), os métodos relacionados a essa variante foram removidos das classes Resource e QuantificationStrategy, e foram encapsulados no aspecto MeasurableQuant- StrategyContainerLoaderAspect, que introduz, por meio de inter-type declarations, métodos relacionados a essa variante, como getMeasureUnityClass() e getMeasureUnity(), nessas classes. Isso evita que essa variante fique entrelaçada com a implementação de outros padrões e as demais variantes desse padrão.

Análogo à implementação OA da variante Recurso Mensurável ou em Lotes, na implementação OA da variante Recurso Instanciável (Figura 5.8c)), os métodos relacionados

Capítulo 5 - Modularização dos Padrões da Linguagem GRN no GRENJ 71 a essa variante também foram removidos das classes Resource e QuantificationStrategy, e foram encapsulados no aspecto InstantiableQuantStrategyContainerLoaderAspect, que introduz métodos relacionados a essa variante, como getResourceInstanceClass() e getInstances(), nessas classes.

Os métodos relacionados aos padrões Locar Recurso e Comercializar Recurso que estão nas classes QuantificationStrategy, SingleResource, MeasurableResource e InstantiableResource, foram modularizados em outras iterações do processo.

Após a modularização do padrão Quantificar Recurso, somente o código relacionado à variante selecionada é embutido no código da aplicação, evitando a presença de código relacionado a variantes não utilizadas. Com isso, o gerenciamento das variabilidades desse padrão é melhorado.