<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Desenho por Contrato: Um Ciclo de Vida</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Ricardo Alves</string-name>
          <email>ricardo.alves@amcor-flexibles.com</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Sérgio Bryton</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>---------------- • Ricardo Alves exerce a sua actividade profissional na multinacional Amcor</institution>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Tópicos - OCL</institution>
          ,
          <addr-line>Desenho por Contrato, UML, Java</addr-line>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2004</year>
      </pub-date>
      <abstract>
        <p>Resumo - Um dos grandes objectivos da Engenharia de Software é produzir software com qualidade. Significa isto que propriedades como robustez, correcção, reutilização, manutenção, compatibilidade, eficiência, portabilidade e funcionalidade, entre outras, têm que estar presentes num produto de software com qualidade. O Desenho por Contrato (DpC) com Object Constraint Language (OCL) e a Programação por Contrato (PpC) são reconhecidamente instrumentos potenciadores de qualidade que actuam em dois extremos, respectivamente no modelo e no código. Estabelecer a ponte entre estes dois extremos é um passo importante para o aumento da qualidade do produto final. Este artigo pretende constituir uma análise do estado da arte no que respeita às ferramentas que possibilitam modelação em Unified Modelling Language (UML) com OCL e implementação de DpC com a linguagem Java e que possam sustentar essa ponte.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>——————————</p>
    </sec>
    <sec id="sec-2">
      <title>1 INTRODUÇÃO</title>
      <p>1 http://ctp.di.fct.unl.pt/mei/qpp
por um cacilheiro. Cada embarcação destas tem uma
capacidade limitada quanto ao número de passageiros que pode
transportar. Em cada viagem é transportado um
determinado número de passageiros que não pode exceder o
número de lugares disponíveis do cacilheiro que lhe está
associado. Cada cacilheiro tem atribuído um conjunto de
identificação único assim como cada viagem é identificada
por um número de viagem único. Um passageiro não pode
realizar mais do que uma viagem simultaneamente.</p>
      <sec id="sec-2-1">
        <title>2.2 Desenho por Contrato</title>
        <sec id="sec-2-1-1">
          <title>O paradigma do desenvolvimento de software orientado</title>
          <p>pelos objectos (DSOO) introduziu os conceitos de classes,
objectos, abstracção, herança, polimorfismo e genericidade
que se traduziram num passo importante na constante
procura da qualidade do produto na engenharia de software.
No entanto, expressar alguns factores de qualidade na
programação, no sentido de tornar os programas legíveis, bem
especificados e validados e entender as regras que estão por
trás da sua forma de implementação, é algo que a maioria
das ferramentas de apoio ao desenvolvimento orientado
pelos objectos não contemplava. Esta necessidade
despoletou o surgimento do DpC.
pós-condições e invariantes permite-nos exprimir de uma
maneira formal as especificações do contrato. Falta ainda,
obviamente, especificar as consequências e respectivo
tratamento das excepções às cláusulas contratuais.</p>
        </sec>
        <sec id="sec-2-1-2">
          <title>O DpC no DSOO resume-se à utilização sistemática de</title>
          <p>
            pré-con dições, pós-condições e invariantes. As pré-condições
são uma obrigação da operação cliente, em benefício da
operação fornecedor; as pós -condições são uma obrigação da
operação fornecedor, em benefício da operação cliente.
Ambas, descrevem as propriedades de cada método
individualmente. Os invariantes expressam as propriedades
globais das instâncias de uma classe, as quais terão que ser
preservadas por todas as operações dessa classe [
            <xref ref-type="bibr" rid="ref2">2</xref>
            ]. Mesmo
havendo um contrato entre as classes, algo inesperado pode
ocorrer que o viole, ou seja, uma excepção. Embora,
teoricamente, num sistema construído com qualidade nenhum
contrato possa ser violado, isso não acontece na realidade.
          </p>
        </sec>
        <sec id="sec-2-1-3">
          <title>Nesse sentido, terão que existir mecanismos de tratamento de excepções.</title>
        </sec>
        <sec id="sec-2-1-4">
          <title>Na figura 2 está ilustrado um exemplo, de como se pode redigir um contrato na fase de implementação, utilizando uma linguagem de programação2 que suporte a inclusão de cláusulas contratuais expressas em pré-condições, pós</title>
          <p>TABELA 1
EXEMPLO DE UM CONTRAT O
Cliente
Fornecedor</p>
          <p>Obrigações
Tem que assegurar as pré-condições:
1. bilhete comprado.</p>
          <p>2. estar no cacilheiro 5 minutos antes da partida.</p>
          <p>Tem que assegurar a pós-condição:
1. transportar o clienteparaolocalpretendidoaté
10 minutos depois da hora prevista no horário.</p>
          <p>Benefícios
Da pós-condição:
1. estar no local pretendido às na hora prevista no horário com atraso
mínimo de 10 minutos.</p>
          <p>Da pré-condição:
1. não ter prejuízo por transportar clientes sem bilhete comprado e não
partir com atraso.</p>
          <p>
            O conceito chave do DpC assenta essencialmente na
expressão das relações entre uma classe (fornecedor) e os seus clientes
sob os auspícios de um acordo formal, contemplando os direitos
e obrigações de ambas as partes. Somente com a definição
precisa de todas as reivindicações e responsabilidades respeitantes a
cada módulo pertencentes a um determinado sistema, se lhe
pode depositar um alto grau de confiança [
            <xref ref-type="bibr" rid="ref1">1</xref>
            ].
          </p>
          <p>Fazendo um paralelismo com os contratos efectuados,
