Sei sulla strada giusta. La logica di convalida del dominio o dell'attività commerciale deve fare molto di più del semplice rapporto vero o falso. Vuoi abilitare l'utente delle tue classi di business (ad esempio l'interfaccia utente o il tuo sistema di registrazione) per fare qualcosa di più che segnalare all'utilizzatore che qualcosa non va.
Ora, come lo fai è completamente a te.
Decisione da fare: controlla tutto e quindi segnala tutti gli errori / avvertimenti / informazioni o fermati al primo che incontri. Personalmente, opterei per il primo e consentirò all'interfaccia utente di decidere come utilizzare le informazioni. Esiste comunque un compromesso: alcune convalide potrebbero richiedere più tempo di altre e potresti volerle controllare solo se le "semplici" riescono.
In ogni caso non utilizzerei eccezioni per farlo. Alcune persone usano eccezioni perché la maggior parte degli ambienti di sviluppo ha un buon modo di mostrare le eccezioni non gestite all'utente. Penso che sia solo una scelta cattiva / pigra. E non solo perché è difficile decidere da dove viene l'errore (anche se le tracce dello stack possono esserci d'aiuto), ma anche perché può (volere) lasciare l'app in uno stato imprevedibile e può causare errori in futuro. ancora più difficile da eseguire il debug.
Pertanto, tendo a riservare eccezioni per circostanze eccezionali. Cose che non avevo previsto. A mio avviso, la convalida non rientra in questa categoria: hai previsto tutti i problemi di convalida (attuali) o non li avresti convalidati.
Tutto sommato, codifico la convalida nelle classi dominio / business per raccogliere un array (o qualsiasi cosa mi interessi di usare) delle istanze di errore / avvertimento / suggerimento. Possono essere stringhe semplici, possono essere classi complete. Di solito restituisco sempre un'istanza al chiamante e mai un puntatore non assegnato. "Valido" è semplicemente indicato da un numero di messaggi pari a zero.