• Nenhum resultado encontrado

5. UM METAMODELO PARA O DOMÍNIO DE MPS

5.2 Implementação do SPIM

5.2.2 Conceitos relativos à Padrão de Qualidade

Uma vez definido o elemento QualityElement, foram introduzidos os elementos correspondentes aos conceitos de Framework de Qualidade, Padrão de Qualidade, Componente de Padrão de Qualidade e seus subtipos Componente Requerido e Componente Não Requerido. O diagrama apresentado na Figura 5.6 ilustra a introdução no SPIM dos elementos correspondentes a estes conceitos.

Os elementos QualityFramework, QualityStandard, StandardComponent, RequiredComponent e NonRequiredComponent possuem a mesma semântica dos conceitos de Framework de Qualidade, Padrão de Qualidade, Componente de Padrão de Qualidade, Componente Requerido e Componente Não Requerido, respectivamente. Esta semântica já foi definida na OMPS na seção 4.4 e, portanto, não será repetida neste

capítulo. Porém, aqui é necessário apresentar a implementação em OCL das restrições representadas pelos axiomas definidos na OMPS. Em virtude das diferenças entre a lógica de primeira ordem e a OCL, esta implementação não é tão direta quanto à implementação dos conceitos na forma de elementos do metamodelo. Assim, para cada axioma ou conjunto de axiomas serão apresentadas e explicadas as expressões equivalentes em OCL.

Figura 5.6 – Introdução dos conceitos de Padrões de Qualidade em QualityStandardContent.

No caso da Ontologia de Padrões de Qualidade, os axiomas definidos têm o propósito de formalizar as relações de composição a partir das relações de parte-todo presentes na semântica pretendidas pelos diagramas da ontologia. Desta forma, são necessárias expressões em OCL que permitam formalizar estas mesmas relações de composição. Mas antes de apresentar estas expressões, são necessárias algumas operações de suporte a criação das mesmas. Para isto foram criadas operações recursivas em OCL visando implementar as propriedades de transitividade das relações de parte-todo possuídas pela ontologia. As interfaces destas operações podem ser observadas como operações dos elementos presentes no diagrama da Figura 5.6. Já suas implementações correspondentes em OCL são apresentadas a seguir.

O conjunto de instâncias de QualityStandard que compõem uma instância de QualityFramework é indicado pela propriedade qualityStandards da classe QualityFramework :

!context!QualityFramework!

!property!qualityStandards#framework!:!QualityStandard[+]!{!ordered!composes!};!

A primeira e mais simples operação implementada no elemento QualityFramework tem o propósito de verificar se uma determinada instância qs de QualityStandard é parte do conjunto de instâncias de QualityStandard que compõem uma determinada instância de QualityFramework. Para isto, é feito uso da propriedade qualityStandards da classe QualityFramework :

!context!QualityFramework!

!operation!isTheWholeOf(qs!:!QualityStandard[1])!:!Boolean[?]! ! {!

! ! body:!self.qualityStandardsG>includes(qs);! ! }!

!

Esta operação não é suficiente para indicar se uma determinada instância de StandardComponent faz parte de uma instância de QualityFramework, pois para isto é necessário implementar a propriedade de transitividade presente na ontologia. Vale aqui relembrar que esta propriedade pode ser expressa, em lógica de primeira ordem, da seguinte forma:

(∀x,y,z) todoDe(x,y) ∧ todoDe(y,z) → todoDe(x,z)

Para garantir a propriedade de transitividade na implementação da operação isTheWholeOf em QualityFramework foi desenvolvida outra operação que consulta todos as instâncias de QualityStandards que compõem uma determinada instância de QualityFramework utilizando-se da implementação desta mesma operação naquela classe:

!

!context!QualityFramework!

!operation!isTheWholeOf(c!:!StandardComponent[1])!:!Boolean[?]! ! {!

! ! body:!self.qualityStandardsG>exists(sub!:!QualityStandard!|! ! ! ! !!sub.isTheWholeOf(c));!

! }! !