por exemplo entre duas organizações, podemos inferir
algumas propriedades importantes de um contrato:
1. são firmados entre duas ou mais entidades , em que
cada uma assume o papel de cliente ou fornecedor;
2. é explicitamente escrito numa linguagem
conhecida por ambas as partes;
3. especifica as obrigações e benefícios mútuos;</p>
        </sec>
        <sec id="sec-2-1-5">
          <title>4. as obrigações de uma das partes são os benefícios</title>
          <p>da outra e vice-versa;</p>
        </sec>
        <sec id="sec-2-1-6">
          <title>5. não contem cláusulas escondidas;</title>
        </sec>
        <sec id="sec-2-1-7">
          <title>6. muitas vezes faz referência, implícita ou explicitamente, a regras comuns a todos os contratos (leis vigentes, regulamentos oficiais, etc.).</title>
        </sec>
        <sec id="sec-2-1-8">
          <title>Tomando por exemplo o contrato entre a empresa que</title>
          <p>assegura as travessias do rio Tejo (fornecedor) e os seus
passageiros (cliente) podemos formalizar alguns dos benefícios e
obrigações correspondentes como está expresso na tabela 1.</p>
        </sec>
        <sec id="sec-2-1-9">
          <title>Como podemos observar a utilização de pré-condições,</title>
          <p>condições, invariantes e tratamento de excepções. Conclui-se,
facilmente, que a utilização do DpC elimina, por completo, a
necessidade da programação defensiva , na qual as
validações da utilização do serviço estão todas do lado do
fornecedor não havendo obrigações por parte do cliente.</p>
        </sec>
        <sec id="sec-2-1-10">
          <title>O conceito de hera nça é largamente utilizado no DSOO.</title>
          <p>
            De modo a que a utilização deste conceito não invalide as
cláusulas do DpC, a redefinição de uma operação apenas
pode substituir a pré-condição original por uma igual ou
mais fraca (exigindo menos do cliente) e a pós-con dição
original por uma igual ou mais forte (oferecendo mais ao
cliente) [
            <xref ref-type="bibr" rid="ref30">30</xref>
            ]. Significa isto, que uma subclasse não é mais do que
uma subcontratação da parte da classe pai e, por
conseguinte, tem que, obrigatoriamente, satisfazer no mínimo, o
mesmo contrato.
          </p>
          <p>
            A utilização do conceito de contrato pode ser utilizado em
todo o ciclo de vida do processo de DSOO. Assim a
utilização de pré-condições, pós -condições e invariantes começa na
modelação do sistema descrevendo os seus eventos. Na fase
de análise e na fase de implementação os contratos definem
as operações, os benefícios e as obrigações de cada comp
onente do sistema, respectivamente. Finalmente, na fase de
testes, os contratos definem a correcta especificação de cada
componente [
            <xref ref-type="bibr" rid="ref3">3</xref>
            ].
          </p>
          <p>2 A linguagem Eiffel tem mecanismos nativos de suporte ao DpC.</p>
        </sec>
        <sec id="sec-2-1-11">
          <title>O DpC é suportado pelo UML através de uma linguagem, o OCL, que permite especificar pré e pós-condições para as operações e invariantes para as classes.</title>
        </sec>
      </sec>
      <sec id="sec-2-2">
        <title>2.3 Object Constraint Language - OCL</title>
        <sec id="sec-2-2-1">
          <title>O OCL evoluiu de uma linguagem de expressões do método Syntropy que era uma linguagem de modelação de processos de negócio utilizada na IBM, até ser integrada, em 1997, no UML [5].</title>
          <p>
            A modelação de sistemas de software é tradicionalmente
sinónimo de construção de diagramas. Os diagramas,
simplesmente, não conseguem expressar toda a informação
necessária a uma especificação completa [
            <xref ref-type="bibr" rid="ref19">19</xref>
            ]. Por exemplo,
no diagrama de classes ilustrado na figura 5, podíamos
concluir que o número de passageiros de um cacilheiro
seria ilimitado. Obviamente que essa conclusão não é
verdadeira, mas não conseguimos expressar no diagrama que o
número de passageiros está limitado ao número de lugares
disponíveis no cacilheiro. Contudo, tal limitação pode ser
expressa com recurso a uma invariante no contexto da
classe Viagem, expresso em OCL da seguinte forma:
Exemplo em OCL para expressar a restrição de multiplicidade da
classe Viagem.
          </p>
          <p>Context Viagem</p>
          <p>inv:passageiros-&gt;size() &lt;= cacilhero.numeroDeLugares
Em virtude do exposto anteriormente surge a necessidade
da integração do OCL, uma linguagem formal (sem a
complexidade das tradicionais linguagens formais), no UML
uma linguagem de modelação. Além disso expressões
formais, dada a sua base matemática, não dão azo a
interpretações ambíguas e podem ser verificadas automaticamente
por ferramentas. Além de utilizar uma notação similar às
linguagens de programação orientadas pelos objectos, é
uma linguagem de expressões pura. Mais, as expressões em</p>
        </sec>
        <sec id="sec-2-2-2">
          <title>OCL não têm efeitos colaterais, ou seja, não conseguem</title>
          <p>alterar o estado do sistema, embora possam referenciá-lo.</p>
        </sec>
        <sec id="sec-2-2-3">
          <title>O OCL pode ser utilizado para os seguinte propósitos</title>
          <p>
            [
            <xref ref-type="bibr" rid="ref21">21</xref>
            ]:
          </p>
        </sec>
        <sec id="sec-2-2-4">
          <title>1. especificar invariantes em classes e tipos no modelo de</title>
          <p>classes;</p>
        </sec>
        <sec id="sec-2-2-5">
          <title>2. descrever pré e pós -condições nas operações;</title>
        </sec>
        <sec id="sec-2-2-6">
          <title>3. especificar a semântica de operações do tipo selector.</title>
        </sec>
        <sec id="sec-2-2-7">
          <title>A utilização de asserções, formalizadas através do OCL,</title>
          <p>permite-nos expressar os conceitos do DpC na fase de
