Passa al contenuto principale

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 in viene eseguito prima della funzione — deve essere soddisfatto per procedere
  • Il blocco out(result) viene eseguito dopo — serve a validare il risultato
  • body contiene 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 invariant viene 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 -release per 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.


Risorse