Un'altra tecnica molto comoda quando si parla di 
"defensive programming" è la cosiddetta "programmazione funzionale".
Vediamo lo stesso programma di prima, però adattato a questa nuova 
tecnica.
Program Programma;
const ErrEmptyStrValue = 1;
function ReadString(Label : String;var S : String;var ErrOut: Integer) : 
Boolean;
begin
  write(Label+': ');
  readln(S);
  
Result := S <> '';
  if Not Result 
then
    ErrOut := 
ErrEmptyStrValue;
end;
function GetFirstName(var S: String;var 
ErrOut : Integer);
begin
  Result := ReadString('First 
name',S,ErrOut);
end;
procedure GetLastName(var S : String;var ErrOut: 
Integer);
begin
  Result := ReadString('Last 
name',S,ErrOut);
end;
var FName,LName : 
String;
     ErrorOut : Integer;
begin
  if GetFirstName(FName,ErrorOut) then
  
begin
     if GetLastName(LName,ErrorOut) 
then
     begin
        
write('First name is '''+FName+' '' and Last name is 
'''+LName+'''');
     end;
  
end;
end.   
Qui adesso abbiamo un programma che controlla che ogni funzione sia "true" 
prima di proseguire.
Inoltre, dotando le funzioni di un parametro ErrOut, 
possiamo usare un tipo Boolean e relegare la
gestione dell'errore in altri 
punti. Nel caso specifico, non gestiamo l'errore nel corpo principale 
soltanto perché si tratta di un programma dimostrativo e perché ad ogni modo 
in un programma di
questa complessità usare la programmazione funzionale è - 
imho - fuori luogo, oltre che 
tremendamente noioso  .
.
Comunque il concetto di base è semplice: valori TRUE o FALSE a seconda 
dei casi, più una
variabile di supporto per la gestione corretta degli errori 
in altri punti. Oggi useremmo probabilmente una
eccezione per cose del 
genere, ma il concetto non cambia poi molto.
Il vantaggio principale di questo stile di programmazione è che sai *sempre* 
dove stai se qualcosa non và, il che non fà male di sicuro  .
.
Saluti,
Andrea
powered by IMHO 1.2