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