• Nenhum resultado encontrado

Esta seção apresenta através de um exemplo a sintaxe concreta de CML. No exemplo da figura 14, alguns conceitos, tais como Book and Customer, são modelados em CML. A sintaxe declarando cada conceito, baseada em blocos, lembra a sintaxe da linguagem C (ISO,

2011).

Cada conceito declara uma lista de propriedades. A declaração de uma propriedade é inspirada na forma como a linguagem Pascal (JENSEN; WIRTH, 1974) declara variáveis, onde o nome é seguido por

dois-pontos (“:”) e depois pela declaração do tipo.

A sintaxe de expressões em CML, tal como a expressão usada para definir orderedBooks no conceito BookStore, é parcialmente ins- pirada em expressões de OCL (OMG, 2014b). A sintaxe da expressão em goldCustomers é original, mas sua semântica também é baseada em expressões de consulta em OCL.

Como visto no bloco CustomerOrder, CML também permite a declaração de associações bidirecionais através do pareamento de pro- priedades de diferentes conceitos. As associações unidirecionais são representadas apenas por uma única propriedade partindo da origem da associação, como é o caso da propriedade books em BookStore.

Na subseção 3.1.1, o modelo do exemplo da figura 14 é ilustrado como uma árvore sintática abstrata, que se assemelha ao modelo de re- presentação interna usado pelo compilador. O mapeamento do exemplo para UML (OMG, 2015a) e OCL (OMG, 2014b) é descrito na subseção

@concept BookStore { books: Book∗ ; customers: Customer∗ ; o r d e r s: Order∗ ; /goldCustomers = customers | s e l e c t: t o t a l S a l e s > 1000; /orderedBooks = o r d e r s.items.book;

} @concept Book { t i t l e: S t r i n g; p r i c e: Decimal; quantity: I n t e g e r = 0 ; } @concept Customer { o r d e r s: Order∗ ; /t o t a l S a l e s = sum(o r d e r s.t o t a l) ; } @concept Order { customer: Customer; items: Item∗ ;

t o t a l: Decimal = sum(items.amount) ; } @concept Item { book: Book; quantity: I n t e g e r; amount: Decimal; } @association CustomerOrder {

Order.customer: Customer; Customer.o r d e r s: Order∗ ; }

Figura 14 – Modelo em CML adaptado da loja de livros fictícia Livir; um estudo de caso no livro de Wazlawick (WAZLAWICK, 2014).

3.1.1 Árvore de Sintaxe Abstrata

O conceito BookStore especificado no modelo da figura 14, quando lido pelo compilador CML, gera uma árvore de sintaxe abstrata1 (ou

simplesmente AST) semelhante à ilustrada na figura 15.

Figura 15 – AST gerada pelo compilador CML após a leitura da espe- cificação do conceito BookStore apresentado na figura 14.

Para o compilador CML, esta AST resultante corresponde à sua representação interna do conceito BookStore, assim como especificado pelo código em CML da figura 14. Usando a terminologia para me- tamodelos de EMOF (OMG, 2016), cada nodo na figura 15 representa

uma instância de uma classe do metamodelo da linguagem CML. O nó-raíz é uma instância da classe Concept e seus subnós são instâncias da classe Property. Esta, por sua vez, tem como subnós instâncias das classes Type e Expression.

Uma vez que a AST da figura 15 é gerada e validada interna- mente pelo compilador CML, esta serve como a entrada dos templates extensíveis (apresentados na seção 4.3) durante a fase de geração de código.

Para que o compilador CML possa gerar a AST, é necessário definir o metamodelo da linguagem CML, que é formalizado pela es- pecificação da linguagem no anexo A, e ilustrado na seção 3.2. Antes desta, a subseção 3.1.2 faz um mapeamento de modelos conceituais cri- ados em CML (como o da figura 14) para modelos correspondentes em UML (OMG, 2015a) e OCL (OMG, 2014b).

1Na figura 15, mostra-se apenas parte da árvore do modelo CML definido na

figura 14; somente a parte que se refere ao conceito BookStore. Uma árvore similar seria gerada pelo compilador para todos os conceitos do modelo.

3.1.2 Mapeamento para UML/OCL

Parte do metamodelo de CML, como apresentado na seção 3.2, pode ser considerado um pequeno subconjunto do metamodelo de UML (OMG, 2015a). Portanto, os elementos estruturais (ou estáticos) de

modelos escritos em CML podem ser transformados em diagramas de classes em UML. O exemplo do modelo em CML mostrado na figura 14 é mapeado para o modelo em UML da figura 16.

Figura 16 – O diagrama de classe representando em UML (OMG, 2015a)

o mesmo modelo codificado em CML pela figura 14.

No diagrama de classe da figura 16, os conceitos em CML (Bo- okStore, Book, Customer e Order) são mapeados para classes em UML. As propriedades em CML que representam atributos, tais como title, quantity e price do conceito Book, são mapeadas para atributos em UML dentro de cada classe. As propriedades em CML que represen- tam o destino de associações unidirecionais (books, customers e orders de BookStore) são mapeadas para associações em UML com os res- pectivos papéis (mostrando a direção de navegação e a cardinalidade junto ao nome de cada papel). A associação bidirecional CustomerOr- der (formada pelas propriedades: Customer.orders e Order.customer) é mapeada para uma associação em UML com navegabilidade bidirec- tional, ou seja, sem setas na linha de associação.

Como demonstrado por este exemplo, CML permite criar mo- delos em texto com o mesmo nível conceitual que UML. Ao mesmo tempo, quando comparado com o metamodelo de UML, o metamodelo

de CML disponibiliza apenas um núcleo dos elementos fornecidos por UML, como é apresentado na seção 3.2.

Além dos elementos estruturais de um modelo conceitual, CML também permite o uso de expressões para definir o valor inicial de atri- butos e para definir propriedades derivadas; tanto as que representam atributos derivados, quanto aquelas que representam associações deri- vadas. Estas expressões são apenas parcialmente baseadas na sintaxe de OCL (OMG, 2014b), mas seguem fortemente as semânticas de OCL,

como formalmente definido pelo anexo A na especificação da linguagem CML.

Por exemplo, a expressão em CML mostrada a seguir (extraída da figura 14) é uma expressão de navegação tal qual como em OCL: /orderedBooks = orders.items.book;

Usando propriedades que representam o destino de associações, a expressão acima “navega” (uma força de expressão) a partir de uma instância de BookStore, passando por todas as instâncias de orders ligadas a instância de BookStore, e então por todas as instâncias de items de todas as orders, a fim de resultar em todos os livros (books) que já foram pedidos por clientes.

Como outro exemplo, a seguinte expressão em CML (também extraída da figura 14) já não segue a sintaxe de OCL:

/goldCustomers = customers | select: totalSales > 1000;

Entretanto, a expressão acima é semanticamente idêntica à ex- pressão seguinte em OCL:

derive: customers->select(totalSales > 1000)

Ambas as expressões acima (uma, em CML; outra, em OCL) resultam na mesma coleção de instâncias de Customer que compraram mais de 1000 em dinheiro na loja (BookStore). A seção 3.6 explica as diferenças sintáticas e as equivalências semânticas de expressões entre CML e OCL.

Documentos relacionados