Articoli Manifesto Tools Links Canali Libri Contatti ?
SIForge / GaraGuru / .1

GaraGuru .1: Sfida 3, Classe ad oggetti

Abstract
Modellate il funzionamento di una scuola statale italiana.
Nella scuola vi sono un numero indefinito di sezioni (A, B, C, ecc) ognuna con 5 classi (es. 1B, 2B, ecc).
In ogni classe vi sono tra i 15 e i 30 alunni.
Ogni classe ha almeno 2 docenti assegnati.
Ogni studente si sorbisce 5 ore al giorno di lezione, per sei giorni.
Data di stesura: 15/06/2004
Data di pubblicazione: 22/11/2004
Ultima modifica: 04/04/2006
di Luigi Malagò Discuti sul forum   Stampa

Architettura generale

Per modellare il funzionamento di una scuola statale italiana ho progettato con UML una architettura ad oggetti, in quanto questo approccio, oltre a facilitare la modellazione concettuale del sistema, è quello che permette una migliore corrispondenza tra oggetti del modello e del mondo reale.

Ho deciso successivamente di implementare il modello in Java, perché è uno dei linguaggi di programmazione orientati agli oggetti più conosciuti ed è indipendente dalla piattaforma di sviluppo utilizzata.
Inoltre, data la facilità di lettura del codice, è particolarmente adatto alla creazione di esempi di immediata comprensione, come si richiede nel caso che stiamo affrontando. Infine permettetemi di aggiungere che... "Java is fun!".

[Figura 1]

Figura 1: Diagramma delle classi

Successivamente verrà utilizzata più volte la parola classe. Dato il particolare dominio applicativo con cui si ha a che fare, quello di una scuola, la parola assume significati diversi a seconda del contesto: in particolare si faccia attenzione a non confondere la classe intesa come tipo di dato con quella intesa come insieme di alunni. Per maggiore chiarezza i nomi delle classi Java verranno evidenziati in corsivo.

L'architettura generale proposta è costituita da diverse classi che posso essere logicamente raggruppate nel seguente modo:

Scuola, Sezione, Classe

La classe Scuola è la classe principale, che costituisce il cuore dell'architettura: infatti il punto di partenza per ogni esempio e test case presentato è un oggetto di tipo Scuola che funge da contenitore per tutti gli altri oggetti istanziati dall'utente.

Questa classe modella la scuola vera e propria, intesa come collezione di sezioni (A, B, C..), a loro volta le sezioni sono costituite da classi (I, II, III..). Ciascuna Classe contiene istanze di oggetti diversi, in particolare gli alunni iscritti, i professori che vi insegnano e un registro che permette di ottenere l'elenco delle presenze in ordine alfabetico.

Ognuna di queste classi ha dei metodi per aggiungere/rimuovere elementi alle collezioni, in questo modo risulta possibile creare o eliminare nuove sezioni e nuove classi dalla scuola e gestire gli alunni di ciascuna classe.

  1. Scuola scuola = new Scuola("Liceo Scientifico Belfiore"); 
  2.  
  3. Sezione pni = new Sezione("A","Piano nazionale informatico"); 
  4. Sezione bilinguismo = new Sezione("B","Sperimentazione inglese-spagnolo"); 
  5.  
  6. scuola.aggiungiSezione(pni); 
  7. scuola.aggiungiSezione(bilinguismo); 
  8.  
  9. Classe primaA = new Classe(1); 
  10. Classe secondaA = new Classe(2); 
  11.  
  12. pni.aggiungiClasse(primaA); 
  13. pni.aggiungiClasse(secondaA); 

L'utente può accedere direttamente ai costruttori di queste classi e costruire la struttura della scuola aggiungendo gli oggetti istanziati alle rispettive collezioni.

Persona, Studente, Professore

Queste classi rappresentano gli individui facenti parte del dominio applicativo, si noti che Persona è super classe di Studente e di Professore.

All'esterno del package scuola non è possibile istanziare direttamente oggetti di tipo Studente e Professore, ma per farlo bisogna passare attraverso l'oggetto Segreteria che svolte il ruolo di factory e permette di assegnare matricole univoche agli studenti e ai professori.

  1. GregorianCalendar calendar = new GregorianCalendar(1982,2,22); 
  2. Persona luigi = new Persona("Luigi", "Malagò", calendar.getTime(),"LGMLG32E65ZXE"); 
  3. Persona mario = new Persona("Paolo", "Verdi", calendar.getTime(),"PLVRD54E78E0C"); 
  4. 		 
  5. Studente studLuigi = segreteria.iscriviStudente(luigi); 
  6. Studente studMario = segreteria.iscriviStudente(mario); 

Questa scelta è dovuta al fatto che nel modello non viene affrontato il problema della persistenza dei dati: gli oggetti vengono sempre creati ex-novo e non caricati da un archivio. È perciò necessario occuparsi direttamente del compito di assegnare ID univoci, impedendo all'utente la creazione diretta degli oggetti, attraverso l'inserimento di un componente intermedio che ne controlli l'istanziazione.

Segreteria, GestioneStudenti, GestioneProfessori, ConsiglioDiClasse

La Segreteria è una sorta di contenitore per le funzionalità più specifiche relative alla gestione dei professori e degli studenti. Per poter inserire una persona in una classe, o associare una persona come professore di una data materia è necessario prima passare per la Segreteria: bisogna registrare lo studente o il professore e creare a partire da un oggetto Persona rispettivamente oggetti di tipo Studente o Professore.

