In informatica, in particolare nella programmazione, una precondizione è una condizione o predicato che deve essere sempre vero prima dell'esecuzione di una sezione di codice o prima di un'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

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

La routine nell'esempio seguente scritto in Eiffel ha come argomento in ingresso un numero intero 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

In presenza di ereditarietà, la routine ereditata dalla classe discendente (sottoclasse) 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.

Note modifica

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

Voci correlate modifica