31 dicembre 2007

Buon 2008!

Cari studenti,
auguri di buon anno a tutti!
Emanuele Panizzi

30 dicembre 2007

Specifiche dell'esercizio per il progetto di Programmazione a oggetti

L'esercizio consiste nella progettazione di una serie di classi per modellare un sito web che ospita diversi blog e che avverta gli utenti della pubblicazione di nuovi post nei blog ai quali sono abbonati.

La progettazione deve seguire il design pattern Observer spiegato a lezione.

Durante l'esecuzione del programma saranno rappresentati da opportuni oggetti:
- i blog
- i post
- gli utenti abbonati (subscriber)

L'esercizio deve essere svolto in C++ e nel secondo linguaggio ad oggetti scelto dal gruppo; le specifiche indicate nel seguito devono essere seguite esattamente nella versione C++ e il più fedelmente possibile nel secondo linguaggio, adattandole dove le caratteristiche del linguaggio non permettano di seguirle alla lettera.

Specifiche

1) la classe Blog sarà derivata dalla classe subject descritta nel design pattern. Ogni oggetto della classe Blog sarà caratterizzato da un nome e da un elenco di post; per la versione C++ utilizzare un contenitore della standard library per l'elenco dei post.
2) la classe Blog metterà a disposizione un metodo pubblico NewPost() che permetterà di pubblicare un nuovo post specificandone autore, titolo e testo. Ogni volta che viene pubblicato un nuovo post, sarà invocato il metodo Notify() per permettere agli observer di aggiornare il proprio stato corrispondentemente alla variazione dello stato del blog.
3) lo stato del blog, costituito sostanzialmente dall'elenco dei post pubblicati, sarà rappresentato opportunamente nell'oggetto e sarà osservabile dagli observer invocando uno o più dei seguenti metodi pubblici della classe Blog:
GetName() che restituisce il nome del blog
GetTitle() che restituisce il titolo dell'ultimo post pubblicato
GetText() che restituisce il testo integrale dell'ultimo post pubblicato
GetLine() che restituisce i primi 10 caratteri del testo dell'ultimo post pubblicato
GetAuthor() che restituisce il nome dell'autore dell'ultimo post pubblicato
4) la classe Post sarà caratterizzata da tutti i dati relativi a un post, cioè: autore, titolo, testo. Si tratta di stringhe in tutti e tre i casi.
5) la classe Subscriber è una classe derivata dalla classe observer descritta nel design pattern; ogni oggetto della classe rappresenta un utente che si abbona ad uno o più blog per essere avvisato della pubblicazione di nuovi post; il subscriber è caratterizzato dall'indirizzo di posta elettronica; per effettuare l'abbonamento, si userà il metodo Attach() come descritto nel design pattern
6) poiché esistono subscriber generici e subscriber specifici, è opportuno derivare altre due classi dalla classe Subscriber: le chiamiamo SubsriberG e SubscriberS rispettivamente. Un subscriberG è interessato a tutti i post dei blog ai quali è abbonato, mentre un subscriberS è interessato solamente ai post scritti da un particolare autore;
6a) quando viene invocata la funzione Update() per un SubscriberG è necessario recuperare dal blog:
- il nome del blog stesso
- il titolo del post
- i primi 10 caratteri del testo
- il nome dell'autore
e stampare a schermo il subject e il body di una ipotetica email nella quale si informa l'utente della nuova pubblicazione, riportandone i dati sopra indicati;
6b) quando viene invocata la Update() per un SubscriberS è necessario:
- recuperare dal blog l'autore del post, e, se coincidente con l'autore scelto alla creazione del subscriber:
-recuperare nome blog, titolo post, testo integrale e mostrare a schermo il subject e body della mail ipotetica con questi tre dati
7) Nel main() vanno dichiarati un certo numero di blog e di subscriber generici e specifici, indicando per questi ultimi il nome dell'autore al quale sono interessati; vanno poi abbonati i subscriber ai vari blog; vanno infine creati alcuni post per verificare che i subscriber siano avvisati con le email opportune.

