Risposta breve: prendere 2
se non si dispone di un motivo necessario per prendere 1
.
Risposta lunga: nel mondo del C++ e delle lingue derivate, Java, C#, le eccezioni aiutano molto. Nel mondo C, non c'è molto che tu possa fare. Che segue è un esempio di API prendo dalla libreria CUDA, che è una libreria che mi piace e prendere in considerazione ben progettato:
cudaError_t cudaMalloc (void **devPtr, size_t size);
confronta API con malloc
:
void *malloc(size_t size);
nelle interfacce vecchi C, ci sono molti esempi:
int open(const char *pathname, int flags);
FILE *fopen(const char *path, const char *mode);
direi alla fine del mondo, l'interfaccia CUDA sta fornendo è molto più evidente e portare a risultato corretto.
ci sono altre serie di interfacce che lo spazio valore di ritorno valida in realtà si sovrappone con il codice di errore, in modo che i progettisti di queste interfacce graffiato la testa e venire con non brillanti a tutte le idee, dicono:
ssize_t read(int fd, void *buf, size_t count);
una funzione giornaliera come la lettura di un contenuto di file è limitata dalla definizione di ssize_t
. poiché il valore di ritorno deve codificare anche il codice di errore, deve fornire un numero negativo. in un sistema a 32 bit, il massimo di ssize_t
è 2G, che è molto limitato il numero di byte che è possibile leggere dal file.
Se il tuo identificatore di errore è codificato all'interno del valore di ritorno della funzione, scommetto che i programmatori di 10/10 non cercheranno di controllarlo, anche se sanno davvero che dovrebbero; semplicemente non lo fanno, o non lo ricordano, perché la forma non è ovvia.
E un altro motivo è che gli esseri umani sono molto pigri e non sono bravi nel trattare se lo sono. La documentazione di queste funzioni descriverà quanto segue:
se il valore di ritorno è NULL
quindi ... blah.
se il valore di ritorno è 0
quindi ... blah.
yak.
Nella prima forma, le cose cambiano. Come giudichi se il valore è stato restituito? No NULL
o 0
altro. È necessario utilizzare SUCCESS
, FAILURE1
, FAILURE2
o qualcosa di simile. Questa interfaccia costringe gli utenti a codificare più sicuro e rende il codice molto robusto.
Con queste macro, o enum, è molto più semplice per i programmatori apprendere l'effetto dell'API e la causa di diverse eccezioni. Con tutti questi vantaggi, in realtà non esiste nemmeno un sovraccarico extra di runtime.
se la funzione sarà sicuramente successo (che è raro nel mondo C), '1' e' 2' sono equivalenti. in caso contrario, '2' restituisce anche il codice di errore. in cortometraggi, '2' è più pratico. – HuStmpHrrr