2010-07-25 12 views
6

Controllo sempre gli argomenti delle funzioni pubbliche e faccio eccezioni quando qualcosa non va. (Per gli aiutanti privati ​​uso le asserzioni).Messaggio di IllegalArgumentException automatizzato?

Ti piace questa:

if(a < 0 || a >= b) 
    throw new IllegalArgumentException("'a' must be greater or equal to 0 and 
     smaller than b "); 

Ma mi infastidisce sempre di scrivere questi messaggi di errore. Il messaggio mi sembra ridondante, poiché il messaggio è solo la negazione dell'istruzione

a < 0 || a >= b 

.

Accade spesso anche che io rinomini la variabile con refactoring (in eclissi) e che quindi il messaggio non rifletta le modifiche. O cambio le condizioni e dimentico di cambiare i messaggi.

Sarebbe bello, se potevo scrivere qualcosa di simile:

assertArgument(a >= 0 && a < b); 

Questo dovrebbe sollevare un IllegalArgumentException con un messaggio come

"violated argument assertion: a >= 0 && a < b." 

In C si potrebbe scrivere una macro (in realtà in C asserire è solo una macro). C'è un modo semplice per fare qualcosa di simile in java?

Grazie!

+0

È possibile generare codice Java durante la compilazione ... ma il dolore non ne vale la pena. Il tuo problema non è mortale - finché puoi id una linea, sarai ok. Puoi anche scrivere script Python per passare attraverso il codice e verificare la presenza di incoerenze. –

+1

Che ne dici di creare una funzione di aiuto 'checkParam (param, paramName)'? Quindi, anche dopo aver rinominato le variabili, puoi ancora trovare un rapido script Python per cercare tutte le istanze di checkParam e assicurarti che siano kosher. Forse qualcun altro può espandere questa idea. –

+0

Si potrebbe anche usare il riflesso in modalità Debug. –

risposta

3

Nel linguaggio C non è possibile utilizzare macro per fare ciò, ma in cpp (il preprocessore C) è possibile :-) Se si desidera veramente farlo, non c'è nulla che vi impedisca di eseguire cpp sulla vostra fonte java prima viene compilato Ciò ti consentirebbe di utilizzare macro in stile cpp (potrebbe essere necessario rimuovere le righe a partire da #line dall'output cp.)

Per riprodurre il condizionale nell'eccezione c'è IMHO che include troppi dettagli di implementazione. Se il tuo messaggio di eccezione descrive la violazione nel contratto in termini di contratto (ad esempio "nessun oggetto genitore dato", "l'importo non può essere negativo") non è necessario modificarlo ogni volta che la condizione cambia.

+0

Hai ragione riguardo al preprocessore, ma prenderei in considerazione il preprocessore C come parte della programmazione in C. Le affermazioni di preposizionamento forse non fanno realmente parte del linguaggio C, in quanto il compilatore C non riesce a vederle, ma sono davvero essenziali per scrivere programmi in C. –

+0

E grazie per i suggerimenti: Usare un preprocessore o eseguire uno Scipt (come suggerito da Hamish Grubijan) per cambiare o controllare il codice, potrebbe risolvere il mio problema (davvero non così mortale). Anche se pensavo più a una soluzione Java semplice e nativa, è anche importante che altre persone capiscano chiaramente che cosa sta succedendo.Poi di nuovo potrei condividere solo il codice generato ... Potrebbe forse aiutare Design by Contract? Non ho esperienza con DbC finora. –

+0

Se si sta esaminando i preprocessori, si potrebbe voler esaminare M4 (http://www.gnu.org/software/m4/) DbC può aiutare, ma normalmente non si eseguirà il codice strumentato in produzione. Poiché il tuo requisito è uno di uno script perl o python che corregge il tuo argomento di eccezione è probabilmente il modo più veloce per andare. – rsp

Problemi correlati