OCL Object Constraint Language OCL: Object Constraint Language Amílcar Domingos Rodrigues Santy Fernandes, Girson César Silva Monteiro, Rui Sá Guerra, Simão Castro Faculdade de Engenharia da Universidade Do Porto, Rua Dr. Roberto Frias, s/n 4200-465 Porto, Portugal [email protected], [email protected], [email protected], [email protected] 1-Resumo Trabalho de pesquisa sob tema proposto “Object Constraint Language”, abreviado – OCL, é elaborado no âmbito da disciplina de Engenharia de Software, de Faculdade de Engenharia da Universidade do Porto. Neste trabalho, são abordadas as valências desta linguagem formal, a sua aplicabilidade em diferentes ferramentas de especificação de modelos, tidas como plataformas de apoio no desenvolvimento de sistemas de aplicação, com base na Programação Orientada aos Objectos. O trabalho está dividido em três partes: - na primeira parte é feita uma breve introdução dos temas e sub – temas a desenvolver (Objectivos), bem como uma descrição sucinta da linguagem acima referida, o seu uso para especificação e restrição em modelos, a conversão de restrições de linguagem natural para OCL, e finalmente, o paradigma de implementação que é utilizada nesta linguagem, como forma de especificação em modelos; - na segunda parte, é abordada a arquitectura do OCL, casos práticos da sua utilização nos sistemas. É ainda tratada nesta parte, a análise gramatical da linguagem ao nível do léxico e da sintaxe. Outras referências com aplicação prática, como implementação do dicionário de dados, tradutores para o OCL, assim como a sua livraria standard, também são aqui abordados. - na terceira parte, temos exemplos de tradução com ilustrações, tabelas de comparação, e finalmente as ferramentas. Presume-se assim, com o desenvolvimento destes temas elaborados, esgotar os objectivos preconizados para este projecto de pesquisa. Na última página são dadas as referências dos materiais consultados na sequência da pesquisa. LEIC Engenharia de Software ……………………………………… Object Constraint Language 1 OCL Object Constraint Language 2-Objectivos O OCL é uma ferramenta utilizada para a especificação de restrições na modelação dos diagramas arquitectados em UML. Um diagrama UML por conseguinte, tal como um diagrama de classe, não é suficientemente refinado para fornecer todos os aspectos relevantes de uma especificação. Há entretanto uma necessidade de definir restrições adicionais sobre objectos no modelo. Daí a tentação de sempre descrever essas restrições em linguagem natural. Contudo, a prática demonstrou que esse método de descrição das restrições, tem resultado sempre em ambiguidades. Para resolver, obstante, esses problemas de ambiguidades, tem-se recorrido às linguagens de especificação formal como OCL, justamente para solucionar tais problemas. Baseando-se na especificação de objectos em modelos, ou nas classes, de forma segura e concisa, sem ambiguidades. Neste trabalho, como já supracitado, é demonstrado a aplicabilidade dos padrões de escrita dessas restrições, na linguagem OCL. O projecto está estruturado em três partes, já referido anteriormente, cada uma dividida em sub – temas onde são abordados aspectos relevantes do uso da linguagem OCL. Como seguem: • • • • • • • Introdução ao OCL: aborda as valências da linguagem, a sua origem e a aplicabilidade para os modeladores a UML, a importância do seu uso nas definições formais das restrições. Descrição da Linguagem OCL: aborda casos específicos da utilização da linguagem quanto a definição de modelos UML; bem como a especificação dos invariantes. Motivação: aborda o uso do OCL para especificação e restrições; a conversão de restrições de linguagem natural para OCL. Implementação com OCL: aborda características do OCL quanto ao contexto, expressões, tipos de restrições e de operações, processos de implementação, e uso de expressões OCL em modelos UML. Arquitectura do OCL: aborda a parte estrutural e semântica da linguagem, o dicionário de dados, a gramática que engloba também o nível léxico e sintáctico; descrição da semântica utilizando UML; elementos básicos do OCL e livraria standard; e tradutor e exemplos de tradução para OCL. Ferramentas: aborda diferentes ferramentas onde a OCL se pode aplicar as valências do OCL. Considerações: esboça as valências do OCL como uma linguagem formal, e suas vantagens na especificação dos modelos. 3-Introdução ao OCL A Linguagem de Restrição de Objectos, abreviado OCL (Object Constraint Language), é uma linguagem formal, utilizada para descrever expressões em modelos de UML. Essas expressões definem tipicamente as condições que se deve assegurar para o funcionamento de um sistema que está a ser modelado, ou ainda, de modelação de informações contidas nos objectos descritos num determinado modelo. Quando uma expressão OCL é avaliada, não tem qualquer efeito colateral, isto é, não pode alterar o estado de execução do respectivo sistema. As expressões do OCL podem sim ser LEIC Engenharia de Software ……………………………………… Object Constraint Language 2 OCL Object Constraint Language utilizadas para especificar as restrições de operações ou acções de um determinado objecto, que quando executadas alteram o estado do sistema. Os modeladores de UML podem utilizar o OCL para especificação de restrições nas aplicações definidas nos modelos correspondentes. Os modeladores podem ainda recorrer à OCL, para especificar perguntas ou definir condições que são completamente diferentes de uma linguagem de programação. As expressões do OCL não interfiram na execução do programa. Não são compilados aquando da execução do programa. Embora existam ferramentas para a verificação e compilação das expressões descritas em linguagem OCL. Mais a frente abordaremos em mais detalhe essas ferramentas. O OCL entre outras pode ser utilizada: • • • • • • • • • Para especificar invariantes em classes e tipos do modelos de classes. Especificar tipos invariantes para estereótipos. Descrever pré e pós condições em operações. Como uma linguagem de navegação entre associações. Como uma linguagem de pergunta. Para descrever protectores. Para especificar o alvo das mensagens e acções. Para especificar regras de derivações para atributos. Especificar restrições sobre operações. 4-Descrição da linguagem OCL é uma Linguagem Formal utilizada para definir restrições sobre objectos. Tais restrições, especificam condições que têem de se verificar no sistema modelado. OCL não é uma linguagem de programação. É antes de mais, uma linguagem de modelação com regras de sintaxe e semântica bem definidas, e expressa informações que não existem nos modelos. Por exemplo, um diagrama de UML, tal como diagrama de classe, não é suficientemente refinado para fornecer todos os aspectos relevantes de uma especificação. Há entretanto, a necessidade de definir restrições adicionais sobre objectos nos modelos. Essas restrições são descritas frequentemente na linguagem natural, que apresentam sempre resultados ambíguos, quanto às informações dos objectos. Para acabar com essa representação ambígua de informação, foram desenvolvidas linguagens formais “So-Called”. A desvantagem dessas linguagens formais tradicionais, é que são acessíveis às pessoas com uma base matemática muito forte, mas não aos utilizadores médios de um sistema de modelação. LEIC Engenharia de Software ……………………………………… Object Constraint Language 3 OCL Object Constraint Language Em virtude dessa desvantagem, foi desenvolvido o OCL, justamente para facilitar a tarefa de definição das restrições, e também de dotar as linguagens formais de uma utilização flexível e mais acessível. É uma linguagem fácil de ler e de escrever. OCL foi desenvolvido em 1995 por Jos Warmer, como uma linguagem de business modelling (modelação de negócio). Em 1996, o OMG fez um “Request for Proposals” em análise e desenho OO. E em 1997 a IBM e a Object Time Limited em colaboração com os parceiros da Unified Modelling Language (UML), publicaram as versões: O OCL 1.3 de 1999; O OCL 1.4 de 2001; e actualizaram a linguagem em 2004 com a versão OCL 2.0. O OCL consequentemente, garante que as suas expressões não tenham efeitos colaterais, isto é, não altera o estado do objecto. Quando uma expressão OCL é avaliada, retorna apenas um valor. Para cada classificador (sejam classes, interfaces) definido dentro do UML, corresponde a um tipo OCL. A linguagem também define os seus tipos. Mais a frente é apresentada uma tabela com todos os tipos definidos em OCL. 5-Motivação A importância prática das regras da linguagem OCL, quanto a implementação das especificação de restrições e definições das derivações em modelos, requer um controle estruturado e disciplinado, que garanta que tais regras estipuladas, se vão verificar em qualquer circunstância durante o desenvolvimento do programa que as utiliza. Para esse efeito, são desenvolvidas ferramentas para a modelação das expressões e interpretadores para o OCL, assim como um compilador para as expressões do OCL. Interfaces que viabilizem, por outro, a utilização de técnicas de processamento de linguagem natural para base de dados. Essas ferramentas são capazes de lidar com restrições sobre dados estabelecidos através das expressões do OCL. Como exemplo, escolhemos três ferramentas para melhor ilustrar o que descrevemos acima. Como seguem: Atenas; Hermes; OCLE. • • • LEIC Atenas: é um sistema modelador de regras de negócio, que permite a sua captura e implementação; todas as restrições sobre modelos de classe devem ser encaradas como regras de negócio, mesmo as mais simples; regras de negócio muito simples em geral, podem ser mapeados directamente como restrições de modelo. Hermes: é um tradutor para OCL; traduz uma restrição estabelecida numa sentença em português, e tenta gerar a expressão em OCL, que representa essa restrição dentro de um modelo de classe. OCLE: compilador do OCL, permite ao modelador apurar correcção da sintaxe e a semântica de expressões OCL; faz uma avaliação de restrições especificadas pelo modelador, em diferentes elementos do modelo; ajuda a corrigir erros nos modelos e nas especificações OCL. Engenharia de Software ……………………………………… Object Constraint Language 4 OCL Object Constraint Language 5.1-Uso de OCL para a especificação e restrições Vamos propor para a análise deste tema, a integração das ferramentas acima referidas, neste caso Atenas e Hermes, em linguagem OCL, na definição das regras de restrições sobre um determinado modelo de classes ou de um Sistema de Gestão de Base de Dados. A ideia básica de Atenas, é de uma ferramenta que serve como uma base formal para a documentação das regras de negócio de um sistema de informação. Uma vez que as restrições estejam estabelecidas em OCL, o Atenas é capaz de detectar na base de dados, os eventos que podem vir a violar essas restrições, como por exemplo, a inserção de um registo, alteração de valor de uma coluna ou remoção de um registo. O sistema também é capaz de gerar um código específico para detectar e impedir violações, gerando tiggers que verificam a validade de restrição no evento correspondente. Tudo isso é feito automaticamente através de uma expressão em OCL, e do mapeamento entre um modelo de classes e o esquema da base de dados relacional. E para cada expressão em OCL, são mantidas a informação sobre a restrição em si, tais como a sua origem, aplicabilidade, histórico e etc. Neste contexto, o Hermes traduz uma restrição estabelecida numa sentença em português, e tenta gerar a expressão OCL que representa essa restrição dentro de um modelo de classe. Caso a expressão seja gerada correctamente, o Hermes activará código correspondente do Atenas que irá gerar código da respectiva linguagem de programação (por exemplo SQL) para fazer a avaliação das regras. Para Atenas, as regras de negócio estão divididas em três grupos: regras extraídas automaticamente do esquema do banco de dados, regras registadas manualmente pelos utilizadores e regras inferidas automaticamente a partir das outras duas. A ferramenta possui funcionalidade para lidar com estes três tipos de regras. De acordo com o que já definimos em cima, especificamos em concreto as funcionalidades disponibilizadas pela ferramenta: • • • • LEIC Validar o sistema: uma vez que todas as regras de negócio estejam estabelecidas numa linguagem formal, é possível gerar a lista de eventos do sistema (inserção, alteração, …) onde os mesmos são gerados. Validar os Dados Legados: assegurar a integridade e a qualidade dos dados, aquando da implementação de um novo sistema, em substituição do anterior. Auxílio para a Extracção das Regras do Negócio: um sistema que estruture as regras de negócio de forma independente, as mensagens do erro são as próprias regras de negócio. Manutenção do Sistema: a ferramenta permite analisar o impacto de mudanças em regras de negócio, através do relatório do impacto duma mudança ocorrida em alguma regra de negócio. Engenharia de Software ……………………………………… Object Constraint Language 5 OCL Object Constraint Language RegraOCL Esquema Compilador ListadeEventos Formal Triggers CódigoemSQL Informal Updates Fig. 1. Esquema de avaliação do impacto de alteração de Base de Dados 5.2-Conversão de restrições de Linguagem Natural para OCL Escrever restrições sobre um modelo de classe utilizando OCL, não é uma tarefa trivial para não programadores. É necessário ter um conhecimento sobre o modelo de classes, mesmo sendo uma linguagem declarativa. O OCL não é uma linguagem trivial. O OCL é uma linguagem formal, com as regras de sintaxe e semântica bem distintas da linguagem natural. O sistema Hermes, escolhido neste trabalho de pesquisa para exemplificar o funcionamento da linguagem, permite que não programadores descrevam restrições utilizando linguagem natural, em português, e as transformam em OCL e depois passado para linguagem de programação. Durante o processo, as eventuais ambiguidades presentes no discurso humano, são eliminadas. LEIC Engenharia de Software ……………………………………… Object Constraint Language 6 OCL Object Constraint Language Há três cenários onde a utilização do Hermes apresenta vantagens óbvias. Um cenário seria a formalização de regras de negócio ou restrições durante a etapa de análise, através da captura em linguagem natural e posterior conversão em OCL. A esta altura, não é necessário que o modelo de classes esteja muito estável – de qualquer forma o sistema suporta pequenas evoluções. Quando o modelo estiver mais estável as regras escritas em linguagem natural podem ser então transformadas em OCL e finalmente quando o modelo relacional estiver pronto elas serão convertidas em código SQL (queries e triggers) para verificarem e manterem a integridade das regras. Dessa forma é possível documentar as regras de negócio nas etapas iniciais da análise, utilizando linguagem natural e estabelecendo as regras com um máximo de independência do modelo de dados de implementação. Um outro cenário possível é a existência de dados legados que devem ser filtrados ou avaliados quanto à obediência as regras de negócio ou outras restrições. Como em geral o número de restrições a serem testadas é grande torna-se mais fácil estabelecêlas em linguagem natural. Além disso, as restrições no fundo são as mesmas, independentemente do esquema dos dados. Portanto, elas podem ser estabelecidas uma única vez, testada contra os dados legados, e o tratamento adequando providenciado. Após a migração para um novo esquema, as mesmas regras são novamente traduzidas para OCL (possivelmente diferente do anterior) e compiladas para o SQL apropriado a nova base. Finalmente, podemos ter também a situação onde um analista de negócios está a investigar a validade de determinadas regras de negócio, realizando uma prospecção de conhecimento numa base de dados já existente. Assim, ao invés de restrições teríamos suposições sobre os dados, tais como “os pedidos com peso acima de 50 kg pagam transporte maior que 40,00 Euros e o tempo de entrega é maior que 7 dias, onde o tempo de entrega é a data de entrega menos a data do pedido”. Após o analista de domínio ou negócio elaborar uma suposição, o sistema Hermes a transformaria em OCL e depois em SQL, e investigaria a validade da mesma na base de dados, retornando o registos processado em acordo ou desacordo com a regra. Embora esse tipo de prospecção seja manual, é um facto geralmente aceite que boas descobertas de conhecimento em bases de dados podem ser realizadas por especialistas do negócio que sabem ou têm uma boa noção do que devem procurar. 6-Implementação de Contrato com OCL Nesta parte estão representados os contratos do sistema. Em orientação a objectos, o contrato descreve de forma clara e unívoca as obrigações de um objecto, sendo que este executará seus serviços (obrigações) mediante o cumprimento de certas regras estipuladas (direitos ou condições iniciais sob as quais o serviço será prestado). O contrato está relacionado à definição da interface de um objecto. Difere do contrato legal por não necessitar de um cliente. LEIC Engenharia de Software ……………………………………… Object Constraint Language 7 OCL Object Constraint Language Em seguida apresentamos dois exemplos de contratos: • Contrato para fornecerDinheiro: Name: fornecerDinheiro(dinheiro:Moeda) Responsibilities: Fornecer dinheiro à máquina de bebida. Atualizar contagem da quantia de dinheiro fornecida pelo cliente. Exibir bebidas disponíveis. Type: System Cross References: R2.1 Notes: Exceptions: Output: OCL Specification: context Sistema::fornecerDinheiro(dinheiro:Moeda) pre:dinheiro.valor=1.0 post: maquinaDeBebida.carteiraDoCliente@pre->size=0 implies maquinaDeBebida.carteiraDoCliente->size=1 and maquinaDeBebida.carteiraDoCliente.oclIsNew=true post: maquinaDeBebida.carteiraDoCliente.oclIsNew=true implies maquinaDeBebida.carteiraDoCliente.itemDeRepositorioDeDinheiro >size=1 and itemMaisRecente(maquinaDeBebida.carteiraDoCliente).oclIsNew=true post:if itemMaisRecente(maquinaDeBebida.carteiraDoCliente).oclIsNew then itemMaisRecente(maquinaDeBebida.carteiraDoCliente).moeda=dinheiro and itemMaisRecente(maquinaDeBebida.carteiraDoCliente).quantidade=1 else itemMaisRecente(maquinaDeBebida.carteiraDoCliente).quantidade= itemMaisRecente(maquinaDeBebida.carteiraDoCliente@pre).quantidade+1 endif 6.1-Tipos de Restrições em OCL • Expressões Contexto de uma expressão: As expressões OCL requerem que as restrições estejam ligadas a um contexto de um modelo. O contexto de uma expressão pode ser uma classe de objectos ou pode ser uma operação aplicável a um objecto. Para representar um contexto em OCL utilizamos a palavra reservada context <contexto> LEIC Engenharia de Software ……………………………………… Object Constraint Language 8 OCL Object Constraint Language • • • • Invariantes (inv): condição (ou predicado) que se aplica a TODAS as classes (ou tipo ou interface ou associação e etc…) Pré-condição (pre): condição que deve ser satisfeita antes da execução de uma operação Pós-condição (post): condição que deve ser satisfeita após a execução de uma operação Guarda: condição que deve ser satisfeita para que uma transição de estado seja efectuada As restrições aqui colocadas foram retiradas dos contratos expressos na anterioriormente. Exemplos de invariantes: context Cliente inv: idade > = 18 and self.idade < 100 context c: Cliente inv CasamentoLegal: c.casado implies c.idade > = 21 CasamentoLegal – identificador do invariante c – objecto casado - atributo 7-Ferramentas Neste capítulo falamos das ferramentas que tornam a linguagem OCL mais fácil de ser usada. Em baixo estão enunciados algumas das mais recentes ferramentas dessa linguagem. ModelRun (Boldsoft) ModelRun permite a exploração e a navegação dos modelos através dos objectos dinâmicos e uma sustentação completa para o OCL. Uma vez que o modelo foi carregado, é possível examinar suas propriedades de três vistas: "Metadata": onde nós encontramos a informação nas classes. Podemos consultar o nome da classe, as suas super-classes, as associações, os atributos e as operações. "Objects": uma vista para segurar os objectos. É necessário previamente carregar o ficheiro de objectos com o formato padrão de XML. "Ocl Workbench": para a criação e a manipulação de expressões do OCL. A "Workbench" esta compreendida entre uma janela da selecção de contexto e um editor das expressões do OCL. OCL Compiler (Cybernetic Intelligence GMBH) OCL Compiler é uma aplicação para analisar as expressões do OCL que aparecem no modelo de UML. É uma ferramenta independente em que, dado um modelo do software com restrições do OCL, as seguintes acções podem ser executadas (dependendo da especificação da ferramenta): - Verificação da sintaxe das restrições. - Verificação de consistência das restrições usando o modelo. Por o exemplo, se o nome de uma classe, de um atributo ou de uma associação for escrito incorrectamente, "OCL Compiler" detectará a inconsistência. LEIC Engenharia de Software ……………………………………… Object Constraint Language 9 OCL Object Constraint Language -Verificação de incompatibilidade das restrições, isto é, certifica-se que restrições do mesmo modelo não entrem em conflito. O analisador é independente da ferramenta CASE usada na modelação, isto é não sabe nada sobre a ferramenta CASE e comunica-se através de uma ferramenta "front-end". A versão mais recente dessa ferramenta é a “OCL Compiler v 1.5”, desenvolvida pela Cybernetic Intelligence GmbH”, uma empresa de software Suiça criada em 1994. OCL Compiler (University de Dresden) O “OCL Compiler” (OCLCUD) foi desenvolvido em Java pela Universidade de Dresden .As características principais deste analisador são: capacidade de verificação sintáctica e semântica das expressões do OCL e a possibilidade de gerar código Java e SQL a partir das restrições escritas em OCL. 8-Considerações No desenvolvimento do trabalho de pesquisa não tivemos dificuldades de maior. Encontramos materiais com informações precisas e esclarecedoras, que em muito facilitou a estruturação do trabalho. Não conseguimos fazer referências detalhadas de muitos temas, e acabamos mesmo por deixar outros de fora, devido a limitação de páginas do relatório. Mas, efectivamente, conseguimos incluir aspectos mais relevantes do tema que nos propusemos desenvolver como trabalho de pesquisa. Obstante, julgamos que conseguimos alcançar os objectivos delineados para este trabalho, embora tivemos que deixar alguns temas de fora, fizemos uma abordagem precisa dos temas mais importantes. No entanto, ficamos a conhecer bastante bem, as potencialidades da ferramenta OCL, as vantagens da sua aplicabilidade na definição de restrições nos modelos de classes em UML e ainda noutras linguagens de programação. Portanto, concluímos que o uso desta ferramenta, para a especificações das restrições, vai tornar-se cada vez mais necessária, devido não só a facilidade da sua utilização, mas também da vantagem que nos proporciona quanto a geração dos códigos em linguagens de programação, de forma segura e com elevada qualidade. LEIC Engenharia de Software ……………………………………… Object Constraint Language 10 OCL Object Constraint Language Referências: 1. http://www.omg.org/docs/ptc/03-10-14.pdf 2. http://www.klasse.nl/ocl/ 3. http://www.ic.unicamp.br/~eliane/Cursos/MC627/ocl_artigo.pdf 4. Birgit Demuth, Heinrich Hussmann: Using UML/OCL Constraints for Relational Database Design LEIC Engenharia de Software ……………………………………… Object Constraint Language 11