análise e desenho, utilizando ferramentas de modelação em</p>
        </sec>
        <sec id="sec-2-2-8">
          <title>UML que tenham suporte OCL.</title>
          <p>3</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>AS FERRAMENTAS : UM ESTUDO COMPARATIVO</title>
      <sec id="sec-3-1">
        <title>Esta secção consiste na análise de uma série de ferramentas</title>
        <p>cujas características possam sustentar a ponte entre a
modelação com UML e OCL e a correspondente implementação
de código Java com PpC, bem como na eleição daquela ou
daquelas que permitam alcançar esse objectivo originando
um produto final com mais qualidade.</p>
        <p>Assim sendo, para estabelecer essa ponte, uma
ferramenta ou a utilização conjunta de várias, terão de assegurar três
aspectos essenciais:</p>
      </sec>
      <sec id="sec-3-2">
        <title>1. a modelação com UML e OCL;</title>
      </sec>
      <sec id="sec-3-3">
        <title>2. a geração de código Java a partir de UML com cláusu</title>
        <p>las de OCL;</p>
      </sec>
      <sec id="sec-3-4">
        <title>3. a implementação de PpC em Java a partir das restrições definidas com OCL.</title>
      </sec>
      <sec id="sec-3-5">
        <title>As ferramentas foram seleccionadas para análise neste</title>
        <p>artigo, com base na possibilidade de, à custa das
características que apresentam, viabilizarem todos ou apenas alguns
dos aspectos mencionados anteriormente, bem como a sua
representatividade no segmento de mercado em que se
inserem .</p>
        <p>
          A tabela 2 contém a descrição abreviada de cada uma
das ferramentas seleccionadas. Para comparar as várias
ferramentas, foram identificadas e analisadas as
características que podem conferir sustentabilidade ao processo
pretendido. A tabela 3 apresenta para cada uma das
ferramentas seleccionadas a presença total (S) ou parcial (P) e
ausência (N) de cada uma dessas características.
Poseidon [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ]
        </p>
        <p>Ferramenta de análise e desenho em UML com suporte para OCL.</p>
        <p>Ferramenta de implementação de DpC para Java. Traduz um ficheiro .jass ou .Java com as asserções
especificadas em Javadoc para um ficheiro .java. Este ficheiro deverá por sua vez ser compilado com o compilador de Java
tradicional.</p>
        <p>Ferramenta de implementação de DpC para Java. Os contratos são escritos como métodos Java normais
seguindo uma convenção de nomes intuit iva.</p>
        <p>Compilador de Java com cláusulas de OCL. Partindo da fonte com as cláusulas OCL escritas em Javadoc, produz
código Java adequado à sua implementação que introduz em cada classe.</p>
        <p>Ferramenta de implementação de DpC para Java. As asserções são descritas à custas de etiquetas especiais em
Javadoc e posteriormente são pré-processadas e compiladas num processo único. Para a compilação recorre ao
compilador nativo da JVM (Java Virtual Machine).</p>
        <p>Plugin do Eclipse que permite fazer a análise e o desenho em UML, implementar asserções com OCL, verificação
de sintaxe de OCL e geração automática de código Java com adição de código de suporte às asserções.
Ferramenta de análise e desenho em UML, com suporte a OCL e verificação de sintaxe e geração de código Java
com adição de código de suporte às asserções.</p>
        <p>Ferramenta de implementação de DpC com OCL em aspect-oriented programming (AspectJ). Recebe um ficheiro
XMI ou a fonte com as cláusulas de OCL implementadas em Javadoc e gera o código Java e os aspectos
necessários.</p>
        <p>TABELA 3
PRINCIPAIS CARACTERÍSTICAS DAS FERRAMENTAS SELECCIONADAS</p>
        <p>Características
s
a
t
n
e
m
a
r
r
e</p>
        <p>F
ArgoUML
Poseidon
MagicDraw
Sparx
Enterprise Architect
jmsAssert
iContract
Jass
jContractor
Dresden OCL
Toolkit
jContract
Octopus
OCLe
OCL2j</p>
        <p>S
S
S
S
N
N
N
N
N
N
S
S
N</p>
        <p>L
M
U
m
o
c
o
ã
ç
a
l
e
d
o
M
4
C
p</p>
        <p>D
S
S
S
S
N
P8
P9
N
S
N
S
S
S</p>
        <p>P
N
S
N
N
P
P
N
S
N
S
S
S
e
x
a
t
n
i
s
o L
çã C
a O
c
i
f
i
r
e
V
5g
n
i
r
e
e
n
i
g
n
E
d
r
a
w
r
o</p>
        <p>F
S
S
S
S
N
N
N
N
N
N
S
S
S</p>
        <p>S
S
S
S
S
S
6
C
p
P
7o
t
n
e
m
a
s
s
e
c
o
r
p
é
r
P
o
ã
ç
a
l
i
p
m
o
C
s
e
t
s
e</p>
        <p>T
N
N
N
N
S
S
S
S
S
N
N
N
N</p>
        <p>N
N
N
N
N
N
N
N
S
S
N
N
N</p>
        <p>N
N
N
N
N
N
N
N
N
N
N
N
N
s
e
õ
ç
a
v
r
e
s
b</p>
        <p>O
Não inclui OCL na fonte gerada.</p>
        <p>Não inclui OCL na fonte gerada.</p>
        <p>Características baseadas apenas na
informação dos autores.</p>
        <p>Protótipo não disponível à data de
redacção.</p>
        <p>Do estudo comparativo efectuado, podemos concluir
4 Possibilidade de expressar restrições de OCL no modelo.
5 Possibilidade de gerar código Java a partir do modelo.</p>
        <p>6 Possibilidade de implementação de pré-condições, pós-condições e
