Modellazione orientata agli oggetti dell'applicazione aziendale per utente e ruolo

2

Generalmente nelle applicazioni Enterprise come ERP o ERM, CRM, BP ecc. vediamo due cose molto, una di esse è Ruolo e l'altra è Utente. Quello che succede è che nel mondo reale abbiamo alcune persone come Udienze dell'Organizzazione e anche noi abbiamo alcuni ruoli che ogni persona fa il suo dovere in quel ruolo. In realtà ogni persona ha le sue informazioni nel suo file, dipende dal ruolo che ha. Nota che una persona può avere più di un ruolo.

La domanda è: come possiamo modellare questo argomento come punto di vista OO (Object Oriented)?

Un modo è che abbiamo una gerarchia di ereditarietà degli utenti che ognuno ha i propri dati e i propri comportamenti (ad esempio in una clinica abbiamo un medico, un paziente e un segretario che tutti sono derivati dall'utente). ha una lista di ruoli. In questo caso i ruoli sono più probabili a Enum e non hanno alcun comportamento e il loro uso principale è il controllo degli accessi.

Il problema di questo metodo è che se una persona reale desidera avere ruoli diversi e questo problema è completamente dinamico, la modellazione di questo non sarebbe chiara.

Il secondo metodo è che abbiamo un utente e una gerarchia ereditaria di ruoli che ogni ruolo ha il proprio dovere. Assegniamo questo ruolo agli utenti. In realtà vediamo i ruoli nel programma e il principale operante per noi sono i ruoli.

Il problema di questo metodo è che per alcuni ruoli è necessario che gli utenti abbiano altre informazioni personali (ad esempio sul medico, il campo di studi dovrebbe essere definito) e non è chiaro dove dovremmo conservare questi dati.

Il terzo metodo che non è ovvio per noi è una combinazione dei due metodi sopra.

    
posta sorosh_sabz 11.02.2015 - 16:30
fonte

3 risposte

1

Perché non separi i concetti?

Avere un contesto limitato per gestire l'identità dell'utente. Questo BC avrà tutti i dati relativi alla persona stessa. Questo dovrebbe rispondere "Chi è quell'utente?"

Avere un altro BC per controllare i ruoli che ogni utente ha. Questo BC sarà responsabile della risposta "Questo utente è autorizzato a farlo?"

E un terzo BC per le operazioni di cui hai bisogno l'entità. Ora hai 3 modelli per lo stesso concetto, ma in diversi contesti. Questo può sembrare davvero complicato, ma ogni BC ha una definizione chiara di cosa sia l'entità (attributi diversi) e cosa può fare (le sue responsabilità)

Ciò che è pericoloso del tuo approccio è che un'entità avrà molte responsabilità. Ciò viola il Principio di Responsabilità Unica e andrà fuori mano molto velocemente una volta che le applicazioni cresceranno in modo significativo.

    
risposta data 11.02.2015 - 20:39
fonte
0

One way is that we have an Inheritance Hierarchy of Users which each one has his own data and his own behaviors (for example in one clinic we have doctor, patient and Secretary that all of them are derived of the user.)

Questo è IMHO non un buon approccio. Hai persone (IMHO un termine migliore di "utenti"), e "dottore", "paziente" e "segretario" sono chiaramente ruoli di una persona, perché una persona può essere simultaneamente un medico, un paziente e / o una segretaria.

Second method is that we have one user

Lo chiamerei una persona ...

and an Inheritance Hierarchy of roles

... sì se i tuoi ruoli derivano da una classe di "ruolo" comune. Ora puoi avere una relazione 1: n tra persone e ruoli.

... The problem of this method is that for some roles it is necessary that users have other personal information (for example about the doctor the field of study should be defined.) and it is not clear that where we should store these data.

Questo dipende. A prima vista, un "campo di studio" è una qualifica personale. Lo ottieni indipendentemente dall'essere un Dottore, forse in un altro momento. Quindi la soluzione naturale sembra essere una relazione 1: n tra "persona" e un oggetto di qualificazione (o un oggetto "Campo di studio", se questa è l'unica forma di qualifica che è necessario memorizzare).

Se hai davvero bisogno di queste informazioni esclusivamente per i medici, e solo fino a quando il ruolo "Dottore" è assegnato a una persona specifica, allora puoi assegnarlo all'oggetto Medico, ma non lo consiglierei. La dipendenza funzionale "ogni dottore ha bisogno di avere un campo di studio" può essere applicata dall'applicazione circostante, come parte del processo di assegnazione del ruolo, non è obbligatorio rendere "Field of Study" un attributo di "Doctor" per questo scopo .

EDIT: ecco un esempio di diagramma di classe come scetch approssimativo, probabilmente alcuni dettagli non corrispondono ai tuoi requisiti esatti, ma spero che tu abbia un'idea generale:

    
risposta data 11.02.2015 - 20:40
fonte
0

In primo luogo, congratulazioni per aver riconosciuto che l'eredità è una scelta sbagliata in questa situazione. Sei corretto al 100% Cambiare il tipo di un'entità in fase di esecuzione è sicuramente l'odore del codice!

@Doc La risposta di Brown sta entrando nel vivo della questione, in particolare il commento sull'utilizzo di Person piuttosto che su User, e consentendo un 1: many tra Person e ruoli.

Ciò che manca qui è il periodo per il quale il ruolo è valido. Ad esempio, un medico può anche diventare un paziente nella mezza età e il ruolo del paziente può essere valido dopo che si ritira da medico. Allo stesso modo, una persona può essere un dipendente più volte e può essere un manager per uno o più periodi. Il take-out è che i ruoli sono limitati nel tempo e in quanto tali richiedono la propria entità nel modello.

Vedo che sei preoccupato per la complessità, e questo è naturale. La mia esperienza è stata che se si ottiene la modellazione dei dati corretta al 100%, allora c'è poca complessità. I casi speciali che richiedono decine di righe di codice scompaiono - il modello riflette la realtà. Ad esempio, sarà in grado di rispondere a domande abbastanza complesse come "quali sono i medici ancora impiegati nello staff che erano medici dello staff durante l'epidemia di Ebola nel 2014?"

Il guru in questa area di modellazione è Peter Coad. Suggerisco link come presentazione adeguata alle sue idee.

    
risposta data 12.02.2015 - 09:17
fonte