Il controllo dei valori di ritorno è sempre richiesto? [duplicare]

3

Sappiamo che il controllo dei valori di ritorno impedisce il nostro software da stati imprevisti. (Puoi vedere la definizione CWE .) Ma a volte siamo certi del valore restituito. Ad esempio:

bool calculateSquareRootReturnFalseIfInputIsNegative(float input, float& output);
float calculateHypotenuse(float a, float b){
  float c2 = (a*a) + (b*b);
  float c;
  calculateSquareRootReturnFalseIfInputIsNegative(c2, c);
  return c;
}

La variabile locale c2 è sempre positiva. Pertanto, calculateSquareRootReturnFalseIfInputIsNegative() restituisce sempre true. Non dovrei controllare il suo valore di ritorno.

Infine, è "controllare tutti i valori di ritorno non già conosciuti dal chiamante" un idioma valido?

Grazie ..

    
posta Q Q 24.12.2014 - 16:19
fonte

3 risposte

1

Is checking return values always required?

Io non la penso così; piuttosto, sono quasi sempre richiesti. Un corretto controllo degli errori è molto importante, anche se a volte può essere certamente un dolore al collo.

Tuttavia, il tuo particolare esempio non descrive un tipico scenario "esegui operazioni che potrebbero fallire e controlla l'errore". Se la tua ipotesi sulla somma dei quadrati è corretta (ad es. Tu ti aspetti questo è il caso, e non permetti ad esempio NaN input), allora quello che stai cercando è un asserzione.

Le asserzioni sono usate in situazioni esattamente come questa: quando si ha un'operazione che a volte può fallire, ma si passa sempre a input per i quali non può / non dovrebbe mai fallire. La consistenza interna del tuo programma dipende da questo, quindi asserisci, in modo che se questa promessa / assunzione nel tuo codice dovesse mai interrompersi, ti verrà notificato (cioè il programma si blocca in modo affidabile nel primo momento in cui rileva l'incoerenza).

    
risposta data 25.12.2014 - 09:16
fonte
0

Dipende da cosa intendi. Se intendi è necessario per ottenere il risultato corretto, la risposta è no. Se intendi che è necessario affinché il codice sia scritto correttamente, la risposta è sì.

Il codice ben scritto è un codice che non è ambiguo per il lettore - se leggo il tuo codice e ti accorgo di ignorare un valore di ritorno, devo rompere le mie capacità psichiche e determinare se INTENZIONALMENTE o INADVERTANTAMENTE ignorato il valore di ritorno in ordine per capire cosa intendevi il codice da fare. Le mie capacità psichiche sono famose per il ritorno di risultati ambigui.

Più seriamente, un blocco vuoto se (con o senza commento) chiarisce che tu sai del valore di ritorno (e che non è stato ad esempio aggiunto come parte di un refactoring) e che hai considerato cosa fare . Fornisce inoltre un utile punto di partenza per aggiungere il codice per gestire il valore restituito se risulta che deve essere gestito dopotutto.

    
risposta data 24.12.2014 - 17:20
fonte
0

No. Non c'è nulla di idiomatico sul valore di gestione degli errori in base al valore di ritorno, sia nel lato chiamato che nel chiamante. Lascia queste terribili pratiche nell'età della pietra a cui appartengono.

Dovresti scrivere le tue funzioni in caso di fallimento. Se stai usando una libreria che non è stata aggiornata dal 1972, allora devi avvolgerla per fornire un'interfaccia utilizzabile.

    
risposta data 25.12.2014 - 11:30
fonte

Leggi altre domande sui tag