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:

  1. raffinare la specifica dei requisiti eliminando inconsistenze, omissioni o ridondanze e produrre un elenco numerato di requisiti il meno ambiguo possibile
  2. 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 attributi data_inizio e data_fine, altrimenti l'utilizzo della classe non regge in questo contesto)
  • Usare il tipo Stringa per l'attributo telefono 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'attributo telefono 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