Beruflich Dokumente
Kultur Dokumente
DE SISTEMAS CONFIÁVEIS
Resumo: A interação homem-máquina gera cada vez mais o anseio por sistemas confiáveis e
acessíveis. Sendo assim, sabemos que proteger informação é um desejo inerente de qualquer
ser humano. Através disso, vale ressaltar que o gasto com tempo e dinheiro será excessivo
para que o desejo almejado seja alcançado. O presente projeto tem como intuito demonstrar
de forma prática através do desenvolvimento de classes, o uso da linguagem Java Modeling
Language(JML), onde, JML trabalha com contratos e, usa a teoria projeto por contrato
(Design by contract) pra gerar afirmações que visa tornar os sistemas mais confiáveis.
Desenvolvida primeiramente para a linguagem Eiffel, a metodologia de projeto por contrato
surge como uma forma eficaz para a área de desenvolvimento de sistemas pois ao longo dos
anos, uma das principais metas daqueles que estão inseridos nesta área é justamente sanar a
carência de sistemas confiáveis. O fato dela se valer de contratos humanos como base, a
torna de fácil compreensão. E no caso de ter JML especificamente para a linguagem Java,
alarga o leque de opções para os programadores no que se refere ao fato de almejar softwares
robustos e protegidos . Assim, entende-se que tanto o JML e projeto por contrato tenta tornar
a vida do usuário final mais cômoda, interativa e acessível quanto tenta tornar a vida do
desenvolvedor mais produtiva e do sistema mais confiável.
Abstract: Man-machine interaction increasingly generates the yearning for reliable and
accessible systems. Therefore, we know that protecting information is an inherent desire of
any human being. Through this, it is worth emphasizing that spending time and money will be
excessive so that the desired goal is achieved. The purpose of this project is to demonstrate in
a practical way through the development of classes, the use of the Java Modeling Language
(JML) language, where JML works with contracts and uses the contract-by-contract theory
(Design by contract) to generate statements that aims to make systems more reliable.
¹Mestranda em Tecnologia Informática pela Universidad Abierta Interamericana - UAI - Buenos aires -
Argentina. decassiah@gmail.com
Developed primarily for the Eiffel language, contract-based design methodology emerges as
an effective way for systems development since, over the years, one of the main goals of those
in this area is precisely to remedy the lack of reliable systems. The fact that it uses human
contracts as a basis makes it easy to understand. And in the case of having JML specifically
for the Java language, it widens the range of options for programmers with regard to crafting
robust and protected software. Thus, it is understood that both JML and contract-based
design tries to make the end-user life more comfortable, interactive, and accessible as it tries
to make the developer's life more productive and system more reliable.
INTRODUÇÃO
Pensando nisso, este projeto tem como intuito de apresentar temas que abordará o uso de
tecnologias que ajudarão de forma considerável na melhoria da confiabilidade e qualidade do
software. Serão usadas as técnicas de Design by contract (DBC) ou Projeto por Contrato, em
português, que tem como idéia principal fazer com que as classes e seus clientes tenham um
contrato entre si. (NETO, 2007). A ideia central por trás das técnicas DBC está intimamente
ligada às necessidades de se desenvolver aplicações seguras e que atendam às exigências do
usuário. Assim, os contratos que são a base central dessa teoria que define prés e
pós-condições onde podem ser chamadas de benefícios mútuos, bem como invariantes que
são as restrições. Tal técnica visa uma construção de sistemas mais confiáveis, reduzindo
assim, importunos como, bugs e software mal implementado. Será apresentada a linguagem
JML (Java Modeling Language), pois é uma linguagem de especificação comportamental de
tipos (classes e interfaces), que tem como intuito facilitar a vida de programadores em Java.
Ela combina a praticidade da linguagem Projeto por Contrato Eiffel (MEYER, 1992) com a
robustez do Java. Seu foco são as pré e pós-condições para os métodos e as invariantes para
as classes.
O precursor da teoria de Design by Contract (Projeto por Contrato) afirma que um sistema de
software é visto como um conjunto que comunica componentes cuja interação é baseada em
especificações bem definidas e obrigações mútuas - os contratos, assim, são uma espécie de
elementos que cooperam entre si.
O princípio por trás de DBC é que uma classe e o seu cliente têm um contrato um com o
outro. Os contratos definem obrigações e benefícios mútuos (pré-condições e pós-condições,
respectivamente), além de restrições (invariante). Os contratos são definidos no código do
programa através de comentários da própria linguagem de programação e são traduzidos em
código executável pelo compilador. As propriedades (predicados) do contrato são conhecidas
como asserções (assertions). (NETO, 2007,p.38).
Ao longo dos anos pesquisadores foram implementando a teoria de projeto por contrato de
forma que novas técnicas de verificação de software confrontam os contratos com o código
do programa. Assim, é válido afirmar que o projeto por contrato e suas definições se
praticadas corretamente, ajudarão a melhorar consideravelmente no desenvolvimento de
aplicações que se tornarão mais confiáveis. Além do que, projeto por contrato torna a
documentação do software mais fácil uma vez que os contratos são estabelecidos. De acordo
com Júnior, Figueiredo e Guerreiro (JUNIOR; GUERREIRO; FIGUEIREDO, 2007, p.1457),
todos afirmam que isto se deve ao fato dos contratos serem mais abstratos do que o código, já
que estes não estabelecem nenhum algoritmo, se concentrando, portanto em expressar o que é
assumido e o que deve ser alcançado sem se preocupar em como isto deve ser feito. Assim, o
papel desempenhado pelos contratos através da documentação de software, ajuda a
compreender o funcionamento do código pela leitura dos contratos em vez da leitura do
código. O contrato serve, então, como documentação formal, sem ambiguidade, do que o
código faz. projeto por contrato torna-se uma forma de documentar software de maneira mais
elegante do que se basear apenas no entendimento do código ou dos comentários feitos no
programa. Graças a essa característica é possível construir uma série de ferramentas
automatizadas de suporte, fazendo com que essa documentação possa ser mantida e atualizada
sempre.
Uma vantagem de se utilizar projeto por contrato é o fato dessa técnica facilitar a depuração
do código. Com o uso dessa técnica, fica fácil localizar a causa de um possível mau
funcionamento do software. Caso a violação de um contrato for na pré-condição de um
determinado método, fica claro que o problema está localizado no código que o invocou.
Porém , se a violação se localiza na pós-condição de um método, fica claro que o problema
está na implementação deste método que não conseguiu garantir o contrato durante sua
execução. (JÚNIOR, 2006, p.18)
Para exemplificar o que foi falado, na tabela a seguir, nos valeremos de um exemplo de
contratos humanos para melhor definir projeto por contrato. Meyer (MEYER,1997, p.342)
afirma que talvez a característica mais distintiva dos contratos em que elas ocorrem nos
assuntos humanos é que qualquer bom contrato implica obrigações, bem como benefícios
para ambas as partes - a obrigação de um geralmente se transformando em um benefício para
o outro. Isto também é verdade no caso de contratos entre as classes. Veja a figura a seguir:
Esta linguagem foi projetada para ser usada em conjunto com uma variedade de ferramentas.
Essas por sua vez, suportam projeto por contrato, checagem em tempo de execução,
descoberta de invariante, verificação estática e verificação formal, que usa provadores de
teoremas.(NETO, 2007,p.17). Além disso, JML incorpora várias características e conceitos da
abordagem de especificações orientadas a modelo (model-oriented) como: Z e Larch. Por fim
JML provê também algumas idéias do cálculo de refinamentos (JÚNIOR, 2006). Segundo
Cheon e Leavens (CHEON; LEAVENS, 2006, p.2) projeto por contrato é melhor do que
apenas para a documentação de código; e é ainda melhor do que usar documentação informal,
como comentários de programa ou comentários Javadoc.
Uma especificação de contrato é mais abstrata que o código, em parte porque ele não tem que
detalhar um algoritmo, mas pode concentrar-se no que é assumido e que deve ser alcançado.
Ao contrário de comentários, uma especificação formal em JML é reconhecida pela máquina,
verifique se for capaz, e isso pode ajudar na depuração. Isto é, a verificação da especificação
pode ajudar a isolar erros antes que eles se propaguem. Além disso, como uma especificação
de JML é verificado mecanicamente, ela tem uma chance muito maior de ser mantido até à
data com respeito ao código de documentação informal.
Na versão cinco, a linguagem Java contém construções chamadas anotações que fornecem
meta dados. A linguagem de afirmação JML geralmente, nos métodos que são especificados
por ela, tem as cláusulas que são conhecidas como “@Requires e “@Ensures”. Tais
cláusulas exigem que devem ser verdadeiros antes da entrada do método. A cláusula
determina que a execução do método irá declarar se os pré-requisitos necessários são
verdadeiros.(TAYLOR, 2008)
Java Specification Request (JSR) 175 originalmente introduzido anotações em Java 5, para
tratar a crescente tendência que tem como intuito anotar campos, métodos e classes como
tendo atributos particulares que indicam que eles devem ser processados de forma especial
por ferramentas de desenvolvimento, ferramentas de implantação, ou em tempo de execução
(SUN, 2004). Projetos open source, como o Apache Tapestry5 e Hibernate, usam essas
anotações como uma alternativa para arquivos de configuração baseados em
XML(eXtensible Markup Language), assim, simplifica a configuração de um arquivos
Java simples, ao invés de tanto ter um arquivo Java e um arquivo XML. Observe a forma de
as afirmações JML. Eles devem aparecer tanto em "/*" comentários e em "@" delimitadores
para assegurar o processamento em JML.(TAYLOR, 2008). O exemplo a seguir mostra duas
formas de se escrever anotações JML.
• Verificação estática
Cheon (CHEON, 2003), definiu o verificador runtime(execução em tempo real) para JML.
Desenvolver uma estrutura para verificar código de especificação em tempo de execução é
uma tarefa que tem como objetivo apresentar sua viabilidade e eficiência quando aplicada a
programação. Para a verificação em tempo real o compilador JMLC(Java Modeling Language
Compiler) ou compilador JML, feito sob medida para JML consegue suprir as expectativas
desejadas.Já a verificação estática é feita antes da execução do programa. O adjetivo estático
enfatiza que a verificação ocorre através de uma análise estática do código. Uma importante
ferramenta de verificação estática para JML é o ESC/Java. ( LAVENS, CHEON, 2006).
Exemplo de verificação em tempo de Execução com JMLC. Veja a figura abaixo:
Para uma linguagem de especificação, da mesma forma que para uma linguagem de
programação. (FREITAS; CORNELIO, 2011)
• Jmlc- compila arquivos Java (e arquivos de especificação JML) anotados com contratos
JML;
O alvo deste projeto é desenvolver classes que implementem DBC e JML de maneira que as
ferramentas utilizadas sejam tão eficazes na prática como na teoria. Sendo assim, podemos
considerar que o ambiente foi favorável para a análise de dados como também para que
testá-los de forma que o resultado foi consistente e proveitoso. A seguir temos relatos
inerentes ao processo de desenvolvimento dessas classes.
• Modern Jass
A sintaxe JML usado neste documento difere da sintaxe JML padrão, que é normalmente
usado como comentários. Algum projeto de linguagens de contrato, como Contract4J e
Modern Jass, usa as anotações introduzidas no código Java 5, que ligam metadados textuais
para construções de código. O idealizador do Modern Jass já trabalhou para chegar a um
conjunto comum de anotações Java cinco que use Modern Jass e JML. (TAYLOR, 2008)
A maneira mais fácil e eficiente de inserir afirmação para classes de páginas JML é usando o
Modern Jass, uma vez que ele permite que as anotações sejam inseridas nas classes enquanto
se escreve em sintaxe Java normalmente.
As anotações @pure sobre os métodos getters implica que 1ele só retorna o valor solicitado e
não tem efeitos colaterais (TAYLOR, 2008). JML pode verificar a pureza e alertar o
programador se o método é realmente puro ou não. Isto impede efeitos secundários
indesejados, tais como a gravação de um banco de dados durante uma chamada para um
método getter em vez de esperar até que o programa verificou todos os valores.
Figura 11: Tela de cadastro com validação que impede o usuário inserir um registro nulo.
.
Sendo assim, o formulário saberá que o nome não poderá receber valores em branco. Assim,
acontecerá com todos os outros campos do formulário. Segundo Kristina Taylor (TAYLOR,
2008), a ferramenta Rac usada no JML ainda não tem a capacidade de escrever o seu código
de verificação de erros em Web formulários HTML (HyperText Markup Language), que
significa Linguagem de Marcação de hipertexto. No entanto, alguns frameworks web, como o
Apache Tapestry e o JFS(JavaServer Faces), utilizada neste trabalho, usam classes Java puro
para lógica formal dentro de um formulário HTML.
CONSIDERAÇÕES FINAIS
Devido a uma grande necessidade de manter as informações protegidas podemos afirmar que
a metodologia de projeto por contrato é uma ótima alternativa para quem procura tal
confiabilidade. Desde sua criação na década de 60, sua evolução foi constante. O que antes
era apenas usada pela linguagem Eiffel se estendeu à diversas linguagens como o Java que
tem na linguagem JML sua principal representante. Porém, a linguagem JML que faz uso dos
conceitos projeto por contrato ainda tem seus limites. Suas ferramentas ainda deixam a
desejar e a implementação que usa suas anotações, através de IDES começou a dar seu
primeiro salto. E mesmo assim, apenas a IDE Eclipse é favorecido com os plug-ins fornecidos
pelos desenvolvedores da linguagem. Contudo, a sua abordagem é ampla, e através de
pesquisas realizadas e por se tratar de uma tecnologia open source, várias pessoas em todo
mundo estão em busca de um melhor aprimoramento da linguagem. Espera-se que em pouco
tempo tal linguagem venha ser mais conhecida e também mais utilizada por desenvolvedores.
Assim, através dessa abordagem podemos concluir que projeto por contrato através do JML
apesar de suas limitações é uma ótima maneira de desenvolver sistemas confiáveis e através
das vastas pesquisas desenvolvidas em todo o mundo, em pouco tempo nos valeremos de uma
linguagem mais robusta no que se refere às especificações das classes.Para trabalhos futuros,
fica uma sugestão de explorar os conceito e a integração do DBC com em outras linguagens
que tem crescido no mercado como python e saber se é tão eficaz como foi para o Java.
REFERENCIAIS BIBLIOGRÁFICOS
JUNIOR, Rogério Dourado Silva ,FIGUEIREDO Jorge Cesar Abrantes de, GUERREIRO
Dalton Serey - Design by Contract com JML. 2007, XXVI Congresso da Sociedade
Brasileira de Computação - São Leopoldo/RS
LEAVENS Gary. T.,CHEON Yoonsik. Design by contract with JML. Draft, available from
jmlspecs.org , 2006.
CHEON, Y. A Runtime Assertion Checker for the Java Modeling Language. Ph.D.
thesis. Department of Computer Science, Iowa State University, April 2003.
VERZULLI, Joe. Getting started with JML: Improve your Java programs with JML
annotation. IBM DeveloperWorks article, 2003.
TAYLOR, Kristina Boysen - A specification language Projeto for the Java Modeling
Language (JML) using Java 5 annotations - Iowa/2008
SUN MICROSYSTEMS, INC. JSR 175: A metadata facility for the Java programming
language. http://jcp.org/en/jsr/detail?id=175 (Acesso 06 de março , 2018), 2004.