Newsgroup: it.comp.java
Titolo: risposta a SuperNewsR

Anzichč creare una classe che estende JPanel e implementa ActionListener
potresti creare una classe che estende soltanto JPanel. Nel momento in cui
aggiungi l' action listener per ogni bottone puoi utilizzare ogni volta una
classe annidata interna anonima ActionListener che definisce il metodo
actionPerformed con la sequenza di azioni che vuoi associare a quel
detrminato bottone.
Esempio:
JButton start = new JButton("START");
JButton stop = new JButton("STOP");
start.addActionListener(new
    ActionListener(){
        public void actionPerformed(ActionEvent e){
            .......azioni di avvio........
        }
    }
);
stop.addActionListener(new
    ActionListener(){
        public void actionPerformed(ActionEvent e){
            .......azioni di chiusura........
        }
    }
);

Cosě si troverebbe due files in + sul disco e tediose righe in + di codice
da dover scrivere e riscrivere.
Quella soluzione č ottimale se abbiamo un bottone del quale devi
intercettare il mouse listener, invece di implementare tutti i metodi, si
usa l'adapter in quella maniera.
Ma per l'action listener che ha solo un metodo(actionPerformed) mi sembra
uno spreco.
Questo č solo un mio modesto parere.


In Object Oriented se si conta qualcosa si contano le responsabilita', non i file su disco
:-)
Nel tuo approccio il design del tuo oggetto risulta troppo accoppiato, in pratica fa
troppe cose: in OO e' opportuno separare le responsabilita' fra loro non coese in modo che
ad esempio quando si effettui un cambiamento nella logica X non ti costringa a rivedere
tutte le altre logiche del sistema: se sono accoppiate, fortemente interconnesse, questo
succede. 
Riesci a vedere queste logiche/responsabilità ortogonali nel tuo esempio? (ortogonali
significa in poche parole che ci azzeccano niente l'una con l'altra)
Certo, e' possibile che ti escano un po' di file su disco, ma non c'e' problema :-), no? I
jar son fatti apposta.
Ciao,
    Bruno.
---
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola

Quello che dici tu č verissimo, solo che a MIO modesto avviso, (io non mi
considero assolutamente esperto, anzi....) trovo che cercare di delegare a
ogni componente un adapter (peggio se sono tanti) e scrivere cosě piů volte
lo stesso corpo di codice, per ogni elemento, sia contrpoducente e che non
rientri quella logica della programmazione OOP che tanto fa per noi.
Un ottimo esempio di quello che tu dici, sono le SWING e i suoi model dati e
render.
Ma in questo caso, volendo modificare il comportamento dei bottoni, sempre
dentro il controller devi andare a mettere le mani.
Potrei capire se i bottoni facesso riferimento ad una interfaccia, che poi
un utente si implementa......ma neanche in questo caso mi sembra cosě utile,
visto questi devono interagire tra di loro sugli stessi dati.
Secondo me c'č un limite dopo il quale non conviene piů sforzarsi sulla OOP.
Questa come ti ho detto č fanatastica in moltissimi casi, ma in casi piů
banali, a MIO modesto avviso č solo controproducente, rallentando solo il
codice e rendendolo + lungo e tedioso.
Spero in una tua risposta, anzi se puoi modificare l'esempio in questione
con la logica OOP.... almeno imparo qualcosa di piů.
Ciao.

Prima di tutto chiedo scusa a tutti per il mio "amico" che si è impossessato
del mio computer e si è messo a scrivere sul NG, ma non sapendo come si usa
ha cambiato thread ben 2 volte.
Per quanto riguarda la discussione sui bottoni, la soluzione che il mio
amico ha presentato mi sembra una delle migliori.
Non capisco il tuo riferimento alla classe adapter, visto che ha usato
l'interfaccia ActionListener visto che ActionListener ha solo un metodo
(actionPerformed(ActionEvent ae)).
In secondo luogo, il fatto che si siano più righe di codice(anche se non ne
sono sicuro) è meno influente rispetto alle prestazioni (a mio parere).
Infatti nella tua implementazione viene eseguito una selezione if ed una
assegnazione di boolean in più ogni volta che viene premuto un bottone.
Ciao