invariantes na fonte.</p>
        <p>7 A fonte com as cláusulas de DpC é pré-processada, dando origem a
outra fonte que será posteriormente compilada.</p>
        <p>8 Apenas contempla: implies, forAll, exists.
9 Apenas contempla: forAll, exists.
que as funcionalidades apresentadas pelas
ferramentasanalisadas podem constituir três grandes grupos. Um primeiro
grupo (Grupo 1) com as funcionalidades relacionadas com
a modelação UML e especificação de cláusulas OCL. Um
segundo grupo (Grupo 2) com as funcionalidades
relacionadas com a produção ou utilização de código fonte Java,
com as cláusulas de OCL de algum modo aí introduzidas.</p>
      </sec>
      <sec id="sec-3-6">
        <title>E, finalmente, um terceiro grupo (Grupo 3) com o conjunto</title>
        <p>das funcionalidades relacionadas com a produção do
código Java executável. A tabela 4 apresenta as ferramentas
analisadas e os grupos de funcionalidades onde se inserem.</p>
      </sec>
      <sec id="sec-3-7">
        <title>Quanto às ferramentas que implementam funcionalida</title>
        <p>des no âmbito do primeiro grupo, importa referir que as
distinções existem essencialmente entre o suporte de OCL e
com que extensão, a verificação da sintaxe de OCL, e a
validação das asserções contra o modelo UML existente.</p>
      </sec>
      <sec id="sec-3-8">
        <title>Para implementar as funcionalidades descritas no segundo grupo, as ferramentas adoptam essencialmente três metodologias distintas. Existem ferramentas que produzem ou</title>
        <p>TABELA 4
DISTRIBUIÇÃO DAS FERRAMENTAS PELOS GRUPOS DE
FUN</p>
        <p>CIONALIDADES DEFINIDOS
Grupo 1</p>
        <p>Grupo 2</p>
        <p>Grupo 3
utilizam código Java com as cláusulas de OCL embebidas
em Javadoc. Existem outras que produzem ou utilizam
código Java, com as cláusulas de OCL implementadas também
em Java, dentro das classes a que dizem respeito. E existem
ainda outras ferramentas, que produzem ou utilizam
código Java, sendo as cláusulas de OCL implementadas à parte,
sob a forma de scripts ou aspectos.</p>
        <p>No que diz respeito às ferramentas que implementam as
funcionalidades do terceiro grupo, estas distinguem-se
entre as que recorrem ao compilador tradicional de Java, as
que recorrem ao compilador tradicional de Java
adicionando-lhe parâmetros de compilação extraordinários, as que
recorrem a compiladores próprios e as que recorrem a
compiladores de aspectos.</p>
        <p>De todas as ferramentas analisadas, poderíamos escolher
apenas uma ou a combinação de várias para concretizar os
objectivos pretendidos. No entanto, esta última opção
levantaria algumas questões de compatibilidade entre as
ferramentas a utilizar. Como o OCLe é a única ferramenta
disponível que contempla todas as funcionalidades
necessárias a este processo, mereceu de imediato a nossa atenção,
sendo as restantes relegadas para segundo plano. Mesmo
colocando de lado as questões de compatibilidade
mencionadas anteriormente, o facto de se trabalhar numa única
ferramenta é menos propício a falhas no processo de
transição do desenho para a implementação, para além de
implicar uma curva de aprendizagem significativamente menor.
Além disso, o OCLe é a única ferramenta que valida as
asserções contra o modelo UML, para além da comum
validação sintáctica. Mais, já contempla o OCL 2.0 e gera
automaticamente código Java correspondente às asserções
especificadas, implementado quase na totalidade o OCL. Pelas
razões anteriormente indicadas, o OCLe afigura-se como a
alternativa tecnológica que nos assegurará maior qualidade
no produto final, pelo que é a ferramenta eleita para
implementar o caso de estudo.
4</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>CASO DE ESTUDO</title>
      <p>A demonstração do processo, que nos leva da modelação
em UML já com suporte ao DpC com OCL, passou pela
utilização do modelo “Viagem Cacilheiro” cujo diagrama
de classes está representado na figura 6. Para este fim,
utilizámos a ferramenta eleita - OCLe - a partir do estudo
comparativo efectuado na secção anterior.</p>
      <sec id="sec-4-1">
        <title>4.1 Modelação do Sistema “Viagens Cacilheiro”</title>
        <sec id="sec-4-1-1">
          <title>O primeiro passo foi desenhar o diagrama de classes utilizando as funcionalidade de modelação disponíveis no OCLe.</title>
        </sec>
      </sec>
      <sec id="sec-4-2">
        <title>4.2 Introdução das Cláusulas do Contrato</title>
        <sec id="sec-4-2-1">
          <title>Introduzimos no modelo algumas asserções em OCL e validámos a sua sintaxe contra o modelo produzido. Para exemplificar escolhemos a classe Viagem.</title>
          <p>Expressões em OCL implementadas.
context Viagem::novoPassageiro(p:Passageiro)
- - um passageiro só pode fazer uma viagem de cada vez.
pre passageiroNaoExiste:
not( self.passageiro -&gt;includes(p) )
- - o numero de passageiros é incrementado.
post numeroPassageiros:
self.passageiro -&gt;size() = self.passageiro -&gt;size@pre + 1
context Viagem
- - o numero de passageiros de uma viagem não pode ser exceder o numero de
lugares disponíveis do cacilheiro.
inv numeroPassageirosPorViagem:
self.passageiro -&gt;size() &lt;= self.cacilheiro.numeroLugares
- - Cada viagem tem um número único.
inv uniqueViagem:
Viagem.allInstances-&gt;forAll( c1,c2:Viagem |</p>
          <p>c1&lt;&gt;c2 implies c1.nrViagem&lt;&gt;c2.nrViagem)</p>
        </sec>
        <sec id="sec-4-2-2">
          <title>No OCLe as expressões foram objecto de verificação de sintaxe e verificadas automaticamente contra o diagrama de classes desenhado para o efeito.</title>
        </sec>
      </sec>
      <sec id="sec-4-3">
        <title>4.3 Geração do Código em Java</title>
        <sec id="sec-4-3-1">
          <title>Depois do desenho em UML e especificação em OCL das</title>
          <p>restrições no OCLe, é chegada a fase de gerar o código Java
