Design by Contract in D
Il linguaggio D supporta nativamente il Design by Contract — è parte integrante della sua sintassi sin dalla nascita.
Tramite i blocchi in, out e invariant, D consente di esprimere direttamente nel codice precondizioni, postcondizioni e invarianti. Questi contratti sono verificati in fase di esecuzione e l'uso di tale meccanismo è incoraggiato per via dell'approccio di D incentrato su correttezza ed espressività.
Come funzionano i contratti in D
Precondizioni e postcondizioni
Usa i blocchi in e out all'interno delle funzioni:
int deposit(int currentBalance, int amount)
in {
assert(amount > 0); // Precondizione
}
out(result) {
assert(result == currentBalance + amount); // Postcondizione
}
body {
return currentBalance + amount;
}
- Il blocco
inviene eseguito prima della funzione — deve essere soddisfatto per procedere - Il blocco
out(result)viene eseguito dopo — serve a validare il risultato bodycontiene la logica vera e propria della funzione
Invarianti
Puoi definire invarianti di classe con il blocco invariant:
class Account {
int balance;
this(int initial) {
balance = initial;
}
void deposit(int amount)
in {
assert(amount > 0);
}
out {
assert(balance >= 0);
}
body {
balance += amount;
}
invariant {
assert(balance >= 0);
}
}
- Il blocco
invariantviene verificato prima e dopo ogni chiamata a un metodo pubblico - Serve a garantire la correttezza dello stato interno dell'oggetto
Controllo in fase di compilazione
I contratti in D possono essere abilitati o disabilitati in base ai flag di compilazione:
- Usa
-releaseper disabilitarli (ad esempio, in produzione) - Mantienili attivi in sviluppo per ottenere la massima sicurezza
Cosa rende D speciale
Il supporto ai contratti in D è:
- Nativo e parte del linguaggio
- Chiaro e idiomatico — senza decoratori o boilerplate
- Progettato per intercettare i bug lì dove si presentano, non dopo
D trova un buon equilibrio tra prestazioni da linguaggio di sistema ed espressività di alto livello, risultando una scelta interessante per chi mette la correttezza al primo posto.