Note:
- la pubblicazione effettiva delle pagine web dei blog non va trattata
- sfruttare il polimorfismo per differenziare il comportamento del subscriber generico da quello del subscriber specifico.
- nomi degli autori, titoli e testi dei post sono da scegliere arbitrariamente ai soli fini dell'esecuzione del programma


Eventuali dettagli non specificati qui possono essere proposti in commenti a questo post. Inserire altresì nei commenti eventuali domande di chiarimento. Risponderò direttamente, ma invito anche gli studenti a rispondere ai commenti dei loro colleghi.

28 dicembre 2007

Riferimenti volume GoF

Ecco i riferimenti del volume sui design pattern:


Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

Design Patterns
Elements of Reusable Object-Oriented Software

ADDISON-WESLEY, 1995 (19-ma ristampa, Gennaio 2000)
ISBN: 0201633612



Nota: GoF

Lezione di giovedì 17 gennaio

Lasciare un commento specificando se si è interessati a partecipare a questa lezione o a presentare il lavoro del proprio gruppo.

Lezione di lunedì 14 gennaio

Lasciare un commento specificando se si è interessati a partecipare a questa lezione o a presentare il lavoro del proprio gruppo.

Aggiornamento di lunedì pomeriggio:

La lezione si è tenuta. Un gruppo ha descritto la realizzazione della parte C++ del progetto. Si è discusso sull'implementazione e sulle soluzioni adottate.
Un altro gruppo ha accennato al lavoro che stanno facendo con il linguaggio PHP, alle strutture del linguaggio utilizzate per realizzare l'esercizio e alle differenze con l'implementazione C++.

Non è stato possibile registrare l'audio della lezione.

Lezione di giovedì 10 gennaio 2008

Lasciare un commento specificando se si è interessati a partecipare a questa lezione o a presentare il lavoro del proprio gruppo.

Lezione del 7 gennaio 2008

Lasciare un commento specificando se si è interessati a partecipare a questa lezione o a presentare il lavoro del proprio gruppo.

Aggiornamento (5 gennaio 2008): ALLORA LUNEDI' FACCIAMO L'INCONTRO PER DISCUTERE DELLE DOMANDE CHE AVETE SUL PROGETTO. SI TERRA' REGOLARMENTE ALLE 14 NELLA SOLITA AULA.

Aggiornamento (7 gennaio):
[24 presenti]

Argomenti
:

  • domande e risposte sulla implementazione del pattern in C++
  • uso di oggetti o di puntatori nei contenitori
Podcast:
registrazione audio dell'incontro

21 dicembre 2007

Esercizio del progetto

Lezione del 20 dicembre 2007 - Ultima lezione del corso
[41 presenti]


Argomenti:

  • pattern observer: approfondimento e considerazioni
  • requisiti dell'esercizio da svolgere nei due linguaggi scelti per il progetto
  • organizzazione per il mese di gennaio (incontri aggiuntivi ed esami):
    • nel mese di gennaio è possibile fare 5 incontri nello stesso orario delle lezioni;
    • lo scopo degli incontri è quello di approfondire gli argomenti del corso in relazione al progetto assegnato;
    • negli incontri, i gruppi di studenti che stanno svolgendo il progetto, su base volontaria, presenteranno il lavoro svolto fino a quel momento; tale presentazione consentirà di effettuare una discussione utile a tutti gli studenti del corso; consentirà anche ai gruppi più attivi di avere una valutazione preventiva del proprio lavoro;
    • inserirò nel blog 5 post, uno per ogni incontro; per poter svolgere la presentazione, o per partecipare come uditori, inserire un commento su uno dei post;
    • gli incontri si terranno se e solo se ci sarà un numero sufficiente di uditori e almeno un gruppo presentatore; con un commento finale almeno 24 prima annuncierò se l'incontro si terrà o no;
    • L'esame si terrà il 23 gennaio, mercoledì, alle 10:00 in aula riunioni a via salaria. Lo svolgimento è il seguente: chi non è esonerato dovrà fare uno scritto a risposta multipla (test) della durata di 20 minuti (15 domande), simile a quello della prova d'esonero; Poi iniziano le discussioni con i gruppi; la correzione dei test dei membri del gruppo non esonerati avverrà contestualmente alla discussione di ogni gruppo.
    • Lo svolgimento del test e la discussione del progetto sono due cose distinte; un voto positivo in una delle due cose verrà 'salvato' per un anno nei miei file; chi non supera una delle due parti in questo appello potrà tornare a risostenerla nel prossimo appello; la discussione deve però essere svolta congiuntamente da tutti i componenti del gruppo in prima istanza: solo chi è eventualmente 'respinto' dovrà risostenere la discussione autonomamente in un appello successivo

