D - Programmazione del contratto

La programmazione dei contratti nella programmazione D si concentra sulla fornitura di un mezzo semplice e comprensibile per la gestione degli errori. La programmazione dei contratti in D è implementata da tre tipi di blocchi di codice:

  • blocco del corpo
  • in blocco
  • fuori blocco

Body Block in D

Il blocco del corpo contiene il codice di funzionalità effettivo di esecuzione. I blocchi in e out sono opzionali mentre il blocco del corpo è obbligatorio. Di seguito viene mostrata una semplice sintassi.

return_type function_name(function_params) 
in { 
   // in block 
} 

out (result) { 
   // in block 
}
 
body { 
   // actual function block 
}

In blocco per condizioni preliminari in D

In blocco è per semplici condizioni preliminari che verificano se i parametri di input sono accettabili e nell'intervallo che può essere gestito dal codice. Un vantaggio di un blocco in è che tutte le condizioni di ingresso possono essere tenute insieme e separate dal corpo effettivo della funzione. Di seguito è riportata una semplice condizione preliminare per convalidare la password per la sua lunghezza minima.

import std.stdio; 
import std.string;
  
bool isValid(string password) 
in { 
   assert(password.length>=5); 
}
 
body { 
   // other conditions 
   return true; 
}
  
void main() { 
   writeln(isValid("password")); 
}

Quando il codice sopra viene compilato ed eseguito, legge il file creato nella sezione precedente e produce il seguente risultato:

true

Blocchi in uscita per condizioni post in D

Il blocco out si prende cura dei valori restituiti dalla funzione. Convalida che il valore restituito è compreso nell'intervallo previsto. Di seguito è mostrato un semplice esempio contenente sia dentro che fuori che converte mesi, anno in una forma di età decimale combinata.

import std.stdio;
import std.string;

double getAge(double months,double years) 
in { 
   assert(months >= 0); 
   assert(months <= 12); 
}
 
out (result) { 
   assert(result>=years); 
} 

body { 
   return years + months/12; 
} 
 
void main () { 
   writeln(getAge(10,12)); 
}

Quando il codice sopra viene compilato ed eseguito, legge il file creato nella sezione precedente e produce il seguente risultato:

12.8333