GestioneStudenti e GestioneProfessori sono le classi che in dettaglio si occupano di gestire l'elenco dei professori e degli alunni iscritti alla scuola, questi oggetti sono contenuti all'interno della Segreteria che li maschera all'utente finale.

  1. Persona andrea = new Persona("Andrea","Rossi", calendar.getTime(),"RSSPL51WLD0EW"); 
  2. Professore profAndrea = segreteria.assumiProfessore(andrea); 
  3.  
  4. Materia italiano = new Materia("italiano","letteratura italiana"); 
  5.  
  6. profAndrea.aggiungiMateria(italiano); 
  7. profAndrea.aggiungiClasse(primaA); 

La classe ConsiglioDiClasse si occupa della promozione/bocciatura a fine anno dei vari alunni. Rispetto alla classe Segreteria si colloca ad un livello di astrazione più alto, in quanto implementa funzioni di granularità maggiore, combinando le funzionalità di base della Segreteria e di ciascuna Classe.

  1. // questi esempi che riguardano il ConsiglioDiClasse mostrano le operazioni di  
  2. // bocciatura e di promozione a fine anno che coinvolgono eliminazione e 
  3. // inserimento di alunni in nuove classi 
  4. 			 
  5. ConsiglioDiClasse consiglio1A = primaA.getConsiglioDiClasse(); 
  6. consiglio1A.bocciaStudente(studMario); 
  7.  
  8. consiglio1A.promuoviStudente(studLuigi,secondaA); 
  9. 				 
  10. ConsiglioDiClasse consiglio1B = primaB.getConsiglioDiClasse(); 
  11. consiglio1B.bocciaStudente(studAnna,primaA); 
  12. 			 
  13. ConsiglioDiClasse consiglio5B = quintaB.getConsiglioDiClasse(); 
  14. consiglio5B.diplomaStudente(studPaolo); 
  15.  
  16. // questi esempi a differenza di quello che avviene col ConsiglioDiClasse 
  17. // mostrano aggiunta e rimozioni di studenti non a causa di promozioni o bocciature 
  18. // ma a causa di ritiri o arrivo di nuovi studenti durante l'anno 
  19. 		 
  20. primaA.aggiungiStudente(studLuigi); 
  21. primaA.rimuoviStudente(studLuigi.getMatricola()); 

Materie

Gli oggetti di tipo Materia costituiscono le materie che vengono insegnate da ciascun professore. Per ogni materia è possibile ricavare i professori che la insegnano, così come per ogni professore è possibile ricavare le materie che questo insegna.

Eccezioni

Sono state definite diversi tipi di eccezioni personalizzate per evidenziare problemi che si possono verificare a runtime quando ad esempio si cerca di inserire due volte lo stesso alunno in una classe o di associare la stessa materia due volte allo stesso professore.

Test

All'intero del progetto c'è una classe di test molto dettagliata che va oltre le richieste delle specifiche, ma che permette di vedere molto chiaramente come utilizzare le varie classi implementate nel progetto.

[Figura 2]

Figura 2: TestCase

Nei test sono stati utilizzati praticamente tutti i metodi implementati, in particolar modo ci sono esempi di gestione di inserimenti e casi di ritiri di studenti durante l'anno, così come esempi di promozioni e bocciature a fine anno.

Il codice seguente mostra lo use case dell'appello giornaliero all'interno di una classe, si noti come l'ordine degli studenti nella lista è indipendente dall'ordine di inserimento.

  1. System.out.println("---Appello del giorno---"); 
  2. ArrayList elenco = primaA.appello(); 
  3. for (int i=0;i<elenco.size();i++) { 
  4.     System.out.println((i+1) + ". " + ((Studente)elenco.get(i)).toString()); 

output

---Appello del giorno---
1. Bianchi Anna
2. Malagò Luigi
3. Moroni Paolo
4. Verdi Paolo

Possibili ampliamenti

Il progetto si presta a essere ampliato in molto suoi aspetti, in particolare si potrebbe modellare l'orario settimanale per ogni classe, mettendo in evidenza le varie lezioni tenute da ogni professore.

Un altro aspetto che si presta ad un approfondimento è quello del registro dei voti di ogni professore, con la data di un compito o di una interrogazione per ogni classe.

Inoltre sarebbe utile rendere i dati persistenti, realizzando funzionalità per il salvataggio e caricamento dei dati da collocare ad un livello sottostante a quello del modello logico.

Infine si potrebbe creare una interfaccia grafica che permetta di istanziare gli oggetti in modo semplice ed intuitivo, in modo da creare, con i dovuti ampliamenti, una applicazione utile alla Segreteria di una scuola per la gestione degli alunni e del personale.

Informazioni sull'autore

Luigi Malagò, laureando in Ingegneria Informatica al Politecnico di Milano. Ha realizzato applicazioni web con diverse tecnologie quali PHP, ASP e da ultimo ASP.NET. Sostenitore dell'Open Source e appassionato di programmazione, i suoi interessi principali riguardano i Design Pattern e la progettazione del software con UML. Attualmente sta sviluppando una tesi sui Sematic Web Services.

È possibile consultare l'elenco degli articoli scritti da Luigi Malagò.

Altri articoli sul tema SIForge / GaraGuru / .1.

Risorse

  1. I sorgenti del progetto.
    http://www.siforge.org/articles/2004/11/classe_ad_oggetti/src.zip (47Kb)
  2. Bando della prima edizione di GaraGuru.
    http://www.siforge.org/articles/2004/05/10-garaguru.html
Discuti sul forum   Stampa

Cosa ne pensi di questo articolo?

Discussioni

Questo articolo o l'argomento ti ha interessato? Parliamone.