Podcast della lezione:
registrazione audio della lezione

18 dicembre 2007

Formazione dei gruppi

Coloro che cercano persone con cui formare un gruppo per il progetto possono lasciare un commento a questo post indicando:

  1. un proprio riferimento (es. email)
  2. se cercano un gruppo in cui inserirsi o se sono già in 2/3 e cercano un'altra persona
  3. se hanno già scelto un linguaggio (lasciando il commento nel post precedente) o se vorrebbero entrare nel gruppo che ha scelto un particolare linguaggio
Ricordo che i gruppi sono formati almeno da 3 persone e al massimo da 4. Non si può sostenere l'esame singolarmente né in due.

Ogni linguaggio può essere scelto da uno e un solo gruppo.

17 dicembre 2007

Design pattern

Lezione di lunedì 17 dicembre

[35 presenti]


Argomenti:

  • assegnazione del progetto: spiegazione del post "Progetto"
  • design pattern, accenni
  • pattern: Observer

Podcast:

registrazione audio di questa lezione, in formato wav

Polimorfismo

Lezione di giovedì 13 dicembre

[33 presenti]


Argomenti:

  • funzioni virtuali
  • late binding
  • funzioni virtuali pure
  • classi base astratte
  • esempi
Dispense online:
Ereditarietà

Podcast:

registrazione audio di questa lezione, in formato wav


Progetto

Obiettivo del progetto:
conoscere un altro linguaggio di programmazione ad oggetti, analizzando le somiglianze e le differenze rispetto al C++.

Come svolgerlo:

  • scegliere un linguaggio tra quelli indicati su wikipedia alla pagina Object-oriented programming language
  • leggere la descrizione del linguaggio scelto su wikipedia stessa.
  • approfondire la gestione di alcuni elementi del linguaggio, quali ereditarietà e polimorfismo, così come sono descritti nei siti web principali relativi al linguaggio scelto (i link a tali siti si trovano generalmente su wikipedia)
  • realizzare un esercizio sia in C++ che nel linguaggio scelto: l'esercizio verrà assegnato in aula e riportato sul blog.
Presentazione:
all'esame è necessario presentare una relazione sul lavoro svolto, sia su supporto cartaceo che digitale. Presentarsi all'esame con il computer portatile.

Discussione:
la discussione all'esame verterà sulle caratteristiche generali del linguaggio scelto paragonate a quelle del C++. Inoltre verrà analizzata l'implementazione dell'esercizio nei due linguaggi.

Gruppi:
di 3/4 persone. Non è necessario comunicare la composizione del gruppo in anticipo. E' necessario però scegliere il linguaggio di programmazione e indicarlo in un commento a questo post: verificare che non sia stato scelto da un altro gruppo prima!

Prenotazioni:
per sostenere l'esame è necessario prenotarsi via email con almeno una settimana di anticipo. Indicare nella mail il nome e cognome di tutti i componenti del gruppo.

Gennaio:
negli incontri di gennaio i gruppi che lo vorranno potranno descrivere il lavoro svolto ai fini di avere chiarimenti e indirizzi per la prosecuzione del progetto. Prenotare la descrizione inserendo un commento al post che inserirò appositamente.

10 dicembre 2007

Sui template e i progetti multi-file

