Qual è l'approccio corretto alle funzioni che hanno effetti collaterali in Delphi / Pascal?
Ad esempio, potrei avere una funzione booleana DeleteFile
che restituisce True
se il file è stato cancellato e False
altrimenti. Come posso raccogliere il valore restituito?
1) La forma molto esplicita sarebbe:
if DeleteFile(MyFilePath) then
begin
IsMyFileDeleted := True;
end;
else
begin
IsMyFileDeleted := False;
end;
2) Meno ingombrante sarebbe:
IsMyFileDeleted := False;
if DeleteFile(MyFilePath) then
begin
IsMyFileDeleted := True;
end;
3) O ancora più breve, ma scoraggiato da JEDI - forse è accettabile solo per raccogliere i valori di ritorno:
IsMyFileDeleted := False;
if DeleteFile(MyFilePath) then IsMyFileDeleted := True;
Il mio problema con 2 e 3 è che dichiaro esplicitamente qualcosa ( X := False
) che forse non so per certo.
4) Preferirei non impostare la variabile in anticipo e avere il suo valore completamente determinato dalla funzione:
IsMyFileDeleted := DeleteFile(MyFilePath);
Qui il problema è che è un po 'fuorviante, perché assegnare un valore a un booleano ha un effetto collaterale piuttosto serio. Non sono sicuro che questo utilizzo sia desiderabile.
Alcuni sostengono che le funzioni non dovrebbero mai avere effetti collaterali, ma penso che alcune funzioni interne di Pascal vi violino.
5) L'alternativa sarebbe rendere le procedure con una variabile risultato da compilare con la procedura:
DeleteFile(MyFilePath, IsMyFileDeleted);
Potrebbe andare in controtendenza per mantenere l'uso dei parametri al minimo (Clean Code).
4 e 5 sarebbero gli unici modi per raccogliere un valore di ritorno diverso da quello booleano, suppongo? Significa qualcosa per le funzioni booleane?
Sì, ci sono molti modi per fare la stessa cosa e forse sono solo preoccupato di nulla, ma sto cercando di sviluppare un buon stile e mi chiedo se ci sono delle buone pratiche. Per un principiante, molti principi sembrano essere in conflitto in ogni momento.