• Nenhum resultado encontrado

4.3 O Modelo MOF

4.3.2 A Estrutura do modelo MOF

A especificação MOF utilizada neste trabalho é a versão 1.3. O modelo MOF desta versão está definido em um pacote chamado Model. Este pacote importa um outro pacote de tipo de

dados primitivos chamado PrimitiveTypes que possui instâncias dos tipos primitivos Boolean, Integer, Long, Float, Double e String. A Figura 4.1 apresenta, apenas as classes e associações do modelo MOF. Maiores detalhes podem ser encontrados na especificação do MOF 1.3 [MOF1999].

O pacote Model é utilizado para gerar as interfaces CORBA através do mapeamento MOF -> CORBA IDL ou as interfaces JMI através do mapeamento MOF -> Java. Através dessas interfaces o usuário poderá criar os metamodelos, instâncias do modelo MOF.

A próxima seção realiza uma breve descrição das principais classes e associações do modelo. Uma descrição mais detalhada pode ser encontrada na especificação MOF.

4.3.2.1 As principais Classes do Modelo

As principais classes do modelo MOF são:

• ModelElement – Esta é a classe raiz do modelo MOF. Todas as classes são subclasses de ModelElement. Quando mapeada para interfaces, esta classe herda da interface reflexiva Reflective::RefObject; porém, esta não é uma generalização dentro do modelo MOF, é apenas um artefato dos mapeamentos MOF ->CORBA IDL e MOF-> Java. Todo ModelElement possui um atributo name,que provê um nome único dentro do namespace que contém o elemento. Ao escolher o nome para um elemento num modelo, o projetista deve ter atenção especial aos problemas de portabilidade relacionados ao mapeamento para plataformas específicas. Por exemplo: o projetista cria uma classe cujo nome é class. Ao fazer o mapeamento para alguma linguagem, como Java, onde class é uma palavra reservada, ele terá problemas, pois o compilador Java acusará erro de uso de palavra reservada como nome de classe. O ModelElement possui ainda referências para o objetos namespace que o contém, para os outros elementos que dependem dele, e para as suas contraints.

• Namespace – Esta classe classifica e caracteriza os elementos que contém outros elementos. As subclasses desta classe oferecem duas características importantes: podem ser containers de outros elementos, e funcionam como um namespace, oferecendo um conjunto de nomes únicos para os elementos que fazem parte do namespace. Ela possui uma referência contents que identifica o conjunto de elementos que o objeto Namespace contém.

Um objeto GeneralizableElement herda as características (atributos, referências, operações) de cada um dos seus supertipos e as características dos supertipos de cada um dos seus supertipos imediatos, e assim por diante. Ou seja, ele é transitivo. Quando um GeneralizableElement herda as características dos seus supertipos, os nomes dessas características passam a fazer parte do namespace de GeneralizableElement. Entretanto, um GeneralizableElement não pode herdar características cujos nomes venham a colidir com o das suas características. O MOF possui um conjunto de constraints que prevê isto.

• TypedElement – É a classe base de todas as classes do nível M3 cuja definição requer a especificação de um tipo. São exemplos, atributos, parâmetros e constantes. Esta classe sozinha não define um tipo, ela está associada com a classe Classifier, através da associação isOfType apresentada na Figura 4.2.

• Classifier – É a classe base de todas as classes que definem tipos. Exemplos de subclasses de Classifier são as classes Class e DataType.

As classes Classifier e TypedElement em conjunto com as suas respectivas subclasses formam os tipos de dados utilizados pelo MOF, a Figura 4.2 apresenta o modelo.

Figura 4.2 - Os tipos de dados do MOF

• Feature – Esta classe define as características dos objetos ModelElement. As características podem ser comportamentais ou estruturais. As comportamentais são as operações e exceções do modelo e as estruturais são os atributos e as referências.

• Class – Esta classe representa um objeto classe. Quando os metamodelos MOF são definidos e importados para um repositório MOF, as classes que pertencem a estes metamodelos são armazenadas como instâncias da classe Class de MOF.

• Package – Define as características e comportamentos dos objetos pacotes. Todos os pacotes dos metamodelos MOF são armazenados no repositório MOF como instâncias da classe Package.

• Association – Esta classe representa um objeto associação. Todas as associações dos metamodelos MOF são armazenadas no repositório MOF como instâncias da classe Association.

• Attribute – Todos os atributos das classes dos metamodelos MOF são representados por esta classe.

• Reference - Todos as referências que uma classe pode fazer a outra nos metamodelos MOF são representados por esta classe.

Todas essas classes possuem um conjunto de características que podem ser verificadas na especificação MOF [MOF1999].

4.3.2.2 As Principais Associações do Modelo

As principais associações do modelo MOF são:

• Contains – Representa um relacionamento entre as classes Namespace e ModelElement. Um metamodelo instância do MOF é definido através de uma composição de objetos do tipo ModelElement. Um Namespace define que um ModelElement contem outros ModelElement. Todas as subclasses de Namespace podem utilizar a associação Contains para compor outros elementos do metamodelo. Entretanto, existem algumas combinações que não podem acontecer, por exemplo, uma classe não pode conter um pacote. A especificação MOF trata isto na seção “The MOF Model Containment Hierarchy” [MOF1999].

• Generalizes – Esta associação é definida sobre a classe GeneralizableElement. Ela representa o relacionamento subclasse/superclasse entre os objetos, instâncias do modelo MOF.

• RefersTo – É um relacionamento entre as classes Reference e AssociationEnd. Quando um objeto do tipo Associação é criado, o MOF cria dois objetos do tipo

AssociationEnds, que representam as duas classes envolvidas na associação. Para cada objeto Class envolvido ele cria um objeto Reference que representa uma referência ao objeto AssociationEnd da Associação.

• CanRaise – Representa uma associação entre as classes Operation e Exception e diz quais exceções podem ser levantadas por uma determinada operação. Uma operação pode levantar zero ou mais exceções. Uma exceção pode ser levantada por zero ou mais operações.

• Constrains – É a associação entre as classes ModelElement e Constraint e diz quais constraints estão associadas a quais objetos ModelElement. Cada objeto Constraint pode restringir um ou mais objetos ModelElement.

• DependsOn – Esta associação é definida sobre a classe ModelElement. Ela permite identificar uma coleção de objetos ModelElement que depende estruturalmente de um outro objeto ModelElement.

• AttachesTo – É um relacionamento entre as classes Tag e ModelElement e diz quais tags estão associadas a um determinado objeto ModelElement.