No elemento QualityStandard a propriedade standardComponents indica quais as instâncias de StandardComponents compõem uma instância de QualityStandard.

!context!QualityStandard!

! {!ordered!composes!};! !

Com o uso desta propriedade foi implementada a operação isTheWholeOf na classe QualityStandard :

!context!QualityStandard!

!operation!isTheWholeOf(c!:!StandardComponent[1])!:!Boolean[?]! ! {! ! ! body:! ! ! ! self.standardComponentsG>includes(c)!or!! ! ! ! self.standardComponentsG>exists(sub!:!StandardComponent!|! 3 3 3 3 3333333333333333333333333333333!sub.isTheWholeOf(c));! ! }! !

A operação isTheWholeOf na classe QualityStandard verifica se o componente faz parte dos componentes da instância de QualityStandard ou se ele faz parte dos sub-componentes da mesma, fazendo uma chamada a operação isTheWholeOf da classe StandardComponent. Entretanto, o elemento StandardComponent possui uma composição capaz de conter instâncias de sub-componentes em uma estrutura hierárquica que precisa ser pesquisada recursivamente para implementar a propriedade de transitividade. Isto é feito com o uso na classe StandardComponent da propriedade nestedStandardComponents pela operação recursiva isTheWholeOf :

!context!Standardcomponent!

!property!nestedStandardComponents#nestingStandardComponents!:!StandardComponent[*]! !{!ordered!composes!};!

!operation!isTheWholeOf(c!:!StandardComponent[1])!:!Boolean[?]! ! {! ! ! body:! ! ! ! self.nestedStandardComponentsG>includes(c)!or! ! ! ! self.nestedStandardComponentsG>exists(sub!:!StandardComponent!|! ! ! ! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!sub.isTheWholeOf(c));! ! }! !

Além das operações isTheWholeOf também foram implementadas as operações isPartOf, que utilizam-se de lógica semelhante. Devido a esta semelhança, a implementação das mesmas não será apresentada aqui. Estas operações em conjunto dão o suporte necessário para a implementação em OCL de expressões equivalentes aos axiomas da OMPS. Em OCL estas expressões são chamadas de invariants, pois apresentam proposições que devem ser sempre verdadeiras para quaisquer modelos que estejam em conformidade com o metamodelo. O axioma A6, por exemplo, visa garantir que todos os componentes e subcomponentes de uma instância de padrão de qualidade pertençam a um mesmo framework:

(∀x,y) subcomponente(y,x) !

(∃f) framework(f) ∧ parteDe(y,f) ∧ parteDe(x,f)

Para garantir esta restrição no metamodelo foi criada uma propriedade derivada indicando a qual padrão de qualidade um componente pertence. Novamente, é necessário o uso de operações recursivas para tal implementação, tornando as expressões em OCL mais complexas:

!context!Standardcomponent!

!property!nestingStandardComponents#nestedStandardComponents!:!StandardComponent[?]! ! {!ordered!};!

!property!direct_standard#standardComponents!:!QualityStandard[?]!{!ordered!};! !property!standard!:!QualityStandard[?]!{!derived!volatile!}!

! {!

! ! derivation:!

! ! ! if!self.nestingStandardComponents.oclIsUndefined()!then!! ! ! ! ! self.direct_standard!! ! ! ! else!! ! ! ! ! self.nestingStandardComponents.standard!! ! ! ! endif;! ! }! !

Por fim, a propriedade derivada standard pode ser utilizada na criação da invariant StandardComponentComposition para implementação da restrição estabelecida pelo axioma A6:

!context!Standardcomponent!

!invariant!StandardComponentComposition:!

! ! self.nestedStandardComponentsG>forAll(sc!:!StandardComponent!|!!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!sc.standard.framework=self.standard.framework);! !

5.2.3 Conceitos relativos ao mapeamento entre Padrões de