Pré-condições e Pós-condições

25
José Augusto Baranauskas Departamento de Física e Matemática – FFCLRP-USP [email protected] http://dfm.ffclrp.usp.br/~augusto Algoritmos e Estruturas de Dados I Pré Pré - - condições e condições e Pós Pós - - condições condições Nesta aula são descritas pré-condições e pós- condições Elas permitem que um programador especifique o que um procedimento deve realizar

Transcript of Pré-condições e Pós-condições

Page 1: Pré-condições e Pós-condições

José Augusto BaranauskasDepartamento de Física e Matemática – FFCLRP-USP

[email protected]://dfm.ffclrp.usp.br/~augusto

Algoritmos eEstruturas de Dados I

PréPré--condições e condições e PósPós--condiçõescondições

Nesta aula são descritaspré-condições e pós-condiçõesElas permitem que um programador especifique o que um procedimento deve realizar

Page 2: Pré-condições e Pós-condições

2

PréPré--condições e Póscondições e Pós--condiçõescondições

Freqüentemente um programador necessita comunicar precisamente o que um procedimento deve realizar, sem qualquer indicação de como esta tarefa deve ser realizadaVocê pode imaginar uma situação onde isto pode ocorrer?

Page 3: Pré-condições e Pós-condições

3

Eu não me importocom qual método o

procedimento utilizará,desde que os

requisitossejam respeitados

Aqui estão os requisitos para um procedimento

que eu desejo que você escreva

ExemploExemplo

Você é o chefe de um grupo de programadores e você deseja que um dos seus programadores escreva um procedimento como parte de um projeto

Page 4: Pré-condições e Pós-condições

4

O que são PréO que são Pré--condições e condições e PósPós--condições?condições?

Um forma de especificar tais requisitos é através de um par de declarações sobre o procedimentoA declaração de pré-condição indica o que deve ser verdade antes que o procedimento seja chamadoA declaração de pós-condição indica o que será verdade quando o procedimento terminar o seu trabalho

Page 5: Pré-condições e Pós-condições

5

void WriteSquareRoot(float Number)// Pré-condição: Number >= 0// Pós-condição: A raiz quadrada de Number deve// ser escrita{

...}

ExemploExemplo

Page 6: Pré-condições e Pós-condições

6

void WriteSquareRoot(float Number)// Pré-condição: Number >= 0// Pós-condição: A raiz quadrada de Number deve// ser escrita{

...}

ExemploExemplo

•A pré-condição e pós-condição aparecem como comentários no seu programa•Elas são freqüentemente colocadas após o cabeçalho do procedimento

•A pré-condição e pós-condição aparecem como comentários no seu programa•Elas são freqüentemente colocadas após o cabeçalho do procedimento

Page 7: Pré-condições e Pós-condições

7

void WriteSquareRoot(float Number)// Pré-condição: Number >= 0// Pós-condição: A raiz quadrada de Number deve// ser escrita{

...}

ExemploExemplo

Neste exemplo, a pré-condição requer que

Number >= 0seja verdade sempre que

o procedimento for chamado

Neste exemplo, a pré-condição requer que

Number >= 0seja verdade sempre que

o procedimento for chamado

Page 8: Pré-condições e Pós-condições

8

ExemploExemplo

WriteSquareRoot( -10 );WriteSquareRoot( 0 );WriteSquareRoot( 5.6 );

Quais destas chamadas de procedimento respeitam a pré-condição?

Page 9: Pré-condições e Pós-condições

9

ExemploExemplo

WriteSquareRoot( -10 );WriteSquareRoot( 0 );WriteSquareRoot( 5.6 );

A segunda e terceira chamadas estão corretas,uma vez que seus argumentos são maiores ou iguais a zero

Quais destas chamadas de procedimento respeitam a pré-condição?

Page 10: Pré-condições e Pós-condições

10

ExemploExemplo

WriteSquareRoot( -10 );WriteSquareRoot( 0 );WriteSquareRoot( 5.6 );

Mas a primeira chamada viola a pré-condição,uma vez que seu argumento é menor que zero

Quais destas chamadas de procedimento respeitam a pré-condição?

Page 11: Pré-condições e Pós-condições

11

void WriteSquareRoot(float Number)// Pré-condição: Number >= 0// Pós-condição: A raiz quadrada de Number deve// ser escrita{

...}

ExemploExemplo

A pós-condição sempre indica qual trabalho deve ser realizado pelo procedimento. Neste caso, quando o procedimento retorna, a raiz quadrada de Number deve ser escrita

A pós-condição sempre indica qual trabalho deve ser realizado pelo procedimento. Neste caso, quando o procedimento retorna, a raiz quadrada de Number deve ser escrita

Page 12: Pré-condições e Pós-condições

12

bool Vowel(char Letter)// Pré-condição: Letter é uma letra maiúscula ou// uma letra minúscula (no intervalo 'A' .. 'Z' ou 'a' .. 'z')// Pós-condição: O valor retornado pela função// é verdade se Letter é uma vogal; caso-contrário// o valor retornado pela função é falso{

...}

