Newsgroup: it.comp.java
Titolo: Sullo stile di programmazione

Vorrei un consiglio da qualche programmatore più esperto di me in OOP e
particolarmente in Java.
Se creo una finestra con un menù, scrivo una classe di questo tipo:
class MyFrame extends Frame
{
   public MyFrame(String title)
  {
    super(title);
    MenuBar mbar = new MenuBar();
    setMenuBar(mbar);
    Menu menuFile = new Menu("File");
    mbar.add(menuFile);
    MenuItem item1 = new MenuItem("Quit...");
    menuFile.add(item1);
    item1.addActionListener( /* ascoltatore */ );
    // etc...
    // Inoltre aggiungo i metodi che implementano i comportamenti
    // dei vari menu item:
    public void optionQuit()
    {
      // Esci dal programma
    }
 
    // etc...
  }
}
Il mio dubbio è su quale sia il modo migliore per scrivere il codice che
gestisca gli eventi sulle varie voci dei menù. Io ho in mente diverse
soluzioni:
1) creo un'unica classe, diciamo "MyFrameListener", che gestisca tutti
gli eventi, discriminandoli mediante switch (o if-then-else). Esempio:
class MyFrameListener implements ActionListener
{
  MyFrame fr;
 
  // Constructor
  FrameMenuListener(MyFrame fr)
  {
 
this.fr
 = fr;
  }
  public void actionPerformed(ActionEvent evt)
  {
    String theEvent = evt.getActionCommand();
    if (theEvent.equals("Quit..."))
      fr.optionQuit();
    // etc...
  } 
}
ma mi sembra una soluzione molto poco "object oriented";
2) oppure, creo una classe per ogni voce del menù, per cui ogni item ha
il proprio ascoltatore:
class QuitListener implements ActionListener
{
  MyFrame fr;
  QuitListener(MyFrame fr)
  {
 
this.fr
 = fr;
  }
  public void actionPerformed(ActionEvent evt)
  {
    fr.optionQuit();
    // Oppure scrivo qui direttamente il codice di optionQuit()
  }
}
Per ciascuna delle due opzioni precedenti, poi, posso scegliere se
costruire queste classi come classi interne (a MyFrame), o meno; nel
primo caso, posso evitare il passaggio del parametro MyFrame fr (e
quindi il costruttore), e accedere ai metodi senza "fr."; ma non so se
sia una soluzione elegante, o crei codice poco leggibile...
Insomma, riassumendo (scusate la prolissità), vorrei sapere:
a) quanti e quali ascoltatori creare;
b) dove metterli;
c) dove mettere il codice che implementa i comportamenti dei vari menu
item;
...il tutto come farebbe un serio programmatore Java!
Grazie per l'attenzione.
                                  Nicola
-- 
:                          :
     Nicola Vitacolonna
   E-mail:  
vit...@tin.it
:                          :

sia una soluzione elegante, o crei codice poco leggibile...
Elegante lo é senza dubbio, leggibile dipende dall'abituarcisi -- é un
"idioma" fondamentale del linguaggio Java 1.1 e particolarmente del
suo modello degli eventi, per cui, secondo me, abituarcisi é una
ottima idea.  Bruce Eckel consiglia esattamente la stessa cosa, e
spende molte pagine ad illustrare le soluzioni giuste e quelle sbagliate
e perché le seconde sono sbagliate (
www.BruceEckel.com
 per
scaricare il suo ottimo libro "Thinking in Java").
Alex

:                          :
Non so cosa ne direbbe 'un serio programmatore java', io scelgo di creare
una classe interna alla frame per ogni voce del menù.
Naturalmente questa soluzione non è la _migliore_ in assoluto, a seconda
della situazione e dei gusti altre potrebbero essere preferite. In questo
modo la leggibilità del codice è effettivamente un po' sacrificata, ma cosi'
hai visibilita' sulla stato interno della frame nei metodi che implementano
i comportamenti dei vari menu'. Scegli te se approfittarne o no.
Pino.