adequado. O OCLe gera código Java que implementa
simultaneamente a interface das classes e as cláusulas de OCL,
dentro de cada classe, no aplicável.</p>
        </sec>
        <sec id="sec-4-3-2">
          <title>O processo é muito simples, bastando apenas dar a indi</title>
          <p>cação à ferramenta da acção pretendida. Antes de gerar o
código Java, a ferramenta procede sempre à análise da
sintaxe do OCL e à validação das restrições introduzidas,
contra o modelo especificado no diagrama de classes. O código</p>
        </sec>
        <sec id="sec-4-3-3">
          <title>Java gerado automaticamente pelo OCLe para implementar</title>
          <p>as asserções correspondentes às expressões OCL definidas
no ponto anterior encontra -se em apêndice.</p>
        </sec>
        <sec id="sec-4-3-4">
          <title>O código gerado é claro e bem estruturado, fazendo apenas referência a algumas classes de uma framework desenvolvidas especificamente para esta temática. Apesar de todas as mais-valias desta ferramenta, não podemos dei</title>
          <p>
            xar de realçar a quantidade de código que é acrescentado a sulamento destes aquando do forward engineering.
cada classe, unicamente para implementar o DpC com O código Java gerado pelo OCLe para suportar o DpC é
OCL. O OCLe não suporta alguns dos mecanismos do DpC, muito extenso, constituindo factor de preocupação quanto
sendo exemplo disso a não implementação de restrições à manutenção. Esta preocupação é devida ao
emaranhacom carácter temporal (utilização do xpto@pre). Além disso, mento entre o código de suporte às asserções e o código
esta implementação de DpC contrasta com a do Eiffel, na de suporte às funcionalidades que é implementado em
qual as asserções podem ser inibidas ao critério do progra- conjunto dentro da mesma classe. Actualmente estão a ser
mador. Na implementação do OCLe passam a fazer parte desenvolvidas soluções com aspectos [
            <xref ref-type="bibr" rid="ref23">23</xref>
            ], [
            <xref ref-type="bibr" rid="ref24">24</xref>
            ], o que
do código da classe perdendo essa possibilidade. previsivelmente mitigará esta problemática. No entanto,
como é sabido, os aspectos introduzem actualmente um
grande overhead e consequente perda de desempenho,
5 CONCLUSÕES E FUTURO pelo que a evolução para esta tecnologia não só não
resolHoje em dia, a maioria das organizações têm como prin- verá todos os problemas existentes, como ainda agravará
cipais objectivos alcançar um nível elevado de qualidade outros. Apesar de tudo, cremos que as soluções
implenos seus produtos e/ou serviços. Não é mais aceitável mentadas com aspectos irão vingar, dada a sua
modulafornecer produtos com má qualidade aos clientes e pos- ridade, e que pouco a pouco os problemas de
desempeteriormente tentar reparar os problemas ou defeitos que nho irão sendo atenuados, quer com a evolução do
harddaí podem ocorrer. Neste aspecto, os produtos de softwa- ware, quer com a evolução desta técnica. Todavia, não se
re têm que ser regidos pelo mesmo padrão de qualidade conhecem implementações ou projectos de ferramentas
como quaisquer outros produtos, tais como automóveis, que recorram ao emprego das asserções nativas da
lincomputadores, relógios ou casas. No entanto, assumi- guagem Java, talvez devido ao facto de estas terem sido
mos que a qualidade no software é sem dúvida um con- introduzidas muito recentemente (finais 2003 [
            <xref ref-type="bibr" rid="ref32">32</xref>
            ]).
Apeceito complexo que não se pode definir de uma maneira sar de as asserções nativas de Java não implementarem o
simplista. De qualquer forma, existem presentemente DpC tal como foi concebido, designadamente os
invariantécnicas, como o DpC, que conseguem garantir aos pro- tes que são implementados de forma indirecta (é
chamadutos de software um nível de qualidade já muito próxi- do um método no final de todos os métodos da classe)
mo daquele que é vigente a outros produtos de áreas da [
            <xref ref-type="bibr" rid="ref32">32</xref>
            ]. Estas asserções poderão constituir uma alternativa
engenharia. séria à implementação de DpC com aspectos.
          </p>
          <p>Já existe alguma variedade de ferramentas que supor- Como foi já referido o OCLe não suporta ainda, na sua
tam o DpC. No entanto, atendendo à importância que o totalidade o DpC, sendo exemplos disso a não compilação
OCL vai assumindo na modelação, aquelas que não o de asserções que recorrem ao estado anterior do objecto
suportam irão previsivelmente começar a ser postas de (xpto@pre) e não permitir a inibição das asserções. Além
lado pelos utilizadores. disso o OCLe não faz reverse engineering, pelo que
qual</p>
          <p>Havendo uma série de ferramentas que introduzem quer alteração no desenho originará novo código. Apesar
as cláusulas de DpC em etiquetas de Javadoc, lamenta-se de tudo é uma ferramenta bastante completa e a única
a inexistência de uma norma, ou pelo menos de uma capaz de sustentar o desenvolvimento de software com
prática comum, quanto à sintaxe utilizada na declaração DpC e OCL ao longo de todo o ciclo de vida, bem como,
das asserções, constatando-se que cada ferramenta utili- das ferramentas apreciadas, a única que valida as
cláusuza um formato próprio. Este facto, para além de obrigar las de OCL introduzidas contra o modelo desenhado.
a uma aprendizagem das etiquetas específicas da ferra- Apesar das vantagens evidentes trazidas pela
utilizamenta com que se está a trabalhar, impede a comple- ção do DpC e do OCL à qualidade do software produzido,
mentaridade entre as ferramentas que abrangem apenas não podemos ignorar o compromisso que lhe está
assopartes do ciclo de vida, pois o resultado de uma não ciado – o desempenho.
pode ser reutilizado por outra. Existem presentemente actividades de investigação no</p>
          <p>
            O OCLe mostrou ser uma ferramenta bastante eficaz, sentido de implementar DpC à custa de notações gráficas
não obstante o facto de se mostrar pouco conforme no que [
            <xref ref-type="bibr" rid="ref28">28</xref>
            ], favorecendo deste modo uma melhor integração com
diz respeito às funcionalidades apresentadas, quando a habitual representação diagramática do UML.
comparada com outras ferramentas de modelação com Seria desejável que as ferramentas que implementam
UML, sendo exemplo disso a forma de se desenhar uma OCL evoluíssem no sentido da geração automática de
relação de composição. Em algumas (poucas) circunstân- testes, com base nas asserções.
cias, as mensagens de erro apresentadas resultantes da Em resumo, o DpC com OCL e a sua implementação
compilação do OCL são pouco elucidativas do problema na linguagem Java com PpC são actualmente uma
realiexistente, valendo no entanto ao utilizador o rigor com dade, existindo ferramentas capazes de acompanhar o
que o posicionamento do erro é indicado. Na modelação processo de desenvolvimento ao longo de todo o ciclo de
com o OCLe, os atributos das classes são criados como vida, ainda que com algumas limitações. No entanto, os
protected por omissão. Isto levanta problemas ao utilizador desenvolvimentos verificados nesta área indiciam que
menos atento dado que, quando implementa as cláusulas este será o caminho certo, estando reunidas mais um
conde OCL a compilação gera erros de visibilidade. Julgamos junto de condições, que permitirão a produção de software
que os atributos das classes deviam ser criados como com cada vez mais qualidade, nomeadamente no que diz
public por omissão, desde que fosse assegurada o encap- respeito ao rigor e robustez daí resultantes.
/*
* @(#)Viagem.Java
*Generated by &lt;a href="http://lci.cs.ubbcluj.ro/ocle/&gt;OCLE 2.0&lt;/a&gt;
* using &lt;a href="http://jakarta.apache.org/velocity/"&gt;
* Velocity Template Engine 1.3rc1&lt;/a&gt;
*/
import Java.util.Iterator;
import Java.util.LinkedHashSet;
import Java.util.Set;
import ro.ubbcluj.lci.codegen.framework.ocl.BasicConstraintChecker;
import ro.ubbcluj.lci.codegen.framework.ocl.CollectionUtilities;
import ro.ubbcluj.lci.codegen.framework.ocl.Ocl;
import ro.ubbcluj.lci.codegen.framework.ocl.OclType;
/** @author unascribed*/
public class Viagem
{
public int lugaresDisponiveis() { return 0; }
public void novoPassageiro(Passageiro p)
{
class ConstraintChecker
{
public void checkPreconditions(Passageiro p) {
check_passageiroNaoExiste(p);
}
public void checkPostconditions(Passageiro p) {
check_numeroPassageiros(p);
}
}
}
}
          </p>
          <p>}
