Design by Contract in Eiffel
Eiffel è la culla del Design by Contract — il linguaggio in cui questo paradigma è nato ed è stato pienamente realizzato.
Nel mondo Eiffel, i contratti non sono opzionali. Fanno parte del linguaggio, sono applicati per impostazione predefinita, sia in fase di esecuzione che negli strumenti di supporto.
Come funzionano i contratti in Eiffel
Eiffel supporta:
- Precondizioni: require
- Postcondizioni: ensure
- Invarianti: blocchi invariantnelle classi
Questi controlli vengono eseguiti automaticamente prima e dopo l'esecuzione dei metodi, nonché quando lo stato dell'oggetto viene letto o modificato.
Esempio
class
    ACCOUNT
create
    make
feature {NONE} -- Inizializzazione
    make (initial_balance: INTEGER)
        do
            balance := initial_balance
        ensure
            balance_set: balance = initial_balance
        end
feature -- Accesso
    balance: INTEGER
feature -- Modifica
    deposit (amount: INTEGER)
        require
            positive_amount: amount > 0
        do
            balance := balance + amount
        ensure
            balance_increased: balance = old balance + amount
        end
invariant
    non_negative_balance: balance >= 0
end
Questo esempio garantisce che:
- i depositi siano positivi (require)
- il nuovo saldo sia corretto (ensure)
- il saldo non sia mai negativo (invariant)
Cosa rende Eiffel speciale
Eiffel offre tuttora l'implementazione più pura e completa del Design by Contract:
- I contratti sono profondamente integrati: influenzano il modo in cui si modella, si progetta e si ragiona sul software
- Strumenti come AutoProof supportano la verifica statica dei contratti
- Il linguaggio promuove un approccio del tipo: "la correttezza prima di tutto"