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 :

Un peu de grammaire JAVA:


Sujet :

Langage Java

  1. #1
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 341
    Par défaut Un peu de grammaire JAVA:
    Bonjour,

    je programme à l'aide de NetBeans.
    Dans une JFrame, j'ai déposé un JPanel que j'appel BarreOutils.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BarreOutils = new javax.swing.JPanel();
    J'ai demandé à ce que le positionnement du composant soit géré par un Layout.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    org.jdesktop.layout.GroupLayout BarreOutilsLayout =
       new org.jdesktop.layout.GroupLayout(BarreOutils);
     
    BarreOutils.setLayout(BarreOutilsLayout);
    C'est maintenant que cela se complique pour moi, l'EDI me balance ce genre de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BarreOutilsLayout.setHorizontalGroup(
      BarreOutilsLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(BarreOutilsLayout.createSequentialGroup()
                    .addContainerGap()
                    .add(Txt_Date, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(902, Short.MAX_VALUE))
            );
    setHorizontalGroup(...); est un setter je crois, et entre ses parenthèses se situe le ou les paramètres passés.
    Dans le cas présent, il me semble qu'il n'y a qu'un paramètre car je ne vois pas de virgule entre les mots.
    Or il me semble que cela représente une succession de méthodes:
    BarreOutilsLayout.createParallelGroup(...)
    add(BarreOutilsLayout.createSequentialGroup(...)
    addContainerGap()


    Sans vouloir chercher à comprendre pour le moment tout ce que cela signifie, je me demande à quoi correspond cette succession de méthodes séparées par des points ?
    Je comprends ce genre de syntaxe:
    Class.Methode() ou Classe.membre,

    mais MethodeA().MethodeB().MethodeC() ?? Qu'est ce que cela signifie ?

  2. #2
    Membre expérimenté Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Par défaut
    Citation Envoyé par rtg57 Voir le message
    Bonjour,

    je programme à l'aide de NetBeans.
    Dans une JFrame, j'ai déposé un JPanel que j'appel BarreOutils.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BarreOutils = new javax.swing.JPanel();
    J'ai demandé à ce que le positionnement du composant soit géré par un Layout.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    org.jdesktop.layout.GroupLayout BarreOutilsLayout =
       new org.jdesktop.layout.GroupLayout(BarreOutils);
     
    BarreOutils.setLayout(BarreOutilsLayout);
    C'est maintenant que cela se complique pour moi, l'EDI me balance ce genre de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BarreOutilsLayout.setHorizontalGroup(
      BarreOutilsLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(BarreOutilsLayout.createSequentialGroup()
                    .addContainerGap()
                    .add(Txt_Date, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(902, Short.MAX_VALUE))
            );
    setHorizontalGroup(...); est un setter je crois, et entre ses parenthèses se situe le ou les paramètres passés.
    Dans le cas présent, il me semble qu'il n'y a qu'un paramètre car je ne vois pas de virgule entre les mots.
    Or il me semble que cela représente une succession de méthodes:
    BarreOutilsLayout.createParallelGroup(...)
    add(BarreOutilsLayout.createSequentialGroup(...)
    addContainerGap()


    Sans vouloir chercher à comprendre pour le moment tout ce que cela signifie, je me demande à quoi correspond cette succession de méthodes séparées par des points ?
    Je comprends ce genre de syntaxe:
    Class.Methode() ou Classe.membre,

    mais MethodeA().MethodeB().MethodeC() ?? Qu'est ce que cela signifie ?
    Ces methodes doivent renvoyer une resultat, des objets a priori, dont on appelle les methodes successivement. D'un point de vue lisibité, c'est franchement pas terrible surtout si tu debute en java.
    En fait tu as,
    BarreOutilsLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) qui retourne une objet A avec une methode add(...), cette methode renvoie une objet B avec une methode add(..) qui elle meme renvoie un objet C qui a une methode add(...).... et ainsi de suite.

    En gros c'est du code generer automatiquement... pour commencer le Java ca va te poser problème vaudrai mieux eviter si tu veux comprendre... c'est plus long a faire mais au moins tu comprend ce que tu fais... avec le generateur ton code va vite devenir difficile a suivre si t es pas au point

    En fait tu peu aussi découper ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //je connais pas les type retourner mais c pas grave en soit
    //En utilisant object ca devrai aller pour la demo, netbeans devrai 
    //te proposer les bon types
    Object a = BarreOutilsLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING);
    Object b = BarreOutilsLayout.createSequentialGroup();
    a.add(b); //j'avais oublié ca.
    Object c = b.addContainerGap();
    Object d = c.add(Txt_Date, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE);
    Object e = d.addContainerGap(902, Short.MAX_VALUE));
     
    // et enfin:
    BarreOutilsLayout.setHorizontalGroup(a);
    J'espere ne pas m'être trompé dans la décomposition, mais grosso modo je dois pas en être loin.

  3. #3
    Membre expérimenté

    Inscrit en
    Octobre 2009
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 133
    Par défaut
    Bonjour,

    en fait, la génération ecrit des méthodes imbriquées les unes des autres plutôt qu'écrire plusieurs lignes de code.
    il faut savoir que la méthode createParallelGroup de la classe GroupLayout renvoie un objet de type GroupLayout.ParallelGroup
    (regarder la javadoc : http://www.randelshofer.ch/quaqua/ja...oupLayout.html )
    Cette classe contient la méthode add et est donc appelée directement (sans créer d'attribut pour appeler la méthode ensuite).

    Dans le cadre de ton exemple MethodeA().MethodeB().MethodeC().
    Prenons comme exemple les classes suivantes :
    - ObjetC contenant la méthode MethodeC
    - ObjetB contenant la méthode MethodeB, cette méthode retourne un objet de type ObjetC
    - Objet A contenant la méthode MethodeA, cette méthode retourne un objet de type ObjetB
    Ici, pour appeler la méthode MethodeC depuis ton objet ObjetA, tu fais normalement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ObjetA objA = new ObjectA();
    ObjetB objB = objA.MethodeA();
    ObjetC objC = obj.MethodeB();
    objC.MethodeC();
    Ceci peut être fortement réduit en ne créant pas les instances des différents objets mais en utilisant directement les éléments retournes, dans ce sens, le code précédent peut s'écrire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objA.MethodeA().MethodeB().MethodeC()
    Cela te permet d'appeler la méthode MethodeC en passant directement sans rien créer, c'est surtout utilise pour simplifier le code mais comme tu peux le constater, ce n'est pas toujours très compréhensible.

    En espérant que cela t'auras aidé a comprendre.

  4. #4
    Membre expérimenté Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Par défaut
    Citation Envoyé par henolivier Voir le message
    Bonjour,

    en fait, la génération ecrit des méthodes imbriquées les unes des autres plutôt qu'écrire plusieurs lignes de code.
    il faut savoir que la méthode createParallelGroup de la classe GroupLayout renvoie un objet de type GroupLayout.ParallelGroup
    (regarder la javadoc : http://www.randelshofer.ch/quaqua/ja...oupLayout.html )
    Cette classe contient la méthode add et est donc appelée directement (sans créer d'attribut pour appeler la méthode ensuite).

    Dans le cadre de ton exemple MethodeA().MethodeB().MethodeC().
    Prenons comme exemple les classes suivantes :
    - ObjetC contenant la méthode MethodeC
    - ObjetB contenant la méthode MethodeB, cette méthode retourne un objet de type ObjetC
    - Objet A contenant la méthode MethodeA, cette méthode retourne un objet de type ObjetB
    Ici, pour appeler la méthode MethodeC depuis ton objet ObjetA, tu fais normalement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ObjetA objA = new ObjectA();
    ObjetB objB = objA.MethodeA();
    ObjetC objC = obj.MethodeB();
    objC.MethodeC();
    Ceci peut être fortement réduit en ne créant pas les instances des différents objets mais en utilisant directement les éléments retournes, dans ce sens, le code précédent peut s'écrire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objA.MethodeA().MethodeB().MethodeC()
    Cela te permet d'appeler la méthode MethodeC en passant directement sans rien créer, c'est surtout utilise pour simplifier le code mais comme tu peux le constater, ce n'est pas toujours très compréhensible.

    En espérant que cela t'auras aidé a comprendre.
    C'est surtout fais pour compacter le code... le simplifier c'est une autre histoire...

  5. #5
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 341
    Par défaut
    Eh bien merci beaucoup,

    je ne savais pas que l'on pouvait compacter de la sorte !
    Personnellement, j'en suis encore à décomposer les étapes comme indiqué dans vos posts.
    Et je crois que je continuerai encore comme cela, parce que lorsqu'il s'agit de se replonger dans un programme après quelques années...
    c'est souvent que l'on se demande "Mais qu'est-ce que j'ai voulu faire là ?"

    A bientôt

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    on fait souvent ce genre de chainage dans les méthodes qui retournent l'objet. Par exemple, StringBuilder en java, toutes ses méthodes, ou presquent, retournent "this". Ca permet ce genre de chainage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    StringBuilder sb = new StringBuilder("ceci est un phrase avec 5 parametres: ");
    sb.add(param1).add(",")
      .add(param2).add(",")
      .add(param3).add(",")
      .add(param4).add(",")
      .add(param5);
    C'est, je trouve, plus lisible que ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    StringBuilder sb = new StringBuilder("ceci est un phrase avec 5 parametres: ");
    sb.add(param1);
    sb.add(",")
    sb.add(param2);
    sb.add(",");
    sb.add(param3);
    sb.add(",");
    sb.add(param4);
    sb.add(",");
    sb.add(param5);
    Il arrive aussi qu'on aie besoin d'un objet temporaire, juste pour le résultat d'une de ses méthodes. Dans ce cas, il arrive qu'on chaine le constructeur et l'appel à la méthode.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JDialog messageBox = new JOptionPane("je suis un message").createDialog(parent,"boite a message");

  7. #7
    Membre expérimenté Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Par défaut
    En fait l'utilisation de ce genre de chainage va surtout dependre des developpeurs.
    Perso, au-dela de 2 ou 3 fonctions, je prefere décomposer plutot que d'avoir un ligne de code de 3 km de long.
    Dans le cas d'un StringBuilder/StringBuilder, ca pose pas de problème particulier d'en faire plus surtout si c'est que des append.
    Par contre pour les composants graphiques, tout décomposer et même mettre à part dans une fonction, c'est franchement plus propre... a mon avis.

    Sans parler du fait de debugger un truc pareil...
    Faut aussi penser que ton code doit pouvoir être lisible par un autre développeur... Pensez un peu à vos collègues

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    clair, c'est la lisibilité qui doit primer, puisque l'idée est de mettre en balance "longueur du chainage" <-> "variables temporaires inutilisées deux lignes plus bas"

  9. #9
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 341
    Par défaut
    OK, merci à tous pour toutes ces précisions.

    Je dois dire que pour l'instant, j'ai du mal à décrypter ce genre de syntaxe.
    Pour le coup des l'amoncèlement des méthodes add() de StringBuilder, faut reconnaitre que ça éclaircit quand même le code.

    Je mets ça dans une case de mon cerveau, ça ressortira bien un jour.

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

Discussions similaires

  1. Probleme if grammaire java
    Par shuang dans le forum Langage
    Réponses: 6
    Dernier message: 14/06/2011, 15h17
  2. [Runnable]Grammaire JAVA (le retour)
    Par rtg57 dans le forum Langage
    Réponses: 2
    Dernier message: 08/02/2010, 09h23
  3. [Français]Un peu d'exos de grammaire
    Par Le Pharaon dans le forum La taverne du Club : Humour et divers
    Réponses: 26
    Dernier message: 22/08/2008, 11h30
  4. Parlons un peu de pointeurs : C -> Java
    Par ToTo13 dans le forum Langage
    Réponses: 11
    Dernier message: 18/04/2008, 11h55
  5. [LambdaProlog] grammaire en Java
    Par khokho dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 04/07/2005, 10h26

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