T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 1/20 Università degli Studi di Roma La Sapienza Facoltà di Ingegneria Corso di Laurea in Ingegneria Gestionale Corso di Progettazione del Software Proff. Toni Mancini e Monica Scannapieco Dipartimento di Informatica e Sistemistica Università di Roma La Sapienza E.P.1 Segreteria Studenti (SOLUZIONE) versione del February 25, 2008
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 2/20 Segreteria studenti: Requisiti L applicazione è relativa alla gestione di una segreteria studenti di un università. Quando gli studenti si iscrivono, vengono loro assegnati una matricola ed un numero di esami da fare. Successivamente decidono il proprio piano di studi, ovvero scelgono un corso (di cui interessa codice e nome) come loro i-mo esame (1 i numesami). La scelta del piano di studi può avvenire anche un solo esame alla volta. Gli studenti possono sostenere esami (solamente se sono nel loro piano di studi). Esistono tre categorie di studenti completamente disgiunte fra loro: regolari, stranieri e lavoratori. Degli stranieri interessa il paese di origine, mentre dei lavoratori interessa sapere da quanti anni lavorano. Infine, se uno studente ha sostenuto almeno una certa percentuale del numero di esami, relativamente al numero di quelli previsti in quel momento dal suo piano di studi, viene classificato come studente modello e può concorrere a prendere una borsa di studio. Suddetta percentuale dipende dalla tipologia dello studente: 100% per gli studenti regolari, 50% per quelli lavoratori, 70% per gli stranieri. La segreteria studenti, come cliente della nostra applicazione, deve poter effettuare delle operazioni sugli studenti. In particolare si faccia riferimento al seguente use-case: dato un insieme S di studenti, al fine di scegliere i destinatari delle borse di studio, si vuole ottenere l insieme di studenti in S tali che: (i) sono studenti modello e (ii) hanno la media più alta tra tutti gli altri studenti modello in S della loro categoria (regolare, straniero, lavoratore). Si noti che, per ogni categoria, vi possono essere diversi studenti con la media più alta (ovviamente la stessa).
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 3/20 Fase di Analisi
Diagramma degli use case T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 4/20
Diagramma delle classi T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 5/20
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 6/20 Specifica dello use case InizioSpecificaUseCase AssegnazioneBorse FineSpecifica (S : Insieme(Studente)): Insieme(Studente) pre: nessuna scegliborsisti post: L insieme result S conterrà tutti e soli gli studenti s S tali che: s.studentemodello() = true; Per ogni altro studente s S tale che s è della stessa classe più specifica di s e s.studentemodello() = true, si ha che s.media() s.media().
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 7/20 Specifica delle classi InizioSpecificaClasse Studente FineSpecifica (): booleano pre: nessuna studentemodello post: result è pari a true se e solo se this.sostenuto / this.pianodistudi x (con this.sostenuto e this.pianodistudi l insieme dei link di tipo, rispettivamente, sostenuto e pianodistudi relativi allo studente this). Il valore x dipende dalla sottoclasse di Studente alla quale appartiene this. media (): reale >= 0 pre: this.sostenuto 1; post: result è pari a Σ l this.sostenuto (l.voto) / this.sostenuto.
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 8/20 Specifica delle classi (cont.) InizioSpecificaClasse Regolare is-a Studente FineSpecifica (): booleano pre: nessuna studentemodello post: Quelle di Studente.studenteModello() con x = 1. InizioSpecificaClasse Straniero is-a Studente FineSpecifica (): boolean pre: nessuna studentemodello post: Quelle di Studente.studenteModello() con x = 0.7. InizioSpecificaClasse Lavoratore is-a Studente FineSpecifica (): boolean pre: nessuna studentemodello post: Quelle di Studente.studenteModello() con x = 0.5.
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 9/20 Fase di Progetto
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 10/20 Corrispondenza tra tipi UML e tipi Java Tipo UML Tipo Java Note Stringa String intero > 0 int Verifica ammissibilita sul lato server 18..31 int Verifica ammissibilita sul lato server booleano boolean reale >= 0 double (occorre solo come tipo di ritorno di operazioni) Insieme(... ) HashSet<... > Implementa l interf. Set Disponibile
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 11/20 Ristrutturazione gerarchie is-a La gerarchia avente come classe base Studente è disjoint e complete. Quindi: La classe Studente sarà dichiarata abstract Le classi Regolare, Straniero e Lavoratore deriveranno dalla classe Studente.
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 12/20 Specifiche realizzative delle classi SpecificaClasse Studente (abstract) +abstract studentemodello() : boolean (si noti il + : e pubblica) +media() : double pre: cf. spec. concettuale algoritmo: ovvio, cf. spec. concettuale FineSpecifica SpecificaClasse Regolare is-a Studente +studentemodello() : boolean pre: nessuna algoritmo: ovvio, cf. spec concettuale FineSpecifica (analogamente per Lavoratore e Straniero)
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 13/20 Progetto migliore per studentemodello() Dalle specifiche concettuali, si può notare come, sebbene il comportamento dell operazione studentemodello() dipenda dalla sottoclasse a cui this appartiene, si possa, a meno del valore del parametro x, scrivere l algoritmo a livello della classe Studente (e quindi evitare duplicazioni di codice, favorendo il riuso, e aumentando la coesione). La specifica diventa la seguente: SpecificaClasse Studente (abstract) +abstract studentemodello(): boolean #studentemodello(double x) : boolean (funzione di supporto. Si noti pre: nessuna il # : e protetta!) algoritmo: result = ( this.sostenuto / this.pianodistudi >= x ) +media() : double... (come sopra) FineSpecifica SpecificaClasse Regolare is-a Studente +studentemodello() : boolean pre: nessuna algoritmo: result = super.studentemodello(1.0) (invoco la funzione di supporto definita nella classe Studente fisssando il parametro) FineSpecifica
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 14/20 Specifica realizzativa dello use-case SpecificaRealizzativaUseCase AssegnazioneBorse +scegliborsisti(s: Set<Studente>) : Set<Studente> pre: nessuna algoritmo: result = insieme vuoto; per ogni s in S { se s.studentemodello()=true allora sia MM il valore della media piu alta fin ora incontrat per studenti della stessa classe piu specifica di s (alla prima iterazione, sia MM=-1). se s.media() = MM allora result = result U s; altrimenti, se s.media() > MM allora aggiorna il valore di MM portandolo ad s.media(); togli da result tutti gli elementi della stessa classe di s; result = result U s; (se s.media < MM, non fare nulla) } ritorna result; FineSpecifica
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 15/20 Nota: scegliborsisti() Nel caso avessimo scelto di non usare le interfacce generics del Java Collections Framework, avremmo avuto la seguente specifica realizzativa dell operazione scegliborsisti(): +scegliborsisti(s: Set) : Set pre: gli elementi di S sono istanze della classe Studente (cf. spec. concettuale, dove pre: nessuna, ma il tipo di S e Insieme(Studente)!!) algoritmo:...
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 16/20 Gestione proprietà loc. e glob. d. classi Classe Studente Classe Straniero matricola: immutabile, nota alla nascita numesamiinpiano: immutabile, non noto alla nascita paese: immutabile, noto alla nascita Classe Lavoratore Classe Corso annoiniziolavoro: immutabile, noto alla nascita nome: mutabile, noto alla nascita codice: immutabile, noto alla nascita Associazione PianoDiStudi numordine: mutabile, noto alla nascita Associazione Sostenuto voto: immutabile, noto alla nascita Nota: E sufficiente esplicitare queste decisioni nel diagramma realizzativo delle classi!
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 17/20 Vincoli sull evoluz. d. propr. mutabili Il valore delle proprietà mutabili può variare arbitrariamente, tranne che per le seguenti: Associazione PianoDiStudio: un link s : Studente, c : Corso con s, c.numordine = i può essere creato solo se tutte le seguenti condizioni sono verificate: Non esiste già un link s, c, con c Corso per cui s, c.numordine = i; Se i > 1, esiste già un link s, c, con c Corso per cui s, c.numordine = i 1; i s.numesami; (cf. i commenti nel diagramma concettuale delle classi) Inoltre: Un link s : Studente, c : Corso di associazione PianoDiStudio può essere cancellato solo se non esiste alcun link s, c di associazione Sostenuto (vincolo di subset, cf. diagramma concettuale delle classi); In caso di cancellazione di un link s : Studente, c : Corso con s, c.numordine = i di associazione PianoDiStudio, per tutti i link s, c di associazione PianoDiStudio con c Corso e s, c.numordine = j > i, il valore j dell attributo numordine va sostituito con j 1. Associazione Sostenuto: un link s : Studente, c : Corso può essere creato solo se esiste già un link s, c di associazione PianoDiStudio (vincolo di subset ). Inoltre, i link di associazione Sostenuto non possono essere cancellati.
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 18/20 Progetto dei diagrammi degli stati Non sono stati isolati diagrammi degli stati in fase di Analisi.
T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 19/20 Responsabilità sulle associazioni Dai requisiti, dalla specifica delle operazioni di classi e di use case, e delle molteplicità nel diagramma delle classi emerge che: Associazione Classe Ha resp? Motivo PianoDiStudi Studente SI Studente.studenteModello() Corso NO Sostenuto Studente SI Studente.studenteModello()/media() Corso NO
Diagramma delle classi realizzativo T. Mancini & M. Scannapieco E.P.1 Segreteria Studenti (SOLUZIONE) February 25, 2008 p. 20/20