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.

20 commenti:

Anonimo ha detto...

Buongiorno prof.
Una chiarezza......
Nel caso di una newPost(),successivamente il metodo chiamerà Notify() per avvertire ogni Observer(quindi ogni subscriber) del post..
Nella notify() si scandisce la lista degli
Observer(subscribers) ed a ognuno chiamerà l Update()...
E qui la domanda:
In quest ultimo metodo della classe Observer si dovranno salvare tutti i campi(GetName(),GetTitle(),ecc..)e quindi creando dei campi nella classe Observer ; oppure semplicemente stampare a video????

Grazie e Buon anno nuovo.(nel caso della non risposta)

Emanuele Panizzi ha detto...

Deve sicuramente stampare a video. Se salvare o no il contenuto da stampare, è una scelta personale (o di gruppo). Ad esempio, si potrebbe salvare i dati per confrontarli con i nuovi la prossima volta che viene chiamata la funzione per evitare di 'spedire' due volte la stessa mail, cioè a scopo di robustezza del programma.

Anonimo ha detto...

salve

Vorrei sapere il motivo per cui quale
cerco di compilare mi da sempre dei errori che non riesco a rilevare...
L output degli errori è il seguente:
[Linker error] undefined reference to `vtable for Subject'
[Linker error] undefined reference to `Subject::~Subject()'
[Linker error] undefined reference to `Subject::Detach(Observer*)'
[Linker error] undefined reference to `vtable for Observer'

Ai quali a ciascuno ce ne saranno al massimo 3 o 4....

Anonimo ha detto...

Buon Anno ^^

Anonimo ha detto...

Anche a me da lo stesso errore...dovrebbe essere qualcosa a riguardo di definizione di funzioni virtuali nei file .h non implementate poi nei file .cpp.
Almeno spucliando su internet ho trovato questo.

Si aspettano ulteriori info.


Grazie

Anonimo ha detto...

Edito il post precedente e dico che implementando i metodi virtuali dichiarati nei file .h l'errore di Link è scomparso.

Anonimo ha detto...

salve prof.
Io invece avrei il seguente problema:

Quando certo di accedere alla lista degli Observer tramite l Attach() mi compila bene ma la finestra dell output mi va in crash...
Ma faccio bene all Attach() a passargli un Subscriber dato che è una classe derivata dell Observer ???

Un Saluto :-)

Anonimo ha detto...

Prof un informazione ma le classi subscriberS e subscriberG dobbiamo derivarle dalla classe Observer oppure Subscriber?


Grazie

pS: ho letto le specifiche e dice da Subscriber ma cosi non mi funge

Anonimo ha detto...

Professore per favore potrebbe rispondere alle domande degli utenti? Altrimenti non si va avanti.
Buon Anno.

Anonimo ha detto...

Nell'implementazione del metodo GetLine avevo pensato di usare la funzione strncpy, che però, dà errore in compilazione se gli argomenti sono di tipo string (non dà problemi con char*). Volevo sapere se qualcuno aveva risolto un problema simile.
Grazie

Anonimo ha detto...

Ma a te,dato che che stai implementando la GetLine(),t accede alla lista???Se si cosa gli passi di preciso??

Buon Anno

Anonimo ha detto...

No, la lista ancora non l'ho implementata. Stavo provando ad eliminare per primi i problemi più semplici, ma questo non si è rivelato tale....

Anonimo ha detto...

Salve prof.

Nella funzione update(Blog* the _change_state ) nel passaggio dei parametri in input viene richiesto un puntatore alla classe blog.
Al momento della chiamata di update da parte di notify quale deve essere il puntatore al blog???(da dove dobbiamo recuperare le informazioni)

Grazie

Anonimo ha detto...

salve prof, potrebbe mettere in linea le pagine del Design Pattern,
che le abbiamo perse, please? grazie . .

Anonimo ha detto...

salve prof, potrebbe mettere in linea le pagine del Design Pattern,
che le abbiamo perse, please? grazie . .

Anonimo ha detto...

Mi accodo anch'io alla richiesta di Daniele Guerris

Anonimo ha detto...

Se mi postate la mail ve le invio in formato pdf.

Anonimo ha detto...

@ luca lupo:
la mia email e':
saturno5 _AT_ hotmail.it
(sostituire _AT_ con la chiocciola)

GRAZIE! :)

Anonimo ha detto...

Abbiamo (diciamo per distrazione) implementato la possibilità che ogni subscriber abbia un numero indefinito di autori d'interesse. Le specifiche del progetto prevedevano solamente un autore per subscriber.

C'è qualche problema o possiamo continuare su questa via, che per quanto diversa dal progetta, sfocia in un codice più utile... ?

Grazie mille

Anonimo ha detto...

Grande, ho trovato quello che 'ho cercato per