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

Affichage des résultats du sondage: Êtes-vous pour ou contre cette proposition ?

Votants
304. Vous ne pouvez pas participer à ce sondage.
  • Pour

    114 37,50%
  • Contre

    190 62,50%
Langage Java Discussion :

JDK 7: Proposition 6 : Invocations chainées [Débat]


Sujet :

Langage Java

  1. #1
    Expert éminent sénior


    Profil pro
    Inscrit en
    Mai 2003
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 3 240
    Points : 11 101
    Points
    11 101
    Par défaut JDK 7: Proposition 6 : Invocations chainées
    Aujourd'hui :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Builder {
        void setSomething(Something x) {}
        void setOther(Other x) {}
        Thing result() {}
    }
     
    Builder builder = new Builder();
    builder.setSomething(something);
    builder.setOther(other);
    Thing thing = builder.result();
    Demain :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Builder {
        void setSomething(Something x) {}
        void setOther(Other x) {}
        Thing result() {}
    }
     
    Thing thing = new Builder()
        .setSomething(something)
        .setOther(other)
        .result();

    En combinant cette proposition avec la proposition 5, il serait possible d'écrire du code de ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import static java.util.Collections.sort;
     
    List<String> strings = ...;
     
    strings
        .filter(isCountryName) // could be a closure
        .sort()
        .uniq()
        .each(printString); // ditto
    Vincent Brabant

    Ne pas me contacter par MP ni par mail pour des questions techniques. Ma liste d'amis restera vide.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    Pour, je prend l'exemple de la classe GBC servant à utiliser facilement les GridBagConstraint qui utilise ce principe, et c'est tellement plus simple lors de la création d'enchaîner quelques setters

  3. #3
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 558
    Points : 15 481
    Points
    15 481
    Par défaut
    Autant le principe me plait, autant je pense qu'il faudrait revoir la syntaxe car la on utilise le "." classique alors que le retour de type void, ca me choque.

  4. #4
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Points : 3 736
    Points
    3 736
    Par défaut
    oui oui, sans hésiter une seconde sur le chainage ! c'est tellement plus lisible, ca n'apporte aucune complexité supplementaire dans le langage.
    j'avais parlé de ce que ca apporte dans un billet de mon blog

    de plus, c'est une approche (le chainage) qu'on trouve deja dans certaines api java (java.nio par exemple) : autant le généraliser.

    le type même de modif que j'aime bien : simple, ca ne n'apporte pas de nouveaux mots clés, comprehensible facilement.

  5. #5
    Membre actif Avatar de austin P.
    Inscrit en
    Juin 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juin 2004
    Messages : 182
    Points : 239
    Points
    239
    Par défaut
    pour

    j'irai même plus loin
    c'est beaucoup plus lisible en chainage qu'avec le nom de l'objet repété X fois
    En essayant continuellement on finit par réussir. Donc : plus ça rate, plus on a de chance que ça marche. (Jacques Rouxel : "Les shadoks")

  6. #6
    Membre actif
    Avatar de bobuse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 232
    Points : 278
    Points
    278
    Par défaut
    Tout à fait d'accord aussi !!

    Par contre, je ne vois pas de condition explicite. J'imagine que ce chaînage ne s'appliquerait que pour les méthodes qui retournent void.

    En fait, ça me conforte dans l'idée que ce serait mieux d'utiliser des exceptions qu'un code de retour, comme c'est le cas dans Collection.add(E) par exemple. En effet, le chaînage ne serait pas possible à cause de ce code de retour !!

  7. #7
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Points : 3 736
    Points
    3 736
    Par défaut
    oui, c'est ca ! les méthodes qui renvoient void renverraient this en fait.


    une méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void faitQuelqueChose() {
       //plein de code
    }
    serait automatiquement vue comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class faitQuelqueChose() {
       //plein de code
        return this;
    }

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Ca ne concernerait que les méthodes ne renvoyant rien je présume ???
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    et si la première méthode générait une exception , comment pourrait on la traiter ?
    Where is my mind

  10. #10
    Membre actif
    Avatar de bobuse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 232
    Points : 278
    Points
    278
    Par défaut
    Citation Envoyé par bassim Voir le message
    et si la première méthode générait une exception , comment pourrait on la traiter ?
    Ben avec un try/catch classique. Et si plusieurs méthodes sont susceptibles de renvoyer des exceptions différentes, il faut que les catchent toutes.
    Et tu as toujours la possibilité de splitter la chaîne pour un contrôle plus fin.

  11. #11
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bassim Voir le message
    et si la première méthode générait une exception , comment pourrait on la traiter ?
    Ben comme maintenant le traitement s'arrêterait et remonterait dans le catch...

    a++

  12. #12
    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
    Pour.

    mais je verrais bien l'ecriture comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    strings{
        filter(isCountryName);
        sort();
        uniq();
        each(printString);
    }
    ca me parait plus propre et permettrait des evolutions plus facile
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

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

  13. #13
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    Citation Envoyé par bobuse Voir le message
    Ben avec un try/catch classique. Et si plusieurs méthodes sont susceptibles de renvoyer des exceptions différentes, il faut que les catchent toutes.
    Et tu as toujours la possibilité de splitter la chaîne pour un contrôle plus fin.
    comme ceci donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Thing thing = new Builder()
        .try{setSomething(something)}
    catch (e: Exception) { ...}
        .setOther(other)
        .result();
    c'est carrément illisible
    Where is my mind

  14. #14
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    En général si tu as une exception cela arrête tout le traitement, donc ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try {
        Thing thing = new Builder()
            .setSomething(something) // throw Exception
            .setOther(other)
            .result();
    } catch(Exception e) {
      ...
    }
    Ou bien si tu ne veux pas interrompre tout le traitement cela revient à ne pas utiliser l'invocation chainé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Thing thing = new Builder();
        try {
            thing.setSomething(something); // throw Exception
        } catch(Exception e) {
           ...
        }
        thing.setOther(other)
            .result();
    Mais bon ce cas de figure où on continue malgré l'exception est quand même assez rare...


    a++

  15. #15
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Contre,

    Pour moi c'est du grand n'importe quoi et pourquoi pourrait on chainer les méthodes retournant void (avec un this implicite) et pas les méthodes retournant un type particulier ou du coup pas de this mais le type de retour.

    Pour lire (et comprendre) un chainage de ce type en mixte (avec et sans void) il faudrait connaitre par cœur la déclaration de chacune des méthodes .. personnellement j'en suis incapable et même avec un IDE ça peut être pénible a voir.

    En général si j'ai ce genre d'enchainement a faire il y a probablement une raison et peut-être aussi le besoin de le faire a différents endroits du coup je mets ça dans une méthode et zou

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  16. #16
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bulbo Voir le message
    Pour lire (et comprendre) un chainage de ce type en mixte (avec et sans void) il faudrait connaitre par cœur la déclaration de chacune des méthodes .. personnellement j'en suis incapable et même avec un IDE ça peut être pénible a voir.
    En effet il y a un gros risque d'ambiguité lors de la lecture...
    Du coup la proposition 10 semblerait plus clair sur ce point précis concernant le chainage

    a++

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Je suis plutôt contre. C'est vrai que ça réduirait considérablement le code, mais ce serait surtout une source de confusion selon moi. J'ai voté contre sur le principe, mais si cette proposition venait à être adoptée, j'en serais cependant un fervent adepte

  18. #18
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    alors y'aurais plus de methode retournant void?

  19. #19
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 558
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 558
    Points : 15 481
    Points
    15 481
    Par défaut
    Je pense clairement que "void" doit rester "void". Le fait qu'une fonction void retourne l'objet serait un changement bien trop lourd de conséquences et ouvrirait un gros risque d'abus. L'idée me plait bien mais il faudrait trouver une autre methode.

    Une possibilité (mais pas réalisable car bien trop lourd pour une si faible amélioration) serait de remplacer le "." par autre chose comme "#" qui remplacerait la valeur de retour par l'objet appelé.

  20. #20
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    En Pascal , si je me rappelle bien on fait comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with monObjet do
    begin
    setSomething();
    setChose();
    traitemant();
    end;
    en java ça serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with monObjet {
    setSomething();
    setChose();
    traitement(getChose());
    }
    qu'en pensez vous ?
    Where is my mind

Discussions similaires

  1. Réponses: 165
    Dernier message: 03/09/2009, 15h35
  2. Réponses: 78
    Dernier message: 27/08/2009, 19h29
  3. JDK 7: Proposition 5 : extensions de méthodes
    Par vbrabant dans le forum Langage
    Réponses: 75
    Dernier message: 19/10/2008, 13h32
  4. JDK 7: Proposition 3 : Comparer les énumérations
    Par vbrabant dans le forum Langage
    Réponses: 52
    Dernier message: 19/10/2008, 12h36
  5. Réponses: 27
    Dernier message: 19/10/2008, 11h51

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