Projeto Final: Implementação de Design by Contract Copyright, 1997 © Dale Carnegie & Associates,...

25
Projeto Final: Projeto Final: Implementação de Design by Implementação de Design by Contract Contract Copyright, 1997 © Dale Carnegie & Associates, Inc. André Felipe ([email protected]) André Felipe ([email protected]) Marcelo Guedes ([email protected]) Marcelo Guedes ([email protected]) Patrícia Muniz ([email protected]) Patrícia Muniz ([email protected]) Vaninha Vieira ([email protected]) Vaninha Vieira ([email protected]) Recife – PE – Brasil Recife – PE – Brasil Agosto - 2004 Agosto - 2004 Disciplina: Paradigmas de Linguagem de Programação Disciplina: Paradigmas de Linguagem de Programação Prof.: Augusto Sampaio Prof.: Augusto Sampaio

Transcript of Projeto Final: Implementação de Design by Contract Copyright, 1997 © Dale Carnegie & Associates,...

Projeto Final: Implementação de Projeto Final: Implementação de Design by ContractDesign by Contract

Copyright, 1997 © Dale Carnegie & Associates, Inc.

André Felipe ([email protected])André Felipe ([email protected])Marcelo Guedes ([email protected])Marcelo Guedes ([email protected])

Patrícia Muniz ([email protected])Patrícia Muniz ([email protected])Vaninha Vieira ([email protected])Vaninha Vieira ([email protected])

Recife – PE – BrasilRecife – PE – BrasilAgosto - 2004Agosto - 2004

Disciplina: Paradigmas de Linguagem de ProgramaçãoDisciplina: Paradigmas de Linguagem de ProgramaçãoProf.: Augusto SampaioProf.: Augusto Sampaio

Design by Contract : Agosto 03, 2004 2 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Agenda

Introdução a Design by Contract (DbC) Projeto Parte I - Implementação de DbC em Funcional1 Projeto Parte II - Implementação de DbC em OO1 DbC em OO2 – Uma Discussão Conclusões

Design by Contract : Agosto 03, 2004 3 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Agenda

Introdução a Design by Contract (DbC) Projeto Parte I - Implementação de DbC em Funcional1 Projeto Parte II - Implementação de DbC em OO1 DbC em OO2 – Uma Discussão Conclusões

Design by Contract : Agosto 03, 2004 4 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Design by Contract - Introdução

Mecanismo para especificação precisa dos elementos/componentes de software, embutido na própria linguagem de programação.

Bertrand Meyer (1987) – Linguagem Eiffel Motivação:

Confiabilidade: Corretude + Robustez Estabelecer para cada elemento do software, um mecanismo de definição

precisa, do que se supõe que ele faz.

Premissas básicas: Um sistema é visto como um conjunto de componentes cuja interação é

baseada em especificações precisas, definidas por obrigações mútuas: CONTRATOS

Para o time da Eiffel Software, é um conceito tão importante quanto: Classes, Herança, Objetos, Polimorfismo, Dynamic Binding, ...

Design by Contract : Agosto 03, 2004 5 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Conceito Básico

Um Cliente, ao solicitar a um Fornecedor a execução de um Serviço, estabelece um contrato:

Em termos de elementos de software...

Serviço

(definem o contrato)

Pré-Condição Pós-Condição

CLIENTE FORNECEDOR

(deve garantir)(deve garantir) (exige)

Um Objeto,Uma Rotina

pode ser...

Um Método, Função, Procedimento, Loop, Classe

pode ser...

Design by Contract : Agosto 03, 2004 6 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Conceitos - básicos

Cláusulas: Definidas por ASSERTIONS, i.e., expressões booleanas

Cláusulas encontradas em implementações de DbC: Pré e Pós-Condições, em

Métodos de uma classe; Procedimentos; Funções

public class Set {... /** * Adds element to this set, provided element is not already in the set * * PRE: element != null && this.contains(element) == false * * POST: this.getLength() == old.getLength() + 1 && * this.contains(element) == true */ public void addElement(Object element) { ... }}

Design by Contract : Agosto 03, 2004 7 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Conceitos - básicos

Cláusulas encontradas em implementações de DbC (cont): Invariante, em Classe

Variante e Invariante, em Loop

public class Buffer {.../** INVARIANT: 0 <= in - out && in - out <= buffer.length; **/}

public boolean contains(Object o) {

for (int i = 0; i < buffer.length; i++) {

/** INVARIANT: 0 <= i && i <= buffer.length; **/

/** VARIANT: buffer.length - i **/

if (buffer[i].equals(o)) return true;

return false;

}

}

Design by Contract : Agosto 03, 2004 8 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

DbC – Benefícios e Problemas

Benefícios: Método que ajuda a especificar e documentar componentes no próprio

código. Framework efetivo para depuração, teste e de maneira mais geral,

garantia da qualidade. Abordagem sistemática para construção de software orientada a objetos e

livre de erros. Técnica para lidar com um eventual comportamento anormal de

componentes, proporcionando um mecanismo efetivo para tratamento de exceções.

Proporciona um melhor entendimento da metodologia OO, e de forma mais geral, de construção de software.

Problemas: Se usado exaustivamente, vai diminuir o desempenho do sistema.

Design by Contract : Agosto 03, 2004 9 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Implementações de DbC para Java:

• Algumas opções:

• JASS

• JML

• iContract

• Características

• Pré-compiladores para java

• Estendem DbC original com expressões

• FORALL

• EXISTS

Design by Contract : Agosto 03, 2004 10 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Agenda

Introdução a Design by Contract (DbC) Projeto Parte I - Implementação de DbC em Funcional1 Projeto Parte II - Implementação de DbC em OO1 DbC em OO2 – Uma Discussão Conclusões

Design by Contract : Agosto 03, 2004 11 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

DbC em Funcional1

Estende Linguagem Funcional1 com pré e pós-condição Corpo da função é uma expressão que pode incluir ou não definição

de pré e pós condições, obrigatoriamente juntas A aplicação da função a um argumento retorna um valor, desde que a

pré e a pós condição sejam atendidas Alteração no contexto: definição da função passa a conter suas pré e

pós condições

Design by Contract : Agosto 03, 2004 12 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

DbC em Funcional1 (cont.)

Checagem de tipos passa a incluir: verificação das expressões associadas à pré e pós condições, garantindo

que as mesmas retornem valores booleanos mapeamento do identificador "result", usado na pós condição, no tipo

retornado pela função

Aplicação da função passa a incluir: execução da expressão associada à pré condição antes da função

propriamente dita inclusão, no contexto de execução, do valor retornado pela aplicação da

função, com o identificador "result" execução da expressão associada à pós condição após a função

propriamente dita

Design by Contract : Agosto 03, 2004 13 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Agenda

Introdução a Design by Contract (DbC) Projeto Parte I - Implementação de DbC em Funcional1 Projeto Parte II - Implementação de DbC em OO1 DbC em OO2 – Uma Discussão Conclusões

Design by Contract : Agosto 03, 2004 14 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

DbC em OO1

Estende OO1 com invariante de classe, pré e pós condições de métodos

A pós-condição não possui o elemento "result", visto que os métodos em OO1 não retornam valores

Associado ao conceito de information hidding Mudanças nas definições:

Definições de classes passam a conter o invariante da classe Definições de métodos passam a conter expressões de pré e pós-

condição

Design by Contract : Agosto 03, 2004 15 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

DbC em OO1

Checagem de tipos passa a incluir: verificação das expressões associadas ao invariante, pré e pós condições,

garantindo que as mesmas retornem valores booleanos

A instanciação da classe passa a incluir: a execução da expressão associada ao invariante, após a inicialização dos

atributos do objeto

A execução de um método passa a incluir: a execução da expressão associada ao invariante, antes da pré-condição e

do corpo do método a execução da expressão associada à pré-condição, antes do corpo do

método a execução da expressão associada à pós-condição, após o corpo do

método a execução da expressão associada ao invariante, após a pós-condição e

do corpo do método

Design by Contract : Agosto 03, 2004 16 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Alterações na BNF - OO1

ExpBinaria ::= Expressao "+" Expressao | Expressao "-" Expressao | Expressao "and" Expressao | Expressao "or" Expressao | Expressao "==" Expressao | Expressao "++" Expressao

| "classe" Id "{" DecVariavel ";" "@inv" DecAssertion ";" DecProcedimento "}"

| "proc" Id "(" ListaDeclaracaoParametro ")" "{" "@pre" DecAssertion ";" Comando "}" | "proc" Id "(" ListaDeclaracaoParametro ")" "{" "@pos" DecAssertion ";" Comando "}" | "proc" Id "(" ListaDeclaracaoParametro ")" "{" "@pre" DecAssertion ";" "@pos" DecAssertion ";" Comando "}"

