Pl sql contract_desing

15
Pl/sql E ... Design by Contract

Transcript of Pl sql contract_desing

Page 1: Pl sql contract_desing

Pl/sqlE ...

Design by Contract

Page 2: Pl sql contract_desing

Design by Contract

In pl/sql Design by Contract = formalizzazione delle interfacce dei moduli elementari.

Il soddisfacimento delle precondizioni è responsabilità del modulo chiamante

Il soddisfacimento delle postcondizioni è un obbligo del modulo chiamato

Gli invarianti sono preservati dal sistema

Page 3: Pl sql contract_desing

Design by Contract

Il soddisfacimento delle precondizioni è responsabilità del modulo chiamante

I parametri di input debbono soddisfare le pre-condizioni sia dal punto di vista formale (data-type) che da un punto di vista semantico ( il significato del dato in input è quello che il modulo chiamato si aspetta ).

Page 4: Pl sql contract_desing

Design by Contract

Il soddisfacimento delle postcondizioni è un obbligo del modulo chiamato

I parametri di output ed i valori di ritorno dei moduli debbono obbedire alle post-condizioni sia da un punto di vista formale (data-type) che da un punto di vista semantico (significato del dato) e sono implementati dagli algoritmi eseguiti dal modulo

Page 5: Pl sql contract_desing

Design by Contract

Gli invarianti sono preservati dal sistema

La gestione delle eccezioni modifica lo stato del sistema (da stato normale a stato di errore) e quindi provoca una modifica degli invarianti

Page 6: Pl sql contract_desing

Pl/sql e Design by Contract

RAFFORZARE MEDIANTE CODICE I VINCOLI DEL CONTRATTO

Asserzioni

Controllo output

Gestione degli errori

Page 7: Pl sql contract_desing

Asserzione

Le chiamate al modulo hanno obblighi contrattuali

L'asserzione delle precondizioni all'ingresso del modulo rafforza il contratto

Il rafforzamento delle probabilità che tutti i contratti siano rispettati aumenta l'affidabilità del codice

L'asserzione:

Testa una condizione booleana e si lamenta in caso di violazione

E' sempre eseguita dal modulo e testa il rispetto da parte del modulo chiamante delle pre-condizioni

Page 8: Pl sql contract_desing

Asserzione

Page 9: Pl sql contract_desing

Asserzionee

programmazione difesiva

L'asserzione delle precondizioni all'ingresso del modulo non rende evidente all'esterno l'errore.

E' la routine di gestione degli errori che decide cosa fare.

Page 10: Pl sql contract_desing

Asserzionee

performance

Le procedure di asserzione creano un maggior carico

Il codice da implementare è minimo ma esiste

Il meccanismo delle asserzioni non può essere rimosso

Page 11: Pl sql contract_desing

Spegnere l'Asserzione

Si può lasciare il codice commentando le chiamate alle procedure di asserzione

Le procedure di asserzione sono parte integrante delle specifiche

Si può usare la compilazione condizionale

Eliminare le chiamate solo a fronte di segnalazioni sulle performance

Page 12: Pl sql contract_desing

Controllo output

Dopo l'esecuzione del modulo occorre controllare l'output prima di restituire il controllo del processo al modulo chiamante

Mediante le asserzioni controllo semantico sul dato restituito

Page 13: Pl sql contract_desing

Gestione degli errori

Cos'è una eccezione ? Accade qualcosa di indesiderabile o inaspettato

Chiamiamo questo eccezione

Il processo passa dall'esecuzione del blocco normale all'esecuzione del blocco di eccezioni

Se il blocco delle eccezioni non riesce a trattare l'eccezione l'eccezione viene passata al modulo chiamante

Page 14: Pl sql contract_desing

Classificazione eccezioni Previste,recuperabili, falsi allarmi

Bisogna preservare il normale flusso del programma usando i sub-blocks

Previste ma irrecuperabili Ad esempio violazione degli obblighi contrattuali Correzione dei moduli per obbedire alle norme dei contratti Segnalate al chiamante in modo da permettergli una gestione

Impreviste ingestibili Gestite da when others e loggate in tabella

Impreviste gestibili Loggate in tabella per successiva analisi messaggio di errore

Page 15: Pl sql contract_desing

Le A.P.I. di Oracle per segnalare gli errori

Descrizione Come recuperare l'informazione

Codice dell'errore Variabile sqlcode

Messaggio di errore Variabile sqlerrm (massimo 512 byte) Oppure DBMS_UTILITY.FORMAT_ERROR_STACK

Individuare la linea di codice dove è stata sollevata l'eccezione

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE

Come ho fatto ad arrivare al punto in cui si è verificata l'eccezione ?

DBMS_UTILITY.FORMAT_CALL_STACK