Naturalmente, i metodi privati hanno tanto da guadagnare quanto i metodi pubblici, dal controllo per assicurarsi che ogni singolo bit del loro input sia corretto. In generale, nessun programmatore si sarebbe mai posto la domanda se siano necessari più assegni rispetto a un minor numero di assegni, (duh!) Se non fosse per problemi di prestazioni.
Ora, quando si tratta di verificare materiale non valido, ci sono due tipi di controlli che è possibile eseguire:
-
Controlli del tempo di produzione, (in breve, controlli di runtime ) che si verificano sia nello sviluppo che negli ambienti di produzione. (Là fuori sul campo.)
-
Asserzioni solo in fase di sviluppo, (in breve, assertions ) che si verificano solo negli ambienti di sviluppo e vengono saltate negli ambienti di produzione.
Le asserzioni hanno la caratteristica sorprendentemente utile di non incorrere in alcuna penalizzazione delle prestazioni negli ambienti di produzione, quindi possono essere utilizzate in modo molto liberale. Vai avanti e asserisci tutto ciò che puoi, non influisce sulle prestazioni. Al contrario, affermare che tutto è buono per la robustezza, è utile per il debug, è utile per la documentazione, è utile per mantenere bassa la complessità dello stato del programma; in breve, è la cosa migliore dopo il pane a fette. Quindi:
The question you should always be asking
is not "should I assert this?"
but "is there anything I forgot to assert?"
Quindi, in un sistema ben progettato, sia i metodi privati che i metodi pubblici controllano tutto ciò che c'è da controllare, l'unica differenza è la seguente:
-
Tutti (beh, quasi tutti) dei controlli eseguiti con metodi privati sono asserzioni.
-
Molti dei controlli eseguiti con metodi pubblici sono controlli di runtime, ( non asserzioni,) se l'interfaccia pubblica dell'oggetto lo richiede. Generalmente, questi controlli sono per cose che possono verosimilmente accadere in condizioni di utilizzo normali e non sono necessariamente bug.
Ad esempio, se si sta codificando una classe File
, in genere un errore nell'aprire il file non è un bug, quindi è necessario controllarlo e generare un'eccezione anche in fase di produzione. D'altra parte, se qualcuno passa il tuo metodo di apertura file pubblico a null
nomefile, cioè un bug nel codice del chiamante, quindi il controllo di un nome file nullo può essere un'asserzione.
Generalmente, ogni singola cosa che viene controllata con un controllo di runtime in un metodo pubblico può anche essere ricontrollata in un metodo privato, ma questa volta con un'asserzione, poiché tutto l'input dovrebbe avere è già stato convalidato dai metodi pubblici, quindi qualsiasi cosa negativa che raggiunga un metodo privato significa che hai un bug nel tuo codice.
Quindi in generale:
-
Nulla dovrebbe mai essere deselezionato, in metodi pubblici o privati.
-
Le asserzioni sono gratuite, quindi usale liberamente.
ESCLUSIONE DI RESPONSABILITÀ: poiché questa è una domanda dell'intervista, tieni presente che quanto sopra può e non può essere quello che l'intervistatore vorrebbe sentire da te. In questi casi è meglio prefisso la tua risposta con un disclaimer del tipo: "Beh, ovviamente seguirò qualunque disciplina sia generalmente usata in casa, ma se dipendesse completamente da me, allora vorrei ..."