Newsgroup: it.comp.java
Titolo: [lungo] Agenda e Modellazione ad Oggetti

Salve NG,
so che probabilmente il problema che vi porrò è esagerato per il tipo di 
applicazione che devo realizzare, ma sono nuovo della programmazione ad 
oggetti e, visto che devo imparare a progettare, meglio imparare bene da 
subito.
Arrivo al dunque.
Sto realizzando la solita inutile agendina elettronica. Per far ciò ho 
modellato Tre classi:
- Persona.class
	contiene tutti gli attributi e i metodi che potete immaginare
- Agenda.class
	in pratica una istanziazione di LinkedList che immagazzina 	
	oggetti Persona con qualche metodo ad-oc e l'override del
	metodo toString
-Main.class
	qui ovviamente si trova il main che stampa un menu testuale e
	richiama i metodi di agenda (aggiungi, rimuovi, stampa, ecc....)
Proprio la funzione stampa mi fa riflettere. In prima battuta avevo 
pensato di farmi restituire da Agenda una stringa contenente anche 
caratteri utili alla formattazione a schermo, stringa formata in questo 
modo:
nome+"\n"+cognome+"\n"+indirizzo+"\n\n"
ma in questo modo l'agenda sarà legata a questo tipo di rappresentazione 
e non sarà mai un oggetto pienamente riutilizzabile (o sbaglio?).
Allora ho pensato di farmi restituire una stringa contenente dei 
caratteri "divisori", per esempio, #:
"nome#cognome#indirizzo"
utilizzando poi tokenizer per separare i vari campi.
In tal modo la getione della stampa è attribuita totalmente a Main e 
l'oggetto restituisce solo "contenuti" senza preoccuparsi di come 
saranno stampati (potrebbero anche essere stampati su file).
Quest'ultima soluzione mi pare già meglio, ma resto legato alle stringhe 
e mi chiedo se non sorgano problemi all'aumentare dei nominativi 
contenuti nell'agenda.
Per ovviare a questo (sempre che sia un problema reale) ho pensato di 
realizzare il metodo getAllRecords in modo che restituisca uno stream 
che posso acquisire in Main con BufferedReader, come se i contenuti 
provenissero da tastiera o da file. In tal modo, tra l'altro, pensando 
ad una versione distribuita dell'agendina, questa potrebbe restiture i 
conenuti così come li riceve dalla rete.
Vorrei sapere quale di questi ragionamenti è il più esatto, e, ne caso 
fossero tutti sbagliati, quale è la direzione migliore da seguire in 
questi casi?
Grazie in anticipo.

origama ha scritto:

Mmmm, allora premettendo che ognuno ha i suoi sistemi, e nessuno di 
questi è giusto per definizione.
Io fare una cosa completamente diversa.
Il tuo oggetto Persona avrà delle proprietà tute sue, per esempio 
Cognome, Nome... ecc...
Come dicevi te associare la stampa all'oggetto persona non va bene, ti 
spiego semplicemente il motivo tecnico e quello "ingegneristico":
Tecnico: accoppi troppo la stampa ad un oggetto persona, costringendoti 
a modificare l'oggetto in caso di modifica del layout di stampa.
Ingegneristico: Ragionare a oggetti significa ragionare come nel mondo 
reale, quindi la domanda che ti devi porre è: ho mai visto una persona 
che stampa? NO!!! Le persone hanno un nome, un cognome, mangiano, 
bevono, ma non stampano!!!
Allora chi è che stampa? Una stampante!!!
Sembra una cavolata, ma è così!!!
Fatti un oggetto StampatoreDatiPersona che prende o un oggetto persona o 
una collection di Persona, e fai stampare a lui.
A questo punto puoi anche inserire un milione di metodi che ti 
consentono di controllare la stampa, tipo un metodo che ti definisce il 
separatore: public void setSeparatore(String separatore)...
un metoco che cambia il colore, uno che cambia completamente il 
Layout... tutto questo senza modificare l'oggetto Persona.
Prova a pensarci, è la cosa più naturale che c'è.
Delvy

 Prova a pensarci, è la cosa più naturale che c'è.
certo così non è male. Già che ci sono però ti butto lì un altro paio di 
  domande:
1) 	E se dichiarassi la classe Agenda come astratta implementando 		 
tutti i metodi di gestione e lasciando astratto il metodo di
	stampa?
2)	Implementando entrambi i metodi Agenda e StampatoreDatiPersona, 	 
chiunque volesse usare l'oggetto Agenda dovrebbe conoscere anche 
StampatoreDatiPersona. Questo non dovrebbe essere evitato?
Ciao e grazie ancora.

 Ciao e grazie ancora.