Se ho una classe di validatore con una funzione di convalida che accetta un ruleContainer
come input. La convalida deve passare se il contenitore è vuoto (meno stupore?) O dovrei lanciare un'eccezione o semplicemente restituire false?
Se ho una classe di validatore con una funzione di convalida che accetta un ruleContainer
come input. La convalida deve passare se il contenitore è vuoto (meno stupore?) O dovrei lanciare un'eccezione o semplicemente restituire false?
Should the validation pass if the container is empty ( least astonishment?)
Sì.
Rispondere alla domanda a livello di astrazione che stai proponendo, ovvero senza assumere o imporre requisiti di dominio aggiuntivi.
Se consideriamo che ruleContainer contiene un insieme di regole che sono vincoli e che tutte le sue regole sono prese insieme in combinazione (ad es. ANDed). Quindi, l'assenza di regole suggerisce l'assenza di vincoli e quindi l'assenza di violazioni. Quindi, la convalida dovrebbe avere successo. Questo sarebbe l'approccio logico. In altre parole, solo se una o più regole vengono violate, la validazione fallire.
Questo da Logical Conjunction
The conjunctive identity is 1, which is to say that AND-ing an expression with 1 will never change the value of the expression. In keeping with the concept of vacuous truth, when conjunction is defined as an operator or function of arbitrary arity, the empty conjunction (AND-ing over an empty set of operands) is often defined as having the result 1 [or true]. [my emphasis]
Quando cambiamo il comportamento del set vuoto dal comportamento logico / previsto (ad esempio, quando si fornisce o quando si restituisce un set vuoto) significa che il codice client chiamante dovrà considerare questo caso speciale e, l'intento del la traduzione può essere persa dal chiamante. La gestione dei casi speciali (dall'implementazione o dal client o entrambi) non è necessaria e potrebbe anche indicare ulteriori test, poiché può essere soggetta a errori.
Questo dipende dai possibili motivi per cui ruleContainer
potrebbe essere vuoto e i requisiti per la classe del validatore.
Se un ruleContainer
vuoto non dovesse accadere (e quindi indica un problema nel programma), lanciare un'eccezione sarebbe la cosa migliore.
Se la convalida dovesse passare se passano tutte le regole, sarebbe più logico considerare che tutte le 0 regole di un contenitore vuoto passino tutte e quindi i passaggi di convalida.
Non riesco a pensare alla cima di un caso in cui un contenitore vuoto dovrebbe significare che la validazione fallisce, ma non posso escludere che qualcun altro possa farlo. In tal caso, dovrebbe essere chiaro dai requisiti che la convalida dovrebbe comportarsi in questo modo.
Leggi altre domande sui tag api-design validation