public void check_passageiroNaoExiste(Passageiro p)
{
Set setPassageiro = Viagem.this.getPassageiro();
boolean bIncludes = CollectionUtilities.includes( setPassageiro,</p>
          <p>p);
boolean bNot = !bIncludes;
if (!bNot) {
System.err.println("precondition 'passageiroNaoExiste'</p>
          <p>failed for object "+Viagem.this);
public void check_numeroPassageiros(Passageiro p)
{
Set setPassageiro = Viagem.this.getPassageiro();
int nSize = CollectionUtilities.size(setPassageiro);
Set setPassageiro0 = Viagem.this.getPassageiro();
int nSize0 = CollectionUtilities.size(setPassageiro0);
int nPlus = nSize0 + 1;
boolean bEquals = nSize == nPlus;
if (!bEquals) {
System.err.println("postcondition 'numeroPassageiros' failed</p>
          <p>for object "+Viagem.this);
}
ConstraintChecker checker = new ConstraintChecker();
checker.checkPreconditions(p);
checker.result = internal_novoPassageiro(p);
checker.checkPostconditions(p);
return checker.result;
}
}
}
}
}
}
}
}
}
}
}
public final Cacilheiro getCacilheiro() { return cacilheiro; }
public final void setCacilheiro(Cacilheiro arg)
{
if (cacilheiro != arg) {
Cacilheiro temp = cacilheiro;
cacilheiro = null;//to avoid infinite recursions
if (temp != null) {
temp.removeViagem(this);
}
if (arg != null) {
cacilheiro = arg;
arg.addViagem(this);
public final Set getPassageiro()
{
if (passageiro == null) {
return Java.util.Collections.EMPTY_SET;
}
return Java.util.Collections.unmodifiableSet(passageiro);
public final void addPassageiro(Passageiro arg)
{
if (arg != null) {
if (passageiro == null) passageiro = new LinkedHashSet();
if (passageiro.add(arg)) {
arg.addViagem(this);
public final void removePassageiro(Passageiro arg)
{
if (passageiro != null &amp;&amp; arg != null) {
if (passageiro.remove(arg)) {
arg.removeViagem(this);
}
private void internal_novoPassageiro(Passageiro p) { }
public Viagem() { }
public class ConstraintChecker extends BasicConstraintChecker
{
public void checkConstraints()
{
super.checkConstraints();
check_Viagem_numeroPassageirosPorViagem();
check_Viagem_uniqueViagem();
public void check_Viagem_numeroPassageirosPorViagem()
{
Set setPassageiro = Viagem.this.getPassageiro();
int nSize = CollectionUtilities.size(setPassageiro);
Cacilheiro cacilheiroCacilheiro = Viagem.this.getCacilheiro();
int nNumeroLugares = cacilheiroCacilheiro.numeroLugares;
boolean bLessOrEqual = nSize &lt;= nNumeroLugares;
if (!bLessOrEqual) {
System.err.println("invariant 'numeroPassageirosPorViagem'</p>
          <p>failed for object "+Viagem.this);
public void check_Viagem_uniqueViagem()
{
Set setAllInstances = Ocl.getType(</p>
          <p>new Class[]{Viagem.class}).allInstances();
//evaluate 'forAll(c1,c2:Viagem|c1&lt;&gt;c2 implies
//c1.nrViagem&lt;&gt;c2.nrViagem)':
boolean bForAll = true;
final Iterator iter = setAllInstances.iterator();
while (bForAll &amp;&amp; iter.hasNext()) {
final Viagem c1 = (Viagem)iter.next();
final Iterator iter0 = setAllInstances.iterator();
while (bForAll &amp;&amp; iter0.hasNext()) {
final Viagem c2 = (Viagem)iter0.next();
boolean bNotEquals = !c1.equals(c2);
int nNrViagem = c1.nrViagem;
int nNrViagem0 = c2.nrViagem;
boolean bNotEquals0 = nNrViagem != nNrViagem0;
boolean bImplies = !bNotEquals || bNotEquals0;
bForAll = bImplies;
}
if (!bForAll) {
System.err.println("invariant 'uniqueViagem'</p>
          <p>failed for object "+Viagem.this);
public int nrViagem;
public Cacilheiro cacilheiro;
public Set passageiro;
{</p>
          <p>OclType.registerInstance(this, Viagem.class);
}</p>
          <p>}</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>REFERÊNCIAS</title>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1] Meyer, Bertrand,
          <string-name>
            <surname>Object-Oriented Software Construction - Second Edition</surname>
          </string-name>
          ,
          <string-name>
            <surname>Prentice Hall</surname>
            <given-names>PTR</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Santa</surname>
            <given-names>Barbara</given-names>
          </string-name>
          , California,
          <string-name>
            <surname>EUA</surname>
          </string-name>
          , (
          <year>1997</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <surname>Guerreiro</surname>
            ,
            <given-names>Pedro,</given-names>
          </string-name>
          <article-title>An Introduction to Eiffel and Design by Contract</article-title>
          , Universidade Nova de Lisboa, Faculdade de Ciências e Tecnologia, Bielko-Biala, Poland, (
          <year>2002</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <surname>Bacvanski</surname>
          </string-name>
          , Vladimir, Graff, Petter, Design by Contract in Java, InferData Corporation, (
          <year>1999</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <surname>Pender</surname>
            , Tom, UML Bible, Wiley Publishing Inc., Indianapolis, Indiana,
            <given-names>EUA</given-names>
          </string-name>
          , (
          <year>2003</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>Warmer</given-names>
            <surname>Jos</surname>
          </string-name>
          , Kleppe, Anneke,
          <string-name>
            <given-names>The</given-names>
            <surname>Object Constraint Language - Second Edition</surname>
          </string-name>
          , Addison-Wesley,
          <string-name>
            <surname>EUA</surname>
          </string-name>
          , (
          <year>2003</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>[6] http://argouml.tigris.org/ .</mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>[7] http://www.db.informatik.uni-bremen.de/projects/ .</mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>[8] http://www.gentleware.com/ .</mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>[9] http://jcontractor.fonteforge.net/ .</mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>[10] http://www.magicdraw.com/ .</mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>[11] http://www.sparxsystems.com.au/ .</mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>[12] http://www.mmsindia.com/JMSAssert.html .</mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>[13] http://csd.informatik.uni-oldenburg.de/~jass/ .</mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>[14] http://dresden-OCL.fonteforge.net/ .</mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15] http://www.parasoft.com/jsp/products/home.jsp?product=
          <source>Jcontract&amp;i temId=28 .</source>
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>[16] http://www.klasse.nl/OCL/octopus-intro.html .</mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>[17] http://lci.cs.ubbcluj.ro/ocle/ .</mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>[18] http://www.sce.carleton.ca/Squall/pubs/other/CUSEC2004.pdf .</mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>OMG</given-names>
            <surname>Unified Modeling Language Specification</surname>
          </string-name>
          , “
          <article-title>Chapter 6: Object Constraint Language Specification”</article-title>
          ,
          <string-name>
            <surname>OMG</surname>
          </string-name>
          , (
          <year>2001</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20] OMG,
          <string-name>
            <surname>“XML Metadata</surname>
          </string-name>
          <article-title>Interchange (XMI) Specification v1</article-title>
          .2”, Object Management Group, (
          <year>2002</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <surname>Mage</surname>
          </string-name>
          ,
          <string-name>
            <surname>Kjetil</surname>
            ,
            <given-names>A Pratical</given-names>
          </string-name>
          <article-title>Application of the Object Constraint Language OCL</article-title>
          , Agder University College, (
          <year>2002</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <surname>Briand</surname>
          </string-name>
          , Dr. Lionel,
          <source>Ensuring the Dependability of Software Systems</source>
          ,
          <string-name>
            <surname>CUSEC</surname>
          </string-name>
          , (
          <year>2004</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <surname>Richters</surname>
          </string-name>
          , Mark, Gogolla, Martin,
          <article-title>Aspect-Oriented Monitoring of UML and OCL Constraints, EADS SPACE Transportation</article-title>
          , University of Bremen, Germany.
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [24]
          <string-name>
            <surname>Briand</surname>
            ,
            <given-names>L.C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Dzidek</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Labiche</surname>
            ,
            <given-names>Y.</given-names>
          </string-name>
          ,
          <article-title>Using Aspect-Oriented Programming to Instrument OCL Contracts in Java</article-title>
          , Simula Research Laboratory, Norway, Software Quality Engineering Laboratory, Departament of Systems and Computer Engineering, Carleton University, Canada, (
          <year>2004</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <surname>Kramer</surname>
          </string-name>
          , Reto, iContract - The
          <source>Java Design by Contract Too</source>
          , Cambridge Technology Partners.
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          [26]
          <string-name>
            <surname>Wiedmann</surname>
          </string-name>
          , Markus, Buchwald, Hagen, Seese, Detlef, Design by Contract inJava - A Roadmap in Excellence to Trusted Components, University Karlsruhe, Germany,
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          [27]
          <string-name>
            <surname>Kapp</surname>
          </string-name>
          ,
          <article-title>Steve, Using iContract and Design by Contract Techniques, Embedded Real-Time Inc</article-title>
          ., (
          <year>2000</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          [28]
          <string-name>
            <surname>Kiesner</surname>
          </string-name>
          , Chritiane, Taentzer, Gabriele, Winkelmann, Jessica,
          <string-name>
            <surname>Visual</surname>
            <given-names>OCL</given-names>
          </string-name>
          ,
          <article-title>A Visual Notation of the Object Constraint Language</article-title>
          ,
          <string-name>
            <surname>Fakultät</surname>
            <given-names>IV</given-names>
          </string-name>
          - Elektrotechnik und Informatik, (
          <year>2002</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref29">
        <mixed-citation>
          [29]
          <string-name>
            <surname>Verheecke</surname>
          </string-name>
          ,
          <article-title>Bart,From Declarative Constraints in Conceptual Models to Explicit Constraint Classes in Implementation Models, Departement Informatica</article-title>
          , Faculteit van de Wetenschappen, Vrije Universiteit Brussel, (
          <year>2001</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref30">
        <mixed-citation>
          [30]
          <string-name>
            <surname>Liskov</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wing</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <source>A Behavioural Notion of Subtyping, ACM Transactions on Programming Languages and Systems</source>
          ,
          <volume>16</volume>
          (
          <issue>6</issue>
          ), pp.
          <fpage>1811</fpage>
          -
          <lpage>1841</lpage>
          , (
          <year>1994</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref31">
        <mixed-citation>
          [31]
          <string-name>
            <given-names>J.S.</given-names>
            <surname>Bridle</surname>
          </string-name>
          ,
          <article-title>Probabilistic Interpretation of Feedforward Classification Network Outputs, with Relationships to Statistical Pattern Recognition, Neurocomputing-Algorithms, Architectures and</article-title>
          <string-name>
            <surname>Applications</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          <article-title>Fogelman-Soulie and</article-title>
          J. Herault, eds.,
          <source>NATO ASI Series F68</source>
          , Berlin: Springer-Verlag, pp.
          <fpage>227</fpage>
          -
          <lpage>236</lpage>
          ,
          <year>1989</year>
          .
          <article-title>(Book style with paper title</article-title>
          and editor) .
        </mixed-citation>
      </ref>
      <ref id="ref32">
        <mixed-citation>[32] http://www.sun.com .</mixed-citation>
      </ref>
      <ref id="ref33">
        <mixed-citation>
          <string-name>
            <given-names>Ricardo</given-names>
            <surname>Alves</surname>
          </string-name>
          <article-title>Mestrando em Eng</article-title>
          .
          <source>Informática</source>
          (
          <year>2003</year>
          /05) pela Faculdade de Ciências e
          <article-title>Tecnologia (FCT) da Universidade Nova Lisboa (UNL); Licenciado em Eng</article-title>
          .
          <source>Informática</source>
          (
          <year>1995</year>
          /
          <year>1997</year>
          ) pela FCT/UNL; Bacharel em Eng. Electrónica e Telecomunicações (
          <year>1991</year>
          /
          <year>1994</year>
          ) pelo Instituto
          <string-name>
            <surname>Superior de Engenharia de Lisboa (ISEL); Director de Tecnologias e Sistemas de Informação de Portugal e</surname>
          </string-name>
          <article-title>Itália da Amcor Flexibles; Membro da Ordem dos Engenheiros</article-title>
          .
        </mixed-citation>
      </ref>
      <ref id="ref34">
        <mixed-citation>
          <string-name>
            <given-names>Sérgio</given-names>
            <surname>Bryton Mestrando Eng. Informática</surname>
          </string-name>
          (
          <year>2003</year>
          /05) pela Faculdade de Ciências e
          <article-title>Tecnologia (FCT) da Universidade Nova Lisboa (UNL); Microsoft Certified Solution Developer (</article-title>
          <year>2002</year>
          );
          <article-title>Especialização em Informática (</article-title>
          <year>2000</year>
          /
          <year>2001</year>
          ) pelo Centro de Formação de Informática da Direcção de Tecnologias de Informação e
          <article-title>Comunicação (DITIC) da Marinha Portuguesa; Licenciado em Ciências Militares Navais (</article-title>
          <year>1990</year>
          /
          <year>1995</year>
          ) pela Escola Naval; Coordenador de uma Área Tecnológica com competências de Análise e Desenvolvimento de Sistemas de Informação na DITIC.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>