Le eccezioni devono essere espresse nel modello di dominio?

6

Diciamo che abbiamo una classe PersonName e lanciamo un'eccezione quando qualcuno tenta di creare un'istanza di PersonName che passa un nome non valido al costruttore. Dovrebbe essere espressa l'eccezione InvalidPersonName sul modello di dominio? E se dovrebbe, come dovrebbe essere rappresentato?

    
posta Lucas Piske 06.09.2016 - 02:24
fonte

4 risposte

3

Forse. Il modello di dominio deve esprimere quali errori esistono e possibilmente come dovrebbero essere gestiti. Tutto quel modello di dominio deve dirti che "il nome valido è XXX e l'utente deve avere un nome valido in ogni momento". Non ti dice come implementarlo realmente.

Le eccezioni sono modi linguaggio / framework specifici per esprimere questo tipo di errore e ci sono molti altri modi su come esprimere un'operazione non valida. Dovrebbe spettare allo sviluppatore decidere in che modo esprimere gli errori. Ma questa è una domanda diversa di eccezioni, monadi errori, ecc.

Personalmente, non userei eccezioni (a meno che non usi Eccezioni controllate ). Probabilmente utilizzerei il valore restituito per indicare se è possibile creare la struttura ValidName o che è possibile impostare Nome. Per esempio. Mi assicuro che il codice di chiamata sia pienamente consapevole del fatto che il nome non può essere valido. Quando si usano eccezioni non controllate, il programmatore che scrive codice chiamante potrebbe non essere a conoscenza di questo caso e non scrivere codice per gestirlo.

    
risposta data 06.09.2016 - 07:49
fonte
2

In generale, genera un'eccezione quando si verifica una condizione che il tuo codice non è in grado di ripristinare da solo.

Se fornisci un costruttore per un oggetto e il chiamante del costruttore può consegnare al costruttore alcuni dati che rendono impossibile costruire un oggetto valido e coerente, quindi lanciare un'eccezione è la risposta appropriata in quelle lingue che supportano le eccezioni .

Se la tua domanda include "dovrei creare un'eccezione personalizzata per ciascuna di tali occorrenze, la regola generale è" generalmente no. Utilizza solo alcune eccezioni generiche come InvalidOperationException o anche solo un'eccezione con una descrizione. "

    
risposta data 06.09.2016 - 03:08
fonte
1

Devi sempre ricordare che i modelli grafici sono creati al solo scopo di comunicare informazioni specifiche. A tale riguardo, non esiste una cosa come "dovrebbe" questo modello contenere "questa informazione" perché tutto dipende da quali informazioni si sta tentando di trasmettere al lettore in ogni diagramma specifico.

L'unica regola empirica è che ogni modello dovrebbe contenere le informazioni che stai cercando di comunicare in modo chiaro. Niente di più, niente di meno.

Spesso questa "regola generale" potrebbe portare a disporre di più diagrammi che descrivono più o meno la stessa cosa ma da diversi punti di vista. Ad esempio, un modello di dominio e un diagramma di classe. In superficie, questi potrebbero sembrare uguali o molto simili perché entrambi usano solitamente la notazione del diagramma di classe per rappresentarli e i nomi delle classi sono talvolta uguali. Tuttavia, un modello di dominio generalmente descrive oggetti di dominio "reali" mentre il diagramma di classe mostra le classi di implementazione del software utilizzate per implementare gli oggetti "reali". Sebbene ogni modello rappresenti essenzialmente la stessa cosa, ognuno di loro sta tentando di comunicare tipi di informazioni molto diversi.

Ogni diagramma mostra chiaramente le informazioni che sta cercando di trasmettere è molto più preferibile applicare forzatamente tutte le informazioni nello stesso diagramma e lasciarlo al lettore per decifrare tutte le informazioni nascoste nei dettagli.

Quindi, nel rispondere alla tua domanda sul fatto che le classi di eccezioni dovrebbero essere nel modello di dominio, allora questo sembra essere un ovvio no. Dovrebbe essere nel diagramma di classe? Devi decidere se questo è un concetto importante per il diagramma di classe che stai disegnando. Personalmente, generalmente non lo mostrerei in un diagramma di classe per un sottosistema. Tuttavia, se dovessi inserirlo in un diagramma, sarebbe un diagramma di classe di tutte le classi di eccezioni personalizzate create o utilizzate dal sistema. D'altra parte, se stavo creando una libreria di sottosistemi per l'uso da parte di altri (su un progetto completamente diverso), allora potrei considerare di mostrare la classe di eccezione nel diagramma di classe del sottosistema, ma probabilmente solo se ci fosse qualcosa di "speciale" su la classe di eccezione che penso che gli utenti dovrebbero essere a conoscenza.

Questo è probabilmente ridondante ma è abbastanza importante da reiterare esplicitamente. I diagrammi delle classi non hanno bisogno di mostrare ogni singola classe se la loro presentazione non fornisce un valore comunicativo utile. A volte, mostrare troppo è peggio che mostrare troppo poco perché troppe informazioni possono facilmente nascondere i concetti più importanti che il diagramma dovrebbe davvero provare a trasmettere.

    
risposta data 06.09.2016 - 17:38
fonte
0

Devi creare codice riutilizzabile. Per esempio. PersonNameExpception può essere applicato solo a PersonEntity. Cosa succede se si desidera aggiungere la stessa logica di convalida per un'altra entità? Da questo punto di vista le eccezioni dovrebbero essere più generiche. Come modello comune ci sono entità di dominio separate e regole di convalida separate che possono essere applicate alle entità. In java puoi cercare la convalida del bean JSR303 come esempio

    
risposta data 07.09.2016 - 10:38
fonte

Leggi altre domande sui tag