Prima di tutto, penso che la convalida sia in qualche modo un argomento sfuggente dovuto in parte ai vari contexts all'interno dei quali deve essere considerato. In definitiva, ci saranno regole di validazione eseguite a vari livelli dell'applicazione. Per lo meno, dovrebbero esserci guardie standard negli oggetti del dominio. Questi sono solo regolari controlli preliminari e argomentativi che dovrebbero far parte di qualsiasi oggetto ben progettato e si adattano alla tua opinione per il metodo Reigster
. Come affermato da lazyberezovsky, questo è per impedire che gli oggetti entrino in uno stato non valido. Mi schiero con la scuola sempre valida di se su questo. Penso che se è necessario mantenere le entità in uno stato non valido, è necessario creare una nuova entità per questo scopo.
Un problema con questo approccio, tuttavia, è che spesso è necessario esportare queste regole di convalida in altri livelli, ad esempio in un livello di presentazione. Inoltre, nel livello di presentazione, le regole devono essere formattate in modo diverso. Devono essere presentati tutti in una volta e potenzialmente tradotti in un'altra lingua, come JavaScript per il feedback immediato sul cliente. Può essere difficile o poco pratico tentare di estrarre le regole di convalida dalle eccezioni generate da una classe. In alternativa, le regole di convalida possono essere ricreate a livello di presentazione. Questo è molto più semplice e anche se potenzialmente violando DRY consente alle regole di essere dipendenti dal contesto. Un flusso di lavoro specifico può richiedere regole di convalida diverse rispetto a quelle imposte dall'entità stessa.
L'altro problema con l'approccio descritto è che possono esistere regole di convalida che esistono al di fuori dell'ambito di un'entità e che queste regole devono essere consolidate insieme alle altre regole. Ad esempio, per la registrazione degli utenti, un'altra regola è garantire che l'indirizzo di posta elettronica sia unico. Il servizio applicativo che ospita il caso d'uso applicabile generalmente applica questa regola. Tuttavia, deve anche essere in grado di esportare questa regola su altri livelli, come la presentazione.
Nel complesso, provo a inserire tanti controlli di vincoli nelle entità stesse perché penso che le entità dovrebbero essere sempre valide.A volte è possibile progettare la struttura delle regole in modo tale che possa essere utilizzata sia per aumentare le eccezioni sia per esporla ai livelli esterni. Altre volte è più semplice replicare semplicemente le regole tra i livelli.
Register() inizializza semplicemente l'utente con dati quali password, e-mail, data di registrazione, stato di registrazione. Non chiamerà repository. Questa è la responsabilità di alcuni servizi di applicazioni di sicurezza. Ma questo non è il problema principale qui. Ho appena fornito un esempio di un'operazione di entità e ho cercato di analizzare dove collocare la convalida. – Markus
@Markus Penso che il nome di questo metodo sia confuso :) –