13 Template
13 Template
“Programmazione ad Oggetti”
Danilo Pianini
4 febbraio 2025
Sommario
Questo documento è una relazione di meta livello, ossia una relazione che
spiega come scrivere la relazione. Lo scopo di questo documento è quello di
aiutare gli studenti a comprendere quali punti trattare nella loro relazione, ed
in che modo farlo, evitando di perdere del tempo prezioso in prolisse discus-
sioni di aspetti marginali tralasciando invece aspetti di maggior rilievo. Per
ciascuna delle sezioni del documento sarà fornita una descrizione di ciò che
ci si aspetta venga prodotto dal team di sviluppo, assieme ad un elenco (per
forza di cose non esaustivo) di elementi che non dovrebbero essere inclusi.
Il modello della relazione segue il processo tradizionale di ingegneria del
software fase per fase (in maniera semplificata). La struttura della relazione
non è indicativa ma obbligatoria. Gli studenti dovranno produrre un docu-
mento che abbia la medesima struttura, non saranno accettati progetti la cui
relazione non risponda al requisito suddetto. Lo studente attento dovrebbe
sforzarsi di seguire le tappe suggerite in questa relazione anche per l’effettivo
sviluppo del progetto: oltre ad una considerevole semplificazione del processo
di redazione di questo documento, infatti, il gruppo beneficerà di un processo
di sviluppo più solido e collaudato, di tipo top-down.
La meta-relazione verrà fornita corredata di un template LATEX per coloro
che volessero cimentarsi nell’uso. L’uso di LATEX è vantaggioso per chi ama
l’approccio “what you mean is what you get”, ossia voglia disaccoppiare il
contenuto dall’effettivo rendering del documento, accollando al motore LATEX
l’onere di produrre un documento gradevole con la struttura ed il contenuto
forniti. Chi non volesse installare l’ambiente di compilazione in locale può va-
lutare l’utilizzo dell’applicazione web Overleaf. L’eventuale utilizzo di LATEX
non è fra i requisiti, non è parte del corso di Programmazione ad Oggetti, e
non sarà ovviamente valutato. I docenti accetteranno qualunque relazione in
formato standard Portable Document Format (pdf), indipendentemente dal
software con cui tale documento sarà redatto.
Per la realizzazione degli schemi UML, si raccomanda l’utilizzo di Mermai-
dJS1 o PlantUML 2 . Gli schemi in questa relazione furono realizzati con Sta-
rUML. Come per la prosa, non è importante quale strumento sia utilizzato,
ma è vitale che gli schemi siano di buona qualità e ben leggibili.
1
[Link]
2
[Link]
Indice
1 Analisi 2
1.1 Descrizione e requisiti . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Modello del Dominio . . . . . . . . . . . . . . . . . . . . . . . 4
2 Design 7
2.1 Architettura . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Design dettagliato . . . . . . . . . . . . . . . . . . . . . . . . . 9
3 Sviluppo 19
3.1 Testing automatizzato . . . . . . . . . . . . . . . . . . . . . . 19
3.2 Note di sviluppo . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.2.1 Esempio . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4 Commenti finali 24
4.1 Autovalutazione e lavori futuri . . . . . . . . . . . . . . . . . . 24
4.2 Difficoltà incontrate e commenti per i docenti . . . . . . . . . 24
A Guida utente 26
B Esercitazioni di laboratorio 27
B.0.1 [Link]@[Link] . . . . . . . . . . . . 27
B.0.2 [Link]@[Link] . . . . . . . . . . . 27
1
Capitolo 1
Analisi
In questo capitolo andrà fatta l’analisi dei requisiti e quella del problema,
ossia verranno elencate le cose che l’applicazione dovrà fare (requisiti) e verrà
descritto il dominio applicativo (analisi del problema). In fase di analisi, è
molto importante tenere a mente che non vi deve essere alcun riferimento
al design né tantomeno alle tecnologie implementative, ovvero, non si deve
indicare come il software sarà internamente realizzato. La fase di analisi,
infatti, precede qualunque azione di design o di implementazione.
Elementi positivi
• Si fornisce una descrizione in linguaggio naturale di ciò che il software
dovrà fare.
2
Elementi negativi
• Si forniscono indicazioni circa le soluzioni che si vogliono adottare.
Esempio
Il software, commissionato dal centro di ricerca “Aperture Laboratories Inc.”1 ,
mira alla costruzione di una intelligenza artificiale di nome GLaDOS (Genetic
Lifeform and Disk Operating System). Per intelligenza artificiale si intende
un software in grado di assumere decisioni complesse in maniera semi autono-
ma sugli argomenti di sua competenza, a partire dai vincoli e dagli obiettivi
datigli dall’utente. In questo caso particolare, l’intelligenza artificiale do-
vrà interagire con un soggetto umano e guidarlo attraverso il superamento
di una serie di labirinti di difficoltà incrementale. I labirinti potrebbero ri-
chiedere l’uso di oggetti, la pressione di pulsanti, l’azionamento di leve, o
la costruzione di portali per il teletrasporto. Un portale per il teletrasporto
è un’apertura bidimensionale nel tessuto spazio-temporale, che consente a
chiunque vi entri di uscire dall’altro portale. I rompicapi sono di tipo fisico
(ad esempio, manipolazione di oggetti, pressione di pulsanti, azionamento di
leve), e si ritengono conclusi una volta che il soggetto riesce a trovare l’uscita
dalla camera di test. Alla conclusione di tutti i labirinti, al soggetto verrà
offerta una torta. . . . Or not. The cake is a lie!
Requisiti funzionali
• Il piano preciso ed il numero delle sfide sarà variabile, e GLaDOS dovrà
essere in grado di adattarsi dinamicamente e di fornire indicazioni di
guida.
3
Requisiti non funzionali
• GLaDOS dovrà essere estremamente efficiente nell’uso delle risorse. Le
specifiche tecniche parlano della possibilità di funzionare su dispositivi
alimentati da una batteria a patata.
Elementi positivi
• Si modella il dominio in forma di UML.
Elementi negativi
• Manca una descrizione a parole del modello del dominio.
4
• Manca una descrizione UML delle entità del dominio e delle relazioni
che intercorrono fra loro.
Esempio
GLaDOS dovrà essere in grado di accedere ad un’insieme di camere di te-
st. Tale insieme di camere prende il nome di percorso. Ciascuna camera
è composta di challenge successivi. GLaDOS è responsabile di associare a
ciascun challenge un insieme di consigli (suggestions) destinati all’utente (su-
bject), dipendenti da possibili eventi. GLaDOS dovrà poter comunicare coi
locali cucina per approntare le torte. Le torte potranno essere dolci, oppure
semplici promesse di dolci che verranno disattese. Gli elementi costitutivi il
problema sono sintetizzati in Figura 1.1.
Data la complessità di elaborare consigli via AI senza intervento umano,
la prima versione del software fornita prevederà una serie di consigli forniti
dall’utente. Il requisito non funzionale riguardante il consumo energetico
richiederà studi specifici sulle performance di GLaDOS che non potranno
essere effettuati all’interno del monte ore previsto: tale feature sarà oggetto
di futuri lavori.
5
«interface» «interface» «interface» «interface»
Suggestion Event Personality Kitchen
(from entity)
+orderCake(): Cake
«interface» «interface»
AI Cake
+setPersonality(personality: Personality) +isALie(): boolean
+registerView(view: Output)
+computeSuggestion(s: Subject, e: Event): Suggestion
+registerInputSource(in: Input)
+addKitchen(kitchen: Kitchen) «interface»
Challenge
«interface»
«interface»
Subject
Chamber
+getPath(): Path
+getChallenges(): List<Challenge>
+getCurrentChamber(): Chamber
+getCurrentChallenge(): Challenge
«interface»
Path
+getChambers(): List<Chamber>
6
Capitolo 2
Design
2.1 Architettura
Questa sezione spiega come le componenti principali del software interagi-
scono fra loro. In particolare, qui va spiegato se e come è stato utilizzato
il pattern architetturale model-view-controller (e/o alcune sue declinazioni
specifiche, come entity-control-boundary).
Se non è stato utilizzato MVC, va spiegata in maniera molto accurata
l’architettura scelta, giustificandola in modo appropriato.
Se è stato scelto MVC, vanno identificate con precisione le interfacce e
classi che rappresentano i punti d’ingresso per modello, view, e controller.
Raccomandiamo di sfruttare la definizione del dominio fatta in fase di ana-
lisi per capire quale sia l’entry point del model, e di non realizzare un’unica
macro-interfaccia che, spesso, finisce con l’essere il prodromo ad una “God
class”. Consigliamo anche di separare bene controller e model, facendo at-
tenzione a non includere nel secondo strategie d’uso che appartengono al
primo.
In questa sezione vanno descritte, per ciascun componente architetturale
che ruoli ricopre (due o tre ruoli al massimo), ed in che modo interagisce (os-
7
sia, scambia informazioni) con gli altri componenti dell’architettura. Racco-
mandiamo di porre particolare attenzione al design dell’interazione fra view
e controller: se ben progettato, sostituire in blocco la view non dovrebbe
causare alcuna modifica nel controller (tantomeno nel model).
Elementi positivi
• Si mostrano pochi, mirati schemi UML dai quali si deduce con chiarezza
quali sono le parti principali del software e come interagiscono fra loro.
Elementi negativi
• L’architettura è fatta in modo che sia impossibile riusare il modello per
un software diverso che affronta lo stesso problema.
• Si presentano schemi UML con classi (nel senso UML del termine) che
“galleggiano” nello schema, non connesse, ossia senza relazioni con il
resto degli elementi inseriti.
8
• Si discutono aspetti implementativi, ad esempio eventuali librerie usate
oppure dettagli di codice.
Esempio
L’architettura di GLaDOS segue il pattern architetturale MVC. Più nello spe-
cifico, a livello architetturale, si è scelto di utilizzare MVC in forma “ECB”,
ossia “entity-control-boundary”1 . GLaDOS implementa l’interfaccia AI, ed
è il controller del sistema. Essendo una intelligenza artificiale, è una classe
attiva. GLaDOS accetta la registrazione di Input ed Output, che fanno parte
della “view” di MVC, e sono il “boundary” di ECB. Gli Input rappresentano
delle nuove informazioni che vengono fornite all’IA, ad esempio delle modi-
fiche nel valore di un sensore, oppure un comando da parte dell’operatore.
Questi input infatti forniscono eventi. Ottenere un evento è un’operazio-
ne bloccante: chi la esegue resta in attesa di un effettivo evento. Di fatto,
quindi, GLaDOS si configura come entità reattiva. Ogni volta che c’è un
cambio alla situazione del soggetto, GLaDOS notifica i suoi Output, infor-
mandoli su quale sia la situazione corrente. Conseguentemente, GLaDOS è
un “observable” per Output.
Con questa architettura, possono essere aggiunti un numero arbitrario di
input ed output all’intelligenza artificiale. Ovviamente, mentre l’aggiunta di
output è semplice e non richiede alcuna modifica all’IA, la presenza di nuovi
tipi di evento richiede invece in potenza aggiunte o rifiniture a GLaDOS.
Questo è dovuto al fatto che nuovi Input rappresentano di fatto nuovi ele-
menti della business logic, la cui alterazione od espansione inevitabilmente
impatta il controller del progetto.
In Figura 2.1 è esemplificato il diagramma UML architetturale.
9
GLaDOS
(from control)
-outputs: Output[0..*]
-inputs: Input[0..*]
-personality: Personality AbstractSensor
(from sensor)
+getName(): String
«interface»
AI
«interface» (from entity) «interface»
Output Input
(from boundary) +setPersonality(personality: Personality) (from boundary)
+registerView(view: Output)
+update(subject: Subject) +computeSuggestion(s: Subject, e: Event): Suggestion +getBlocking(): Event
+registerInputSource(in: Input)
+addKitchen(kitchen: Kitchen)
MonitoringGUI
(from gui)
«interface»
Event
(from entity)
10
prima una visione globale del progetto, e via via siate in grado di dettagliare
le singole parti, scartando i componenti che non interessano quella in esame.
Per continuare il parallelo con la vettura di Formula 1, se nei fogli di progetto
che mostrano il design delle sospensioni anteriori appaiono pezzi che appar-
tengono al volante o al turbo, c’è una chiara indicazione di qualche problema
di design.
Si divida la sezione in sottosezioni, e per ogni aspetto di design che si
vuole approfondire, si presenti:
Elementi positivi
• Ogni membro del gruppo discute le proprie decisioni di progettazio-
ne, ed in particolare le azioni volte ad anticipare possibili cambia-
menti futuri (ad esempio l’aggiunta di una nuova funzionalità, o il
miglioramento di una esistente).
11
• Ogni membro del gruppo identifica i pattern utilizzati nella sua sotto-
parte.
• Si mostrano gli aspetti di design più rilevanti dell’applicazione, met-
tendo in luce la maniera in cui si è costruita la soluzione ai problemi
descritti nell’analisi.
• Si tralasciano aspetti strettamente implementativi e quelli non rilevanti,
non mostrandoli negli schemi UML (ad esempio, campi privati) e non
descrivendoli.
• Ciascun elemento di design identificato presenta una piccola descrizione
del problema calato nell’applicazione, uno schema UML che ne mostra
la concretizzazione nelle classi del progetto, ed una breve descrizione
della motivazione per cui tale soluzione è stata scelta, specialmente se è
stato utilizzato un pattern noto. Ad esempio, se si dichiara di aver usato
Observer, è necessario specificare chi sia l’observable e chi l’observer;
se si usa Template Method, è necessario indicare quale sia il metodo
template; se si usa Strategy, è necessario identificare l’interfaccia che
rappresenta la strategia; e via dicendo.
Elementi negativi
• Il design del modello risulta scorrelato dal problema descritto in analisi.
• Si tratta in modo prolisso, classe per classe, il software realizzato, o
comunque si riduce la sezione ad un mero elenco di quanto fatto.
• Non si presentano schemi UML esemplificativi.
• Non si individuano design pattern, o si individuano in modo errato (si
spaccia per design pattern qualcosa che non lo è).
• Si utilizzano design pattern in modo inopportuno. Un esempio clas-
sico è l’abuso di Singleton per entità che possono essere univoche ma
non devono necessariamente esserlo. Si rammenta che Singleton ha
senso nel secondo caso (ad esempio System e Runtime sono singleton),
mentre rischia di essere un problema nel secondo. Ad esempio, se si
rendesse singleton il motore di un videogioco, sarebbe impossibile riu-
sarlo per costruire un server per partite online (dove, presumibilmente,
si gestiscono parallelamente più partite).
• Si producono schemi UML caotici e difficili da leggere, che comprendono
inutili elementi di dettaglio.
12
• Si presentano schemi UML con classi (nel senso UML del termine) che
“galleggiano” nello schema, non connesse, ossia senza relazioni con il
resto degli elementi inseriti.
13
Esempio minimale (e quindi parziale) di sezione di pro-
getto con UML ben realizzati
Personalità intercambiabili
AbstractPersonality
(from personality)
#makeCake(): Cake
+onSuccess()
«interface»
Personality
«interface»
AI
+setPersonality(personality: Personality)
+registerView(view: Output)
+computeSuggestion(s: Subject, e: Event): Suggestion
+registerInputSource(in: Input)
+addKitchen(kitchen: Kitchen)
14
essere modificate, e la modifica impatta direttamente sul comportamento di
GLaDOS.
Good Evil
#makeCake(): Cake #makeCake(): Cake
AbstractPersonality
#makeCake(): Cake
+onSuccess()
15
Gestione di output multipli
MonitoringGUI Logger
(from gui) (from gui)
«interface»
Output
(from boundary)
+update(subject: Subject)
GLaDOS
-outputs: Output[0..*]
-inputs: Input[0..*]
-personality: Personality
16
observable, e le istanze di Output sono observer. Il suo utilizzo è esemplificato
in Figura 2.4
• È caotico.
• Vi sono troppe classi, e non si capisce bene quali siano i rapporti che
intercorrono fra loro.
• Una delle classi, in alto al centro, galleggia nello schema, non connessa
a nessuna altra classe, e di fatto costituisce da sola un secondo schema
UML scorrelato al resto
17
Figura 2.5: Schema UML mal fatto e con una pessima descrizione, che non
aiuta a capire. Don’t try this at home.
18
Capitolo 3
Sviluppo
Elementi positivi
• Si descrivono molto brevemente i componenti che si è deciso di sotto-
porre a test automatizzato.
Elementi negativi
• Non si realizza alcun test automatico.
19
• Si descrivono test effettuati manualmente che sarebbero potuti esse-
re automatizzati, ad esempio scrivendo che si è usata l’applicazione
manualmente.
20
– Permalink GitHub al punto nel codice in cui è stata utilizzata
Elementi positivi
• Si elencano gli aspetti avanzati di linguaggio che sono stati impiegati
21
Elementi negativi
• Si elencano feature core del linguaggio invece di quelle segnalate. Esem-
pi di feature core da non menzionare sono:
– eccezioni;
– classi innestate;
– enumerazioni;
– interfacce.
3.2.1 Esempio
Utilizzo della libreria SLF4J
Utilizzata in vari punti. Un esempio è [Link]
Alchemist/blob/5c17f8b76920c78d955d478864ac1f11508ed9ad/alchemist-swingui/
src/main/java/it/unibo/alchemist/boundary/swingui/effect/impl/EffectBuilder.
java#L49
22
Utilizzo di LoadingCache dalla libreria Google Guava
Permalink: [Link]
d8a1799027d7d685569e15316a32e6394632ce71/alchemist-incarnation-protelis/
src/main/java/it/unibo/alchemist/protelis/AlchemistExecutionContext.
java#L141-L143
23
Capitolo 4
Commenti finali
24
progetto, può essere vista come una seconda possibilità di valutare il corso
(dopo quella offerta dalle rilevazioni della didattica) avendo anche conoscenza
delle modalità e delle difficoltà collegate all’esame, cosa impossibile da fare
usando le valutazioni in aula per ovvie ragioni. È possibile che alcuni dei
commenti forniti vengano utilizzati per migliorare il corso in futuro: sebbene
non andrà a vostro beneficio, potreste fare un favore ai vostri futuri colleghi.
Ovviamente il contenuto della sezione non impatterà il voto finale.
25
Appendice A
Guida utente
Capitolo in cui si spiega come utilizzare il software. Nel caso in cui il suo
uso sia del tutto banale, tale capitolo può essere omesso. A tal riguardo, si
fa presente agli studenti che i docenti non hanno mai utilizzato il software
prima, per cui aspetti che sembrano del tutto banali a chi ha sviluppato
l’applicazione possono non esserlo per chi la usa per la prima volta. Se, ad
esempio, per cominciare una partita con un videogioco è necessario premere
la barra spaziatrice, o il tasto “P”, è necessario che gli studenti lo segnalino.
Elementi positivi
• Si istruisce in modo semplice l’utente sull’uso dell’applicazione, even-
tualmente facendo uso di schermate e descrizioni.
Elementi negativi
• Si descrivono in modo eccessivamente minuzioso tutte le caratteristiche,
anche minori, del software in oggetto.
26
Appendice B
Esercitazioni di laboratorio
Esempio
B.0.1 [Link]@[Link]
• Laboratorio 04: [Link]
php?d=12345#p123456
B.0.2 [Link]@[Link]
• Laboratorio 04: [Link]
php?d=12345#p123456
27
• Laboratorio 06: [Link]
php?d=99999#p999999
28
Bibliografia
29