Premetto che la mia non voleva essere una crititca, ma solo uno spunto per
parlare e discutere sulle differenti tecniche per affrontare dei problemi.
Il fatto che facessi riferimento agli adapter è motivato dal fatto che
guardando il tuo codice velocemente, mi è sembrato di vedere la stessa
dichiarazione degli adapter.
Mi capita spesso di fare uso degli adpter.
es:
button.addMouseListener(new MouseAdpter(){
    public void mousePressed(MouseEvent e)
    {
            ////   Come vedi è quasi identica.
    }
});
Da quello che so, la risoluzione delle Interfacce e delle classi astratte,
ruba non poco tempo alla CPU rispetto al normale codice, proprio perché deve
essere fatto in fase di RUN.
In fondo, l'uso di una if, non comporta di certo nulla di pesante, anche
perchè è legata ad eventi che vengono lanciati da bottini. Anche il PC più
lento, non si accorge del carico che gli porta una if.
In maniera analoga, l'assegnazione di un boolean è veramente ridicola,
rispetto alla risoluzione di un listener.
Penso che avere un unico metodo per gestire + componenti, sia utile
soprattutto quando si ha a che fare con molti componenti, PENSO.
E poi è una cosa in più da vedere, se non piace........ Ma è sempre una
possibile soluzione.
Ciao.

 essere fatto in fase di RUN.
Pensavo(ma se mi assicuri che avviene in fase di esecuzione mi arrendo :-) )
che il tempo rubato dalla risoluzione di due interfaccie rispetto ad una
sola sia solamente in fase di compilazione (quando crea i due file delle
classi annidate anonime, anzichè uno solo), ma in fase di escuzione penso
che richiamare una o l'altra non comporta sovraccarico di lavoro.


Okay, proseguiamo pure la discussione, aspetto pero' prima la risposta alla tua domanda.
Nel frattempo se vuoi qualcosa da leggere nel weekend riguardante i principi OO puoi dare
un'occhiata a questi documenti:
http://www.objectmentor.com/resources/articles/lsp.pdf
http://www.objectmentor.com/resources/articles/ocp.pdf
http://www.objectmentor.com/resources/articles/dip.pdf
Vecchi, ma sempre validi, devi conoscerli.
Per quanto riguarda coesione e coupling c'e' qualcosa in giro, ma mi sono perso i link,
sorry :-)! Dai un'occhiata al sito di Ugo, sicuramente ne parla.


 ortogonali nel tuo esempio?
Ciao Bruno. Mi fermo quì nella replica. Sono completamente spiazzato.
Non conosco la logica OOP fino a questi livelli. Non so che intendi per
"logiche/responsabiltià ortogonali". La mia cultura OOP è puramente
autodidatta. Sui vari manuali non ho mai sentito parlare di queste cose
(forse perchè non homai preso un BUON manuale che spiega la programmazione
OOP). Su i vari manuali ci si limita alle cose basilari.
Se hai tempo per spiegarmi meglio questi concetti o se sai indicarmi dei
buoni siti (puoi dirmi il sito di Ugo?) dove studiare. Purtroppo mastico
poco di inglese.
Ti ringrazio tantissimo per i tuoi post. Anche se ammetto di averti seguito
pochino. Spero che mi indirizzerai verso studi che possano migliorarmi.
Ciao, buon fine settimana e ancora grazie.

> Pensavo(ma se mi assicuri che avviene in fase di esecuzione mi arrendo
:-) )
No non ti arrendere, perchè "certo" a Roma si dice che abbia fatto la fine
di "tranquillo" e "sicuro", cioè sono morti inc***ti.
Scherzi a parte, le interfacce e le classi astratte vengono risolte in fase
di run. Se poi una volta risolte, non necessitano + di rielaborazioni su
questo non so che dirti. So di certo che questo vale anche per C++ e per
tutti i linguaggi che usano questo genere di programmazione. Il perchè è
abbastanza ovvio. Durante la compilazione la tua classe fa riferimento a i
metodi astratti o "virtuali" delle varie classi astratte o interfacce, ma
non può sapere se realmente poi c'è qualcuno che le implementa e in che
modo.
Cmq. sarebbe interessante aprire un piccolo dibattito su questo tema.
Ciao.


E di che? Non sono riuscito a spiegare un tubo! Vabbe', ora devo scappare ma sono
disponibile: fammi sapere come possiamo organizzarci.


 effetti tutti i link che ti ho mandato sono documenti PDF in inglese...
sorry.
A chi lo dici? Mica per Java o l'informatica in genere, il problema sono le
straniere. Sai quante ne girano per Roma? Poi d'estate non ti dico. ;)
Ciao.

> stiamo organizzando un JUG, io potrei tenere un seminario su questo.
Ciao, esiste un elenco dei JUG italiani? 
Io non trovo nulla...
tityrus


java.sun.com
, nella home trovi un applet e un link che mostra i JUG


> 
java.sun.com
, nella home trovi un applet e un link che mostra i JUG
tanks
tityrus