Precondizione

Da Wikipedia, l'enciclopedia libera.

In programmazione, una precondizione è una condizione o predicato che deve essere sempre vero prima che l'esecuzione di una sezione di codice o prima di una operazione in una specifica formale. Se una precondizione viene violata, l'effetto prodotto dalla sezione di codice diviene indefinito e quindi potrebbe o non potrebbe fornire il risultato atteso. Problemi di sicurezza possono derivare da precondizioni incorrette. Solitamente le precondizioni sono incluse nella documentazione della sezione di codice che le richiede. Le precondizioni vengono a volte verificate usando delle asserzioni nel codice stesso, ed alcuni codici hanno specifici costruzioni sintattiche per fare ciò. Ad esempio: il fattoriale è definito solo per numeri interi maggiori o uguali a zero. Quindi, un programma per calcolare il fattoriale di un numero avrà le precondizioni che il numero sia intero e che sia maggiore o uguale a zero.

Nella programmazione ad oggetti[modifica | modifica sorgente]

Le precondizioni nella programmazione ad oggetti sono una parte essenziale della progettazione per contratto. La progettazione per contratto include anche nozioni di postcondizioni ed invarianti. La precondizione per ogni routine definisce ogni vincolo che ogni oggetto deve soddisfare per ottenere un'esecuzione corretta. Dal punto di vista dello sviluppatore, costituisce la parte di routine responsabilità del chiamante. Il chiamante è quindi obbligato ad assicurare che le precodizioni siano soddisfatte prima di chiamare la routine. Il risultato per il chiamante si esprime nelle postcondizioni del chiamato.[1]

Esempio in Eiffel[modifica | modifica sorgente]

La routine nell'esempio seguente scritto in Eiffel ha come argomento in ingresso un numero interno che deve avere il valore di un'ora del giorno, da 0 a 23, estremi inclusi. La precondizione segue la parola chiaverequire. Specifica che quell'argomento deve essere maggiore o uguale e zero e minore o uguale a 23. Il tag "valid_argument:" descrive questa precondizione e serve ad identificarla nel caso di violazione di una precondizione durante l'esecuzione.

    set_hour (a_hour: INTEGER)
            -- Set `hour' to `a_hour'
        require
            valid_argument: a_hour >= 0 and a_hour <= 23
        do
            hour := a_hour
        ensure
            hour_set: hour = a_hour
        end

Precondizioni ed ereditarietà[modifica | modifica sorgente]

In presenza di ereditarietà, la routine ereditata dalla classe discendente (sotto-classe) eredita anche le precondizioni in essere. Questo significa che ogni implementazione o ridefinizione di routine ereditate devono essere scritte in modo consistente con il contratto ereditato. Le precondizioni possono essere modificare in routine ridefinite, ma possono solo essere più deboli.[2] Cioè, la ridefinizione della routine deve porre meno vincoli per il cliente, non aumentarli.

Voci correlate[modifica | modifica sorgente]

Note[modifica | modifica sorgente]

  1. ^ Meyer, Bertrand,Object-Oriented Software Construction, second edition, Prentice Hall, 1997, p. 342.
  2. ^ Meyer, 1997, pp. 570–573.