BÖLÜM 2: YÖRESEL MUTFAKLAR VE TÜRK MUTFAĞI İLE İLGİLİ
2.3. Yöresel Mutfak Kavramının Destinasyon Çekiciliğinde Kullanılmasının Gelişimi 28
2.5.2. Türkiye’de Yöresel Mutfaklar
2.5.2.7. Marmara Bölgesi Mutfak Kültürü
Após a identificação dos indícios descrita na seção anterior, o engenheiro de software usa seu conhecimento e determina se o indício realmente faz parte de um aspecto ou não. Para o último caso, nenhuma modificação é realizada. Entretanto, quando é constatada a existência de aspectos, as instruções e declarações que expressam tais aspectos devem ser separadas do código e inseridas em um módulo apropriado. No caso de sistemas em linguagem AspectJ, esses módulos são arquivos de extensão aj e o combinador (weaver) da linguagem reconhecem construções próprias capazes de descrever o comportamento transversal dos aspectos nesses módulos. Nesta seção são descritas as diretrizes que podem ser seguidas para obtenção de um novo sistema em AspectJ a partir de um sistema legado em Java.
A Figura 3.10 apresenta o algoritmo com a visão geral da atividade de reestruturação do código do sistema legado. Como pode-se observar a iteratividade da reestruturação depende da quantidade de interesses transversais a serem encapsulados, dos pacotes do sistema e dos arquivos com marcações.
Figura 3.10: Visão geral da reestruturação do sistema legado em Java
1 Para cada interesse transversal faça 2 criar módulo de aspecto A;
3 Para cada pacote do sistema p faça
4 Para cada arquivo com marcações a ⊂ p faça 5 Se ∃ atributo privado com marcações então 6 A.modificador := privileged;
7 Fim-Se
8 Para cada método m ⊂ a faça
9 Se todas as instruções de código possuem marcações então 10 introduzir(m, a);
11 Senão
12 reordenar instruções;
13 Se ∃ marcações no começo de método então 14 reestruturarInicioMetodo();
15 Fim-Se
16 Se ∃ marcações no fim de método então 17 reestruturarFimMetodo();
18 Fim-Se 19 Fim-Se 20 Fim-Para
21 Para cada atributo com marcações at ⊂ a faça 22 introduzir(at, a);
23 Fim-Para
24 Se quantidade de aspectos em a = 0 então
25 retirar instruções de importação de tipos do int. transversal; 26 Fim-Se
27 Fim-Para 28 Fim-Para 29 Fim-Para
É criado um módulo de aspecto que centraliza a implementação de cada interesse transversal espalhada por todo o sistema. Em cada um dos pacotes do sistema, todos os arquivos com marcações são analisados. Caso se constate a existência de ao menos um atributo privado com aspectos, é adicionado à declaração do módulo de aspecto o modificador privileged, permitindo que atributos privados sejam acessíveis ao módulo. Em seguida, cada método do arquivo é avaliado, iniciando pela verificação de marcações em todas as instruções do método. Caso essa verificação seja verdadeira, todo o método é introduzido no aspecto. Para isso, o módulo de aspecto deve importar a classe ou a interface que contém o método e os tipos usados no método, ou seja, tipos encontrados na lista de parâmetros, em instruções e no valor de retorno do método. Por fim, o nome da classe / interface cujo método foi retirado e introduzido no módulo de aspecto deve anteceder o nome do método.
Também deve ser verificado o modificador de acesso do método. Caso o mesmo seja privado, a classe ou interface que utiliza esse método não poderá mais acessá-lo após a introdução desse método no módulo de aspecto. Modificando o acesso ao método de privado para público, a classe / interface será capaz de utilizar esse método, contudo, o acesso se torna possível para os demais módulos do sistema. A solução, nesse caso, é fazer marcações nas chamadas desse método para, posteriormente, transferir essas chamadas ao módulo de aspecto por meio de conjuntos de junção e adendos. Como o acesso ao método chamado é permitido dentro do aspecto, esse problema é contornado.
Ao analisar o método, apenas algumas instruções podem conter marcações. Para esse caso, deve-se verificar a possibilidade de reordenar as instruções de modo que as que contém marcações se concentrem no início ou no final do método. É importante garantir que a reordenação das instruções não altere a lógica do programa. Em seguida, se existirem Instruções com Marcações (IM) no início e/ou no fim do método, a reestruturação de instruções é aplicada. Essa tarefa consiste em definir um conjunto de junção, que capte o ponto de junção, no início ou fim de método, e o adendo que conterá as instruções marcadas no método. O conjunto de junção emprega os conjuntos de junção primitivos: execution(<assinatura do método>) e this, caso atributos e métodos da classe ou interface corrente sejam usados em IM; args se as variáveis declaradas na lista de parâmetros do método sejam utilizadas em IM. Para definir o adendo é necessário referenciar o conjunto de junção previamente criado e empregar a
palavra reservada before, caso as instruções sejam de início de método ou after caso contrário. Por fim, as instruções marcadas são removidas do método.
Com o término da reestruturação dos métodos com indícios, os atributos marcados são introduzidos do arquivo corrente para o módulo de aspecto. Essa tarefa é realizada após a reestruturação de métodos inteiros e de instruções com aspectos. Essa imposição é justificada devido à utilização de atributos em instruções. A introdução precoce de atributos gera erros de compilação, pois os atributos deixam de ser visíveis às classes/interfaces, sendo corrigidos apenas quando todas as instruções que referenciam tais atributos têm sua reestruturação concluída, podendo isso acontecer apenas ao final do processo de reestruturação do arquivo corrente. Nesse caso, testes intermediários se tornam impossíveis de serem realizados visto que o sistema não pode ser compilado.
Finalmente, é verificado se todos os trechos de código marcados foram reestruturados. Se isso for constatado, importações dos tipos associados a indícios podem ser eliminadas do código-fonte. Todas essas atividades são repetidas para cada arquivo, pacote e interesse transversal.