DecAssertion ::= Expressao | DecAssertion "," DecAssertion

| Expressao "<" Expressao | Expressao ">" Expressao | Expressao "<=" Expressao | Expressao ">=" Expressao

DecClasse ::= "classe" Id "{" DecVariavel ";" DecProcedimento "}“| DecClasse "," DecClasse

DecProcedimento ::= "proc" Id "(" ListaDeclaracaoParametro ")" "{" Comando "}“| DecProcedimento "," DecProcedimento

Design by Contract : Agosto 03, 2004 17 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Design by Contract : Agosto 03, 2004 18 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Alterações no código - Classes Criadas / Alteradas

DecAssertion DecAssertionSimples DecAssertionComposta InvarianteNaoAtendidoException PosCondicaoNaoAtendidaException PreCondicaoNaoAtendidaException

DefClasse - para que contenha a expressão do invariante DecClasseSimples - para que contenha o invariante e salve no contexto um objeto

DefClasse com a expressão do mesmo DecProcedimentoSimples - para que contenha a pré e a pós e retorne um objeto

Procedimento com as expressões dos mesmos

Procedimento - para que contenha as expressões de pré e pós New - para que execute o invariante no construtor da classe ChamadaMetodo - para que execute o invariante antes e após a chamada de

procedimento ChamadaProcedimento - para que execute a pré antes, e a pós depois do método

Design by Contract : Agosto 03, 2004 19 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Agenda

Introdução a Design by Contract (DbC) Projeto Parte I - Implementação de DbC em Funcional1 Projeto Parte II - Implementação de DbC em OO1 DbC em OO2 – Uma Discussão Conclusões

Design by Contract : Agosto 03, 2004 20 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Linguagem OO2

Estende a Linguagem OO1 com herança e subtipos Procedimentos (métodos) podem ser redefinidos O contexto também é estendido com:

uma estrutura para registrar a hierarquia de classes

Um programa é um comando

Design by Contract : Agosto 03, 2004 21 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

DbC e Herança

Deve obedecer ao princípio de herança comportamental A redefinição de um método herdado pode:

Manter ou enfraquecer a pré-condição do método original (precond_pai OR precond_filho)

Manter ou fortalecer a pós-condição do método original (precond_pai AND precond_filho)

Uma classe herdada pode manter ou fortalecer o Invariante da classe original. (Invariante_pai AND Invariante_filho)

Fortalecer uma pré-condição, ou enfraquecer a pós-condição ou invariante, seria um caso de “subcontratação desonesta” e poderia levar a desastres no comportamento do sistema.

Design by Contract : Agosto 03, 2004 22 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Agenda

Introdução a Design by Contract (DbC) Projeto Parte I - Implementação de DbC em Funcional1 Projeto Parte II - Implementação de DbC em OO1 DbC em OO2 – Uma Discussão Conclusões

Design by Contract : Agosto 03, 2004 23 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Conclusões

Implementação das linguagens se mostrou bastante robusta, facilitando a implementação do conceito de DbC tanto em Funcional1 quanto em OO1

Métodos em OO1 não retornam valor Não foi considerada a variável result no contexto de execução DbC em OO1 não pode utilizar retornos de métodos, apenas variáveis da

classe e parâmetros de métodos

O invariante não obrigatoriamente deve ser executado antes das pré-condições e do corpo dos métodos

Design by Contract : Agosto 03, 2004 24 :: 24

{afls2, msg, pmf, vvs}@cin.ufpe.br

Referências

http://www.codeproject.com/csharp/designbycontract.asp http://archive.eiffel.com/doc/manuals/technology/contract/ http://www.brent.worden.org/articles/2000/designByContract.html Liskov, B. H, Wing, J. M. 1994. A Behavioral Notion of Subtyping

Projeto Final: Implementação de Projeto Final: Implementação de Design by ContractDesign by Contract

Copyright, 1997 © Dale Carnegie & Associates, Inc.

André Felipe ([email protected])André Felipe ([email protected])Marcelo Guedes ([email protected])Marcelo Guedes ([email protected])

Patrícia Muniz ([email protected])Patrícia Muniz ([email protected])Vaninha Vieira ([email protected])Vaninha Vieira ([email protected])

Recife – PE – BrasilRecife – PE – BrasilAgosto - 2004Agosto - 2004

http://www.cin.ufpe.br/~pmf/in1007http://www.cin.ufpe.br/~pmf/in1007