Azienda 1
Si vuole sviluppare un sistema informativo per la gestione dei dati sul personale di una certa azienda costituita da diversi dipartimenti. Durante la fase di raccolta dei requisiti è stata prodotta la specifica dei requisiti mostrata di seguito. Si chiede di iniziare la fase di Analisi dei requisiti ed in particolare di:
- raffinare la specifica dei requisiti eliminando inconsistenze, omissioni o ridondanze e produrre un elenco numerato di requisiti il meno ambiguo possibile
- produrre un diagramma UML delle classi concettuale che modelli i dati di interesse, utilizzando solo i costrutti di
classe
,associazione
,attributo
Requisiti
I dati di interesse per il sistema sono impiegati, dipartimenti, direttori dei dipartimenti e progetti aziendali.
-
Di ogni impiegato interessa conoscere il nome, il cognome, la data di nascita e lo stipendio attuale, il dipartimento al quale afferisce (esattamente uno, con la rispettiva data di afferenza).
-
Di ogni dipartimento interessa conoscere il nome, il numero di telefono del centralino
- Di ogni dipartimento interessa conoscere inoltre il direttore, che è uno degli impiegati dell’azienda.
-
Il sistema deve permettere di rappresentare i progetti aziendali nei quali sono coinvolti i diversi impiegati.
-
Di ogni progetto interessa il nome ed il budget.
-
Ogni impiegato può partecipare ad un numero qualsiasi di progetti.
UML (opzione 1)
Osservazioni
Questa è l'opzione più "complessa"
- Un dipartimento non deve avere per forza un dirigente assegnato (quindi
0..1
) - Un impiegato può dirigere più dipartimenti (non afferisce al dipartimento che dirige, ci potrebbe essere un dipartimento apposta per i dirigenti, quindi
0..*
) - La classe
Afferenza
ci serve per tenere uno storico dei dipartimenti in cui ha lavorato un impiegato - Usiamo la classe
Partecipazione
per i progetti perché un impiegato può lavorare ad un progetto più volte in periodi diversi di tempo (N.B. è fondamentale avere come attributidata_inizio
edata_fine
, altrimenti l'utilizzo della classe non regge in questo contesto) - Usare il tipo
Stringa
per l'attributotelefono
non va bene, ma la soluzione originale lo includeva e preferisco attenermi a quella
classDiagram class Impiegato { nome: Stringa cognome: Stringa data_di_nascita: Data stipendio: Razionale >= 0 } class Impiegato["fa:fa-users Impiegato"] class Dipartimento { nome: Stringa telefono: Stringa } class Dipartimento["fa:fa-building Dipartimento"] class Afferenza { data: Data } class Progetto { nome: Stringa budget: Razionale >= 0 } class Progetto["fa:fa-wrench Progetto"] class Partecipazione { data_inizio: Data data_fine: Data } Impiegato "1..1" -- "0..*" Partecipazione : impiegato_partecipante Partecipazione "0..*" -- "1..1" Progetto : progetto_partecipazione Impiegato "0..1" -- "0..*" Dipartimento : dirige Afferenza "1..*" -- "1..1" Impiegato : impiegato_afferente Afferenza "0..*" -- "1..1" Dipartimento : dipartimento_afferenza
UML (opzione 2)
Osservazioni
Questa è l'opzione più "minimale"
- Un dipartimento non deve avere per forza un dirigente assegnato (quindi
0..1
) - Un impiegato può dirigere al più un dipartimento
- L'impiegato afferisce ad un solo dipartimento, quindi possiamo mettere la
data_di_afferenza
come attributo dell'impiegato - Un dipendente o partecipa ad un determinato progetto o non vi partecipa, la relazione è binaria e non serve una classe
- Usare il tipo
Stringa
per l'attributotelefono
non va bene, ma la soluzione originale lo includeva e preferisco attenermi a quella
classDiagram class Impiegato { nome: Stringa cognome: Stringa data_di_nascita: Data stipendio: Razionale >= 0 data_di_afferenza: Data } class Impiegato["fa:fa-users Impiegato"] class Dipartimento { nome: Stringa telefono: Stringa } class Dipartimento["fa:fa-building Dipartimento"] class Progetto { nome: Stringa budget: Razionale >= 0 } class Progetto["fa:fa-wrench Progetto"] Impiegato "0..*" -- "0..*" Progetto : partecipa a Impiegato "0..1" -- "0..1" Dipartimento : dirige Impiegato "0..*" -- "1..1" Dipartimento : afferisce a