Sto lavorando a un progetto (che include app Web JavaEE e app JavaSE) che è passato da un singolo sviluppatore a un team di tre persone e stanno emergendo problemi di leggibilità e solidità.
Un'omissione evidente dal linguaggio Java ha riguardato i contratti perfezionati e la facilità con cui questi sono esposti ad altri sviluppatori. (Con i contratti intendo principalmente la convalida dei parametri del metodo e delle condizioni pre / post dell'oggetto).
Ci sono alcune soluzioni che sto osservando e vorrei ricevere feedback dagli altri che hanno qualche esperienza pratica.
Sembrerebbe che Java abbia attualmente due modi supportati per definire un contratto:
- La dichiarazione di asserzione
- Eccezioni di lancio (come IllegalArgumentException)
Gli avvisi sembrano avere solo valore come strumento di debug. Poiché gli assert non sono abilitati per impostazione predefinita, l'aspettativa è che gli sviluppatori si baseranno su di loro solo durante un periodo di test formalizzato, dopo il quale verranno ignorati.
Lanciare le eccezioni sembra una valida opzione in quanto consentono di effettuare quasi tutti i tipi di controlli. Tuttavia, l'intervallo di eccezioni definito dalla libreria Java sembra essere poco adatto alla definizione dei contratti (per le sottoclassi examply di IllegalArgumentException non specificamente con problemi di intervallo, assegni nulli ecc. e sottoclassi di IllegalStateException sembra riguardare la connessione di rete e gli stati dei file), il che costringe ciascun gruppo a definire il proprio intervallo di classi di eccezioni.
Ma il problema più grande è che né le affermazioni né le affermazioni esplicitamente mappano i requisiti del contratto a parametri o concetti come le condizioni pre e post. Si prevede che lo sviluppatore manterrà manualmente i commenti JavaDoc con il codice per chiarire in quali condizioni un assert fallirà o verrà lanciata un'eccezione.
Mi è chiaro che le librerie Java standard non supportano adeguatamente la progettazione per contratto, il che mi porta alle mie domande:
Le mie supposizioni sono corrette o mi sono perso alcune proprietà di asserzioni ed eccezioni che in realtà le rendono piuttosto utili per questo tipo di problema?