CAPÍTULO 3 MODERNIZAÇÃO DE SISTEMAS APOIADA PELO METAMODELO
3.2 Modernização Orientada a Arquitetura e o Metamodelo KDM
3.2.2 Pacote code da Camada de Elementos do Programa
O pacote code define um conjunto de elementos cujo propósito é representar elementos do programa em nível de implementação e suas associações. Ele é determinado por uma ou mais linguagens de programação
Esse pacote possui metaclasses que representam elementos de várias linguagens de programação tais como programação orientada a objetos, procedural e outras. Com uma regra geral, em uma instância do KDM, cada instância de um elemento do pacote code representa alguma construção em determinada linguagem de programação.
O pacote code possui 90 metaelementos que estão organizados em 24 diagramas de classes, que são: CodeModel, CodeInheritances, Modules,
ControlElements, DataElements, Values, PrimitiveTypes, EnumeratedTypes, CompositeTypes, DerivedTypes, Signature, DefinedTypes, ClassTypes, Templates, TemplateRelations, ClassRelations, TypeRelations, InterfaceRelations, PreprocessorDirectives, PreprocessorRelations, Comment, Visibility, VisibilityRelations e ExtendedCodeElements.
Para atender a um dos objetivos desta dissertação, uma extensão pesada do metamodelo KDM teve que ser realizada no pacote code, pois, os elementos da POA que se deseja representar estão em nível de implementação. Para identificar quais dos elementos deste pacote deveriam ser estendidos foi escolhido um perfil na UML para AspectJ e, em seguida, foi feito um mapeamento entre os elementos desse perfil e os elementos presentes no pacote code. Mais detalhes sobre esses assuntos são discutidos no Capítulo 5.
Visto que esse pacote é bastante amplo e possui muitas metaclasses, nos parágrafos seguintes serão discutidas apenas as metaclasses que foram utilizadas nesta pesquisa, que são: Datatype, ClassUnit, MemberUnit, MethodUnit,
StorableUnit, ControlElement e Package.
A metaclasse Datatype está contida no diagrama de classes CodeModel. Esse diagrama é um modelo KDM específico que possui coleções de informações sobre um sistema existente de tal forma que essas informações representam o domínio do código-fonte de um sistema. O CodeModel é o único modelo da camada de elementos do programa do KDM, sendo assim, os demais diagramas do pacote
outras palavras, o CodeModel é uma abstração de todas as metaclasses do pacote
code, em que apenas as principais metaclasses são representadas.
Na Figura 3.5 é possível ver as metaclasses do CodeModel. Esse diagrama define classes determinadas pelo modelo padrão do KDM, que são CodeModel,
AbstractCodeElement e AbstractCodeRelationship. CodeModel representa um
modelo para os elementos do pacote code, AbstractCodeElement representa uma classe abstrata controladora para todas as entidades KDM que podem ser usadas no modelo code e AbstractCodeRelationship é a classe que representa uma classe abstrata controladora de todos os relacionamentos do KDM no pacote code. O diagrama CodeModel também define várias classes abstratas chave, que determinam a taxonomia do KDM para elementos do programa, tais como CodeItem,
ComputationalObject, Datatype e Module.
Figura 3.5 - Diagrama de classes CodeModel (ISO/IEC, 2012).
A metaclasse Datatype representa elementos que podem ser nomeados e são determinados pela linguagem de programação que descreve tipos de dados. Datatype é um elemento genérico com semântica especificada previamente que pode ser usado como um ponto de extensão para definir novos elementos que representam tipos de dados nomeados que não se encaixam em categorias semânticas de subclasses concretas do elemento Datatype.
A metaclasse ClassUnit faz parte do diagrama de classes ClassTypes. Esse diagrama define elementos que representam tipos de dados compostos comumente fornecidos por várias linguagens de programação. Essa metaclasse representa as classes de linguagens orientadas a objetos. Uma classe é um elemento do tipo
nomeados, que por sua vez pode ser outro elemento do tipo CodeItem, tal como um
MemberUnit ou um MethodUnit. Em outras palavras, uma instância do elemento ClassUnit pode conter outros elementos do mesmo tipo ou outros elementos que
representam construções em uma linguagem OO, como métodos e variáveis.
A metaclasse MemberUnit é uma subclasse concreta do elemento
DataElement que representa um membro de um tipo de classe. Instâncias da classe MemberUnit são pontos de extremidade das relações de dados do KDM que
descrevem o acesso a classes. MemberUnit é similar a um ItemUnit, sua única diferença é que um ItemUnit geralmente representa uma parte de certo objeto computacional, enquanto o objeto computacional correspondente a um MemberUnit é geralmente determinado por uma instância de uma classe.
A metaclasse MethodUnit representa funções de um membro dentro de uma instância do elemento ClassUnit, incluindo operadores definidos pelo usuário, construtores e destrutores. Uma instância do elemento MethodUnit é capaz de representar um método na programação orientada a objetos.
Já o elemento StorableUnit representa uma variável do sistema, ou seja, um objeto computacional em que os diferentes valores do mesmo tipo de dados pode ser associado mais de uma vez. StorableUnit pode representar tanto uma variável global quanto uma variável local.
ControlElement é um elemento genérico que pode ser usado para representar
estruturas de controle. Esse elemento representa itens que podem ser nomeados do sistema que descrevem um comportamento que pode ser feito por demanda e por meio de mecanismos de invocação, tais como mecanismo de chamada de retorno.
A metaclasse Package é um subtipo da metaclasse Module. A metaclasse
Module é um elemento de modelagem genérico do KDM que representa todo um
módulo de software ou um componente. Um Package é um conteiner lógico para elementos do programa, tais como classes e interfaces, na Programação Orientada a Objetos (POO).