Come utente API, tollereresti le eccezioni BestPractice?

7

Sono in procinto di progettare un'API, una parte della quale implica la scrittura di POCO in un database.

In C #, abbiamo la struttura DateTime . Il valore "predefinito" per questo ( DateTime.MinValue ) è 01/01/0001.

Una parte dell'API serializza POCO nel database. Se un campo data è opzionale, dovrebbe veramente essere annullabile (nella sintassi C #, questo sarebbe definito come DateTime? ). Quello che vorrei evitare, è che i programmatori cadano nella trappola di scrivere DateTime.MinValue nel database a tutti . È una data valida, certo - ma odora di qualcosa. Quindi sto discutendo implementando una classe BestPracticeException che verrebbe generata in circostanze come questa.

Se l'utente dell'API ha davvero bisogno di gestire quella data, probabilmente dovrà anche occuparsi delle date precedenti e avrà bisogno di una struttura completamente diversa (ad esempio confrontando quanti mesi si sono verificati tra il 500 aC e oggi).

Pensi che impedire di scrivere 01/01/0001 nel database, nel complesso, sia una buona cosa da fare? Si potrebbe obiettare che è necessario distinguere tra l'assenza di data immessa e l'utente che non inserisce nulla. La mia risposta a che sarebbe che è la funzione di un processo di auditing più ampio che la raccoglierebbe, piuttosto che tentare di accertare l'intento da un campo che è nullo, o non nullo.

    
posta Moo-Juice 15.07.2014 - 12:17
fonte

2 risposte

7

La violazione di una buona pratica non è una condizione eccezionale. Se si desidera dichiarare che 01/01/0001 è un valore non valido, quindi generare un'eccezione per tale, in particolare.

In attesa del giorno in cui il mio IDE lancia un InvalidBraceStyleException .

    
risposta data 15.07.2014 - 21:47
fonte
0

Una data di 01/01/0001 di solito indica un bug. Qualcuno probabilmente ha usato una variabile inizializzata di default.

La tua intenzione è fondamentalmente quella di fare in modo che un runtime asserisca contro una specifica classe di bug. Questa è una cosa valida da fare. In effetti è fatto tutto il tempo.

Considera di avere questa convalida come livello tra il client e l'API di archiviazione. In questo modo:

var date = GetDate();
Validate(date);
Store(date);

Invece di:

void Store(DateTime dateTime) {
 Validate(dateTime);
 StoreImpl(dateTime);
}

Lascia che i chiamanti scelgano se vogliono o meno questa convalida. Per convenzione, la maggior parte o anche tutti i chiamanti eseguono la convalida. Ciò mantiene la convalida dal sistema di archiviazione.

    
risposta data 15.07.2014 - 20:08
fonte

Leggi altre domande sui tag