Outro ExemploOutro Exemplo

Page 13: Pré-condições e Pós-condições

13

Outro ExemploOutro Exemplo

Vowel( 'A' )Vowel( 'Z' )Vowel( '?' )

Quais valores serão retornadospor estas chamadas da função?

Page 14: Pré-condições e Pós-condições

14

Outro ExemploOutro Exemplo

Vowel( 'A' )Vowel( 'Z' )Vowel( '?' )

true

false

Ninguém sabe, pois a pré-condiçãoestá sendo violada.

Quais valores serão retornadospor estas chamadas da função?

Page 15: Pré-condições e Pós-condições

15

Outro ExemploOutro Exemplo

Vowel( '?' )

A violação de uma pré-condição pode até mesmo resultar em efeitos inesperados

Quais valores serão retornadospor estas chamadas da função?

Page 16: Pré-condições e Pós-condições

16

Sempre certifique que a préSempre certifique que a pré--condição seja válida...condição seja válida...O programador que chama a função ou procedimento é responsável por certificar que a pré-condição é válida quando o procedimento é chamado

Neste ponto, meu programa chama o

seu procedimento, eeu tenho certeza

que a pré-condiçãoé válida

Page 17: Pré-condições e Pós-condições

17

...então a pós...então a pós--condição se torna condição se torna verdade ao fim do procedimentoverdade ao fim do procedimento

O programador que escreve a função ou procedimento assume que a pré-condição é válida, e certifica que a pós-condição se torna verdade ao fim do procedimento

Então meu procedimento será

executado e quando isto é feito, a pós-

condição será verdade,eu garanto

Page 18: Pré-condições e Pós-condições

18

QuestãoQuestão

Suponha que você chame um procedimento, e você não se certifica que a pré-condição é verdadeira. Quem é responsável caso esta falha cause algum tipo de desastre?

VocêO programador que escreveu o procedimentoNinguém

Page 19: Pré-condições e Pós-condições

19

QuestãoQuestão

Suponha que você chame um procedimento, e você não se certifica que a pré-condição é verdadeira. Quem é responsável caso esta falha cause algum tipo de desastre?

VocêO programador que chama um procedimento é responsável por certificar que a pré-condição é válida

Page 20: Pré-condições e Pós-condições

20

Por outro lado, programadores cuidadosos Por outro lado, programadores cuidadosos também seguem as seguintes regras:também seguem as seguintes regras:

Quando você escreve um procedimento, você deve detectar em quais condições uma pré-condição será violadaSe você detectar que uma pré-condição foi violada, estão imprima uma mensagem de erro e aborte o programa...

Page 21: Pré-condições e Pós-condições

21

Por outro lado, programadores cuidadosos Por outro lado, programadores cuidadosos também seguem as seguintes regras:também seguem as seguintes regras:

Quando você escreve um procedimento, você deve detectar em quais condições uma pré-condição será violadaSe você detectar que uma pré-condição foi violada, estão imprima uma mensagem de erro e aborte o programa......em vez de causar um desastre

Page 22: Pré-condições e Pós-condições

22

void WriteSquareRoot(float Number)// Pré-condição: Number >= 0// Pós-condição: A raiz quadrada de Number deve// ser escrita{if (Number < 0) // Pré-condição falhou { cout << ”ERROR: Number is negative”;

abort(); // Isto pára um programa em C++}...

}

ExemploExemplo

Page 23: Pré-condições e Pós-condições

23

Vantagens do Uso de PréVantagens do Uso de Pré--condições e Póscondições e Pós--condiçõescondições

Resumidamente descreve o comportamento de uma função ou procedimento......sem entrar em detalhes de implementação Posteriormente, você pode re-implementar o procedimento de uma nova forma......entretanto os programas (os quais dependem exclusivamente da pré-condição/pós-condição) continuarão a funcionar sem alterações

Page 24: Pré-condições e Pós-condições

24

ResumoResumo

Pré-condiçãoO programador que chama o procedimento certifica que a pré-condição é válidaO programador que escreve um procedimento assume que a pré-condição é verdade quando o procedimento inicia sua execução

Pós-condiçãoO programador que escreve um procedimento certifica que a pós-condição é verdadeira ao término do procedimento

Page 25: Pré-condições e Pós-condições

25

THE ENDTTHE HE EENDND

Presentation copyright 1995, The Benjamin/Cummings Publishing Company,For use with Data Structures and Other Objectsby Michael Main and Walter Savitch.

Some artwork in the presentation is used with permission from Presentation Task Force(copyright New Vision Technologies Inc) and Corel Gallery Clipart Catalog (copyrightCorel Corporation, 3G Graphics Inc, Archive Arts, Cartesia Software, Image ClubGraphics Inc, One Mile Up Inc, TechPool Studios, Totem Graphics Inc).

Students and instructors who use Data Structures and Other Objects are welcometo use this presentation however they see fit, so long as this copyright notice remainsintact.

Translation to portuguese by Prof. Maria Carolina Monard, ICMC-USP.Modifications for C++ language by Prof. José Augusto Baranauskas, FFCLRP-USP, 2005.