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