Notate quanto segue:

1) Quando utilizziamo i template nella definizione delle classi, il compilatore non compila effettivamente il codice della classe finché non è necessario.

Se ad esempio dichiariamo la seguente classe:

template
class Coppia
{private:
T1 primo;
T2 secondo;
public:
Coppia(T1,T2);
T1 Primo() const;
T2 Secondo() const;
};



questo codice verrà "conservato" dal compilatore finché non sia necessario compilarlo instanziando i due tipi T1 e T2, ad esempio a seguito dell'istruzione:

Coppia c1(10,2.3);


2) Quando scriviamo un programma C++ siamo soliti dividerlo in più file per questioni di modularizzazione. Tipicamente, la dichiarazione di una classe sta in un file miaclasse.h, mentre la definizione delle sue funzioni proprie sta in un file miaclasse.cpp. Includeremo miaclasse.h in tutti i .cpp del progetto che usano oggetti di quella classe, oltre che in miaclasse.cpp.

3) Ma, se si tratta di una classe modello, cioè dichiarata mediante template, il compilatore non dovrà compilare i metodi definiti in miaclasse.cpp se nessuno li usa. E quindi, non avrebbe senso compilare separatamente il file miaclasse.cpp! (Nella compilazione separata, infatti, il compilatore "non ha memoria" delle compilazioni degli altri file del progetto, e non sa se in qualcuno di questi è stata usata la classe modello)

4) Quindi l'unica via praticabile è quella di includere tutta la classe modello in ogni file .cpp del progetto che vuole usarla. Pertanto (cosa che non si poteva evincere dal file che abbiamo realizzato nella lezione del 22 novembre, template.cpp) dobbiamo scrivere anche le definizioni dei metodi della classe modello in miaclasse.h. Il file miaclasse.cpp -- per le classi modello -- non dobbiamo scriverlo né inserirlo nel progetto.

5) Il linker è in grado automaticamente di identificare la implementazione di tutti i metodi della classe modello e di collegarli alle rispettive chiamate.


Nei file qui sotto potete trovare un esempio di programmino che compila e gira correttamente:

Se provate invece a spostare le definizioni in un nuovo file templcoppia.cpp e ad aggiungere questo file al progetto, vedrete l'errore di linking.

Ereditarietà



Lezione di lunedì 10 dicembre, 1 ora
[33 presenti]

Argomenti:

  • ereditarietàesercizio: conto ripetizioni caratteri in una parola
Dispense online:
Ereditarietà

Podcast:

registrazione audio di questa lezione, in formato wav


Foto della lavagna:

Esercitazione: blogger

Lezioni di: lunedì 3 dicembre, 1 ora e giovedì 6 dicembre, 2 ore

Argomento:

  • Esercitazione su classi e contenitori. Tema dell'esercitazione:
    • realizzare un programma per la gestione di un sito che pubblica dei blog.
    • Ad ogni blog possono abbonarsi dei subscribers che riceveranno una mail ogni volta che verrà pubblicato un nuovo post sul blog.
    • Modellare mediante opportune classi e metodi.

Podcast:


registrazione audio della lezione di lunedì 3, in formato wav

registrazione audio della lezione di giovedì 6, in formato wav


Codice scritto nelle due lezioni:

Contenitori associativi

Lezione di giovedì 29 novembre
[36 presenti]


Argomenti:

  • contenitori associativi: map, multimap, set, multiset
  • esempio di uso del contenitore map
  • esercizio: conto ripetizioni caratteri in una parola
Dispense online:
Standard Library: contenitori, iteratori, algoritmi generici

Podcast:

registrazione audio di questa lezione, in formato wav


Codice scritto a lezione:

03 dicembre 2007

Iteratori

Lezione di lunedì 26 novembre



Argomenti:

  • iteratori
  • esempio di uso del contenitore vector
Dispense online:
Standard Library: contenitori, iteratori, algoritmi generici

Podcast:

registrazione audio di questa lezione, in formato wav


Codice scritto a lezione: