Mentre spuntavo tra le domande, ho scoperto di recente la parola chiave assert
in Java. All'inizio ero eccitato. Qualcosa di utile che non sapevo già! Un modo più efficiente per me per verificare la validità dei parametri di input! Yay learning!Java assert rotto?
Ma poi ho preso uno sguardo più attento, e il mio entusiasmo non era tanto "temperato" come "spenta-out completamente" da un semplice fatto:. È possibile attivare le asserzioni off *
Questo suona come un incubo . Se sto affermando che non voglio che il codice continui se l'input listOfStuff
è null
, perché mai vorrei ignorare questa asserzione? Sembra che se eseguo il debug di un codice di produzione e sospetti che listOfStuff
sia stato erroneamente passato a null
ma non si veda alcuna evidenza di log di quell'asserzione che viene attivata, non posso fidarmi che in realtà sia stato inviato uno listOfStuff
valido valore; Devo anche spiegare la possibilità che le asserzioni possano essere state completamente disattivate.
E questo presuppone che io sia quello che esegue il debug del codice. Qualcuno che non ha familiarità con le asserzioni potrebbe vederlo e supporre (abbastanza ragionevolmente) che se il messaggio di asserzione non appare nel log, il problema potrebbe non essere il listOfStuff
. Se il tuo primo incontro con assert
era in libertà, ti verrebbe in mente che potrebbe essere disattivato completamente? Non è che ci sia un'opzione a riga di comando che ti consente di disabilitare i blocchi try/catch, dopo tutto.
Tutto ciò mi porta alla mia domanda (e questo è una domanda, non è una scusa per un rant lo prometto!!):
Che cosa mi manca?
C'è qualche sfumatura che rende l'implementazione di Java di assert
molto più utile di quella a cui sto dando credito? La capacità di abilitarlo/disabilitarlo dalla riga di comando è davvero incredibilmente valido in alcuni contesti? Sono in qualche modo misconceptualizing esso in qualche modo quando immagino di utilizzarlo nel codice di produzione al posto di dichiarazioni come if (listOfStuff == null) barf();
?
Mi sento come se qui non ci fosse qualcosa di importante.
* Ok, tecnicamente parlando, in realtà sono disattivati per impostazione predefinita; devi fare di tutto per accenderli. Ma comunque, puoi batterli completamente.
Modifica: Illuminismo richiesto, illuminazione ricevuta.
L'idea che lo strumento assert
sia innanzitutto uno strumento di debug ha un lungo, lungo percorso per renderlo comprensibile per me.
Sono ancora in disaccordo con l'idea che i controlli di input per i metodi privati non banali dovrebbero essere disabilitati in un ambiente di produzione perché lo sviluppatore ritiene che gli input errati siano impossibili. Nella mia esperienza, il codice di produzione maturo è una cosa folle e tentacolare, sviluppata nel corso degli anni da persone con vari gradi di abilità mirate a soddisfare rapidamente le esigenze di vari gradi di sanità mentale. E anche se l'input errato è davvero impossibile, un pezzo di codifica di manutenzione trascurata tra sei mesi può cambiarlo. The link gustafc provided (grazie) include questo come esempio:
assert interval > 0 && interval <= 1000/MAX_REFRESH_RATE : interval;
disabilitazione di un semplice controllo ad esempio nella produzione mi sembra stupidamente ottimista. Tuttavia, questa è una differenza nella filosofia di codifica, non una caratteristica rotta.
Inoltre, posso sicuramente vedere il valore di qualcosa di simile:
assert reallyExpensiveSanityCheck(someObject) : someObject;
I miei ringraziamenti a tutti coloro che hanno trovato il tempo per aiutarmi a capire questa funzione; è molto apprezzato
Questo assomiglia molto a un rant, e non come una domanda affatto. –
Hai mai usato ASSERT in C o C++? Hai mai desiderato di poterli accendere o spegnere allo scatto di un dito? –
@Joachim: ho capito, ma seriamente, sono qui in cerca di illuminazione. Questa funzione mi sembra davvero infranta, ma è come dire "Non vedo cosa c'è che non va nel mio codice, quindi il compilatore deve essere rotto!", Solo a un livello più alto. Mi sento davvero come se mi mancasse qualcosa. Se mi puoi suggerire un modo per esprimere PERCHÉ il lungometraggio mi sembra spezzato che non ti colpisce come uno sfogo, ti sto ascoltando. – BlairHippo