2010-02-18 14 views
9

Mi chiedo se ci sia stata qualche ricerca (sia casuale che robusta) sulla manutenibilità di progetti che usano il paradigma della "dichiarazione di sicurezza" rispetto al paradigma "exit point a singola funzione"?È disponibile una ricerca sulla manutenibilità del paradigma "guardia" rispetto al paradigma "uscita singola"?

Guardia esempio economico (in C#):

string GetSomeString() 
{ 
    if(necessaryConditionFails) { return null; } 
    if(!FunctionWithBoolReturn(someAttribute)) { return null; } 
    //all necessary conditions have been met 
    //do regular processing... 
    return finalStringValue; 
} 

solo esempio punto funzione exit (in C#):

string GetSomeString() 
{ 
    string valueToReturn = null; 
    if(necessaryConditionPasses && FunctionWithBoolReturn(someAttribute)) 
    { 
     //all necessary conditions have been met 
     //do regular processing... 
     valueToReturn = finalStringValue; 
    } 
    return valueToReturn; 
} 

so i meriti e le mancanze di entrambi sono stati dibattuto all'infinito su SO , ma sto cercando un'effettiva ricerca sul modo in cui è possibile mantenere ogni paradigma *. Questo potrebbe essere sconosciuto, ma ho pensato che se le informazioni fossero là fuori, qualcuno su SO avrebbe saputo dov'era. Le mie ricerche sul Web non sono state finora riuscite.

** Sono anche consapevole del fatto che molti programmatori (incluso me) utilizzano entrambi i principi in tutto il codice, a seconda della situazione. Spero solo di scoprire quale ha una comprovata esperienza di maggiore manutenibilità da utilizzare come paradigma preferito. *

+0

Dopo una lunga ricerca e data l'assenza di collegamenti a una ricerca approfondita nella risposta unica a questa domanda, sembra che non ci sia una ricerca accessibile pubblicamente sulla manutenibilità del codice scritto sotto un paradigma rispetto all'altro. – jball

risposta

9

Forcing per avere punti di uscita singoli hanno alcuni problemi.

Il primo è che può portare a costruzioni complesse. Immagine una funzione in cui devi aprire un file, leggere una riga, convertire la linea in un numero e restituire quel numero o zero se qualcosa va storto. Con un singolo punto di uscita, si finisce per usare un sacco di if annidati (se il file esiste aperto, se aperto riesce a leggere la riga, se letto riesce a convertire il valore in un intero), il che rende il codice illeggibile. Alcuni di questi possono essere risolti avendo un'etichetta alla fine della funzione e usando goto (dovevamo usarlo in passato poiché usavamo anche il punto di uscita singolo e la leggibilità preferita) ma non è l'ideale.

In secondo luogo, se si utilizzano eccezioni, si è costretti a catturare tutto se si desidera nuovamente il punto di uscita singolo.

Quindi, personalmente, preferisco inserire molti controlli (e asserzioni) all'inizio e durante l'esecuzione della funzione, e uscire dalla funzione al primo segno di difficoltà.

+13

+1 I sostenitori del "punto di uscita singolo" raramente sembrano rendersi conto che ogni luogo in cui è possibile lanciare un'eccezione è un potenziale punto di uscita. L'origine della raccomandazione sembra provenire dai cattivi vecchi tempi prima che i distruttori, auto_ptr, garbage collection e "finalmente" rendessero molto più semplice assicurare che il codice si pulisse da solo. – Theran

+2

Penso che il lettore di file aperto sia esattamente lo scenario in cui si vorrebbe fare un singolo punto di uscita: nella parte superiore del file si definisce una variabile per contenere il valore di ritorno, quindi si ha un numero di blocchi nidificati. Quello più esterno sta aprendo il file. Se l'open fallisce, si imposta un codice di stato come valore di ritorno, altrimenti si lavora con il file aperto e alla fine si chiude il file e si libera memoria. Dal momento che ogni percorso attraverso il blocco colpirà il codice del file chiuso, non si verificheranno perdite (al contrario di dover liberare risorse in ogni punto di uscita e rischiare una perdita). –

+0

@ Konstantin Naryshkin che sembra più quello che è finalmente. Garantire che succeda sempre qualcosa come la chiusura di un file. Inoltre, ho cercato in F # e mi piace molto quello che [le espressioni di calcolo] (http://msdn.microsoft.com/en-us/library/dd233182.aspx) hanno da offrire nel modo di risolvere questo tipo di problema(Analogamente alle monadi di Haskell) – Steve