IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

[Conception] Class interne ou externe ?


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 15
    Points : 13
    Points
    13
    Par défaut [Conception] Class interne ou externe ?
    Bonjour je suis en train d'essayer de comprendre la création d'interface graphique, et j'ai lu qu'il était préférable de créer des classes internes pour gérer les actions plutot que de les gérer directement. Mais pourquoi ne pas créer des classes séparées afin de mieux séparer les controleurs des vues ? Surtout que j'avais lu précédemment en JAVA : Un fichier = une classe !

    Merci de vos réponses qui pourraient m'aider à comprendre les avantages et inconvénient de chaque possibilité.

    Thierry

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Il faut diffencier 2 modeles:
    • le modele MVC
    • le modele form/action


    Le modele MVC est celui qui structure ton programme en séparant la vue (la partie SWING), le modèle (bean) et le Controleur (le lien entre les 2).

    Le modele form/action est celui qui modelise le fonctionnement de SWING (donc de la vue). Dans ce modele une action sur composant graphique (un widget) declanche un appel de fonction (un listener).

    C'est dans le modele form/action qu'il est preferable d'utiliser des classes internes (et meme anonymes) car c'est bcp moins verbeux. J'irai meme plus loin en disant que l'utilisation des classes dans ce cas est plus une "contrainte" imposée par java qu'un réel besoin.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par pseudocode
    J'irai meme plus loin en disant que l'utilisation des classes dans ce cas est plus une "contrainte" imposée par java qu'un réel besoin.
    Pourquoi est ce une contrainte ? N'est il pas possible de séparer form et action dans des classes (fichiers) différentes ? En utilisant l'encapsulation pour communiquer entre les classes ?

    Où est ce que je me trompe ?

    Merci en tout cas pour la réponse et l'aide.

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Ce n'est pas une contrainte technique. On peut effectivement creer une classes Listener, puis en creer une instance et la passer en parametre du addListener() du Widget.

    Mais l'interet d'avoir une classe c'est de pouvoir en faire plusieurs instance. Hors generalement, l'action associée a un widget n'est pas reutilisable, donc creer une classe séparée ou meme nommée est inutile. D'ou le fait qu'on utilise habituellement des classes internes anonymes, genre kleenex ():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       JButton button = new JButton("Close");
       button.addActionListener(
          new ActionListener() {
             public void actionPerformed( ActionEvent e ) {
              frame.dispose();
             }
          }
        );
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 108
    Points : 3 203
    Points
    3 203
    Par défaut
    Je reponds pour donner mon avis personnel :

    je conseil d'eviter les classes "Kleenex" comme dit pseudocode. Un peu oui, mais pas constament. ces classes rendent le debuggage plus c... qu'il ne l'est deja. Et c'est de mon point devue particulierement atroce de recuperer le code de quelqu'un qui utilise ca constament.

    pour eviter ca je le gere comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    JButton button = new JButton("Close");
    button.setActionCommand("FERMER");
    button.addActionListener(this);
     
    ...
     
    public void actionPerformed( actionEvent a ){
     
    if(a.getActionCommand().equals("FERMER"){
        frame.dispose();
        }
    }
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

    Pour un monde sans BigBrother IxQuick ni censure RSF et Les moutons

  6. #6
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Perso la gestion je la fais dans des classes internes, parfois anonymes, mais jamais directement dans la classe...
    Par exemple, je ne fais pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public MaJFrame extends JFrame implements ActionListener {
    ...
        ... {
            monBouton.addActionListener(this);
        }
     
        public void actionPerformed(ActionEvent e) {
            ...
        }
    }
    Tout simplement parce que quand on a une référence sur la frame, on peut appeler "manuellement" actionPerformed, ce qui est incorrect (et bien sûr ça apparaît aussi dans la doc).

  7. #7
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par eclesia
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Jbutton.addActionListener(this);
    Arg!

    Rajouter une interface (donc une responsabilité) a la classe courante juste pour "simplifier" le code, c'est tres loin du model objet
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  8. #8
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 108
    Points : 3 203
    Points
    3 203
    Par défaut
    Je veux bien croire que ca se soit pas tres "objet" ou plus exactement pas tres MVC.
    Mais je prefere ca a chercher dans quelques centaines de lignes où est cette petite classe anonyme (ca peut aller tres vite avec les EDI comme eclipse,je dis pas le contraire).

    Je suis tout a fait d'accord que ce n'est pas l'idéale.
    Ce n'est que mon point de vue.

    Et cette "structure" peut tres facilement evoluer par la suite.
    Tout est dans le actionPerformed et tout utilise les actioncommand.
    On peut tres simplement basculer le actionPerformed sur une autre classe.

    C'est plus lisible. (encore une fois c'est mon avis uniquement)
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

    Pour un monde sans BigBrother IxQuick ni censure RSF et Les moutons

  9. #9
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Je suis en partie d'accord avec toi, les classes anonymes ca peut vite devenir illisible, d'ou ma 1ere remarque sur la "contrainte" Java d'utiliser des instances de classe comme action.

    Tout ca devrait se simplifier avec Java SE 7 et les closures. On pourra directement mettre du code dans le addListener().
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par ®om
    Perso la gestion je la fais dans des classes internes, parfois anonymes, mais jamais directement dans la classe...
    Bonjour et déjà merci à tous, je ne suis pas au niveau pour discuter de mes habitudes (surtout que pour le moment je n'en ai pas ! ) mais je progresse beaucoup et ce grâce à vous ...

    Je pense avoir tout compris de vos échanges , il me reste une question : ®om qu'appel tu une classe anonyme ?

    Perso je vais choisir de faire une classe séparée pour les listener, ni interne, ni utiliser directement la class form pour les gérer, car le seul argument contre que vous m'avez donné pour le moment est : non réutilisable, tant pis je vais sacrifier un peu de mon temps pour faire une excpetion et écrire du code en trop

    Encore merci, pour ces renseignements, et si il n'y a plus d'autres interventions je vais fermer la discussion... :clap:

  11. #11
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Une classe anonyme c'est ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ActionListener listener = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            //...
        }
    };
    bouton.addActionListener(listener);
    En gros tu fais un "héritage à la volée".

  12. #12
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par TTKiBosse
    Mais pourquoi ne pas créer des classes séparées afin de mieux séparer les controleurs des vues ? Surtout que j'avais lu précédemment en JAVA : Un fichier = une classe !

    1- Un fichier = une classe , oui on peut créer plusieurs classes dans un meme fichier source (.java) et le compilateur va s'encharger de céer un fichier séparé pour chaque classe (.class).

    2- Les classes internes ont de grands avantages: elles ont accés a tous les champs (meme privés)de la classe (externe) où elles sont créées, de plus elles offrent une meilleur sécurité.

    3- les classes anonymes sont parfois illisibles, mais elles sont idéales pour gérer les évenements (elles permettent de reduire le code).
    "Un remboursement des programmes défectueux serait envisageable mais toute l'industrie du logiciel ferait faillite la première année." Andrew Tanenbaum.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par ®om
    En gros tu fais un "héritage à la volée".
    Un héritage et une implémentation !!!

    Alors ça c'est un super tuyau !! je ne savais même pas que c'était possible... J'imagine qu'il faut utiliser ce système avec parcimonie, si on
    veut continuer a avoir un code lisible ! Mais je vois parfaitement l'interet pour les listener....

    Un grand merci.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par Amine_sas

    1- Un fichier = une classe , oui on peut créer plusieurs classes dans un meme fichier source (.java) et le compilateur va s'encharger de céer un fichier séparé pour chaque classe (.class).
    Le compilateur va s'en charger mais pour la lecture et l'organisation de la conception ca va pas être très claire...

    Citation Envoyé par Amine_sas

    2- Les classes internes ont de grands avantages: elles ont accés a tous les champs (meme privés)de la classe (externe) où elles sont créées, de plus elles offrent une meilleur sécurité.
    A ça c'est un avantage certain, pas besoins de tout encapsuler pour accéder aux champs, c'est du travail (géré automatiquement par l'EDI si je ne me trompe) en moins.

    Citation Envoyé par Amine_sas

    3- les classes anonymes sont parfois illisibles, mais elles sont idéales pour gérer les évenements (elles permettent de reduire le code).
    Oui je pense maintenant qu'elles peuvent parfois être très utile pour gagner un peu de temps sur des actions de routines "peu intéressantes".

    Donc en gros : pour toutes les actions spécifiques de mes Form vous me conseillez d'utiliser des classes internes et pour les petites actions sans grands interets des classes anonymes...

    Je vais essayer cette méthodologie
    Encore merci...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Classe interne, classe externe
    Par mathieu_t dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 23/09/2009, 19h58
  2. Réponses: 14
    Dernier message: 10/02/2007, 13h27
  3. [Conception] Classe interne ou externe
    Par storm_2000 dans le forum Langage
    Réponses: 3
    Dernier message: 13/01/2007, 16h05
  4. [Conception] classes internes ou gestion des events
    Par TTKiBosse dans le forum Général Java
    Réponses: 2
    Dernier message: 06/12/2006, 18h25
  5. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo