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. #61
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    Pas fondammentalement utile, c'est la simple implémentation du design pattern Builder, qui a ses vertues mais aussi ses faiblesses. D'autant plus que réaliser un builder, c'est simplement retourner this sur les méthodes de fabrication.

  2. #62
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 559
    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 559
    Points : 15 484
    Points
    15 484
    Par défaut
    Citation Envoyé par azalsup Voir le message
    J'ai voté oui mais il faudra revoir la syntax. Car ca va etre un peu illisible.

    Personnellement j'opte pour deux solution :
    - 1 : un mot clee genrs last ou self ( un peu comme le this)
    - 2 : prendre en compte l'indentation (comme en python)
    Autant le mot clé ou un truc du genre pour marquer la différence et ne pas casser des méchanismes existants me parait une idée valable, autant l'indentaion et une très mauvaise idée car:
    • C'est contraire à un pricipe de base du java. Rajouter des fonctionatilés ne dois pas ce faire à l'encontre des bases du language.
    • Je trouve ça vraiment limitant. Je tiens absolument à rester maitre de l'indentation de mes programmes


    Après y avoir davantage réfléchis à cette proposition, je pense qu'une bonne solution serait d'introduire un nouvel opérateur('..' me parait adapté) qui fonctionerait comme l'opérateur '.' mais retourant l'objet sur lequel il opère plutôt que le résultat de la méthode. On aurait donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Thing thing = new Builder()
        ..setSomething(something)
        ..setOther(other)
        .result();
    • On ne change ainsi rien du comportement naturel du type void et de l'opérateur '.'
    • Syntaxe immédiatement identifiable, aucune ambiguité possible.
    • Pas vraiment plus verbeux que la proposition, beaucoup moins qu'un with.

  3. #63
    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
    Contre. Il suffit d'écrire son builder autrement:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Builder {
        Builder setSomething(Something x) { ...; return this; }
        Builder setOther(Other x) { ...; return this; }
        Thing result() { ... }
    }
     
    Thing thing = new Builder()
        .setSomething(something)
        .setOther(other)
        .result();
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  4. #64
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 559
    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 559
    Points : 15 484
    Points
    15 484
    Par défaut
    Sauf que le plus souvent, on souhaiterait utiliser ça sur des objets qui appartiennent a l'API JAVA ou à une bibliothèque que l'on ne maitrise pas. En plus les setter sont sencés retourner le type void.

    Bref à par quelques rares objets comme les StringBuilders, c'est actuellement impossible de faire du chainage.

  5. #65
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2005
    Messages : 97
    Points : 208
    Points
    208
    Par défaut
    J'ai voté contre parce que la syntaxe me déplait. et je rejoins eclesia lorsqu'il dit :

    Citation Envoyé par eclesia Voir le message
    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

  6. #66
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    Citation Envoyé par Uther Voir le message
    Après y avoir davantage réfléchis à cette proposition, je pense qu'une bonne solution serait d'introduire un nouvel opérateur('..' me parait adapté) qui fonctionerait comme l'opérateur '.' mais retourant l'objet sur lequel il opère plutôt que le résultat de la méthode. On aurait donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Thing thing = new Builder()
        ..setSomething(something)
        ..setOther(other)
        .result();
    • On ne change ainsi rien du comportement naturel du type void et de l'opérateur '.'
    • Syntaxe immédiatement identifiable, aucune ambiguité possible.
    • Pas vraiment plus verbeux que la proposition, beaucoup moins qu'un with.
    Je dois admettre être assez séduit par cette notation.

  7. #67
    Membre à l'essai
    Profil pro
    Architecte de système d’information
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Points : 16
    Points
    16
    Par défaut
    Contre !

    Avec un truc comme cela on aurait vraismeblablement des méthodes de type void qui renverait implicitement des objets this en retour (et typé comment ?).

    On ne manquerait pas alors d'avoir des codeur qui tulise les retour de méthode de type void dans el but non avoué de décroché le gros lot des concours de code les plus abscons.

    Je trouve cela tres dangeureux.

    En outre, je suis trés trés contre les longues séquence de code sur une seules lignes qui, quand elle plante ne permettent jamais de savoir qu'elle est la méthode source du soucis.

  8. #68
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut plus simple ou plus compliqué?
    J'ai fait un petit exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class Foo {
    int value;
      Foo(int value){this.value=value;}
       void add(int x){value+=x;}
       void doubble(){value*=2;}
       void triple(){value*=3;}
       int tripleAndGet(){value*=3;return value;}
       int getValue(){return value;}
    }
    public static void main(String[] args) {
        Foo f1=new Foo(1);
        f1.doubble();
        f1.triple();
        Foo f2=new Foo(f1.getValue());
        f1.doubble();  
        f1.tripleAndGet();  // on n'est pas obligé d'assigné le retour!
        f2.add(f1.getValue());
        f2.double();
        System.out.println("result:"+f2.getValue());
        }
    }
    l'idée est de simplifier l'écriture de main...j'ai choisi comme syntaxe de prendre
    les accolades et de dire que si l'on ouvre des accolades avant la fin d'un statement, on applique toutes les méthodes sur l'objet désigné avant la première accolade (il n'y a pas d'ambiguité, le constructeur est orthogonal et peu êtrre utilisé récursivement...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static void main(String[] args) {
        Foo f1=new Foo(1){
                                  .doubble();
                                  .triple();
                                 };
        System.out.println("result:"+
                new Foo(f1.getValue())
                      {
                       .add(f1{.doubble;
                                 }.tripleAndGet()):
                       .double();               
                      }.getValue();
                );
    plus concis mais pas vraiment plus clair (quel nombre imprime le proramme

    j'ai bien aimé:
    -le with de ludosoft (comme {})
    -les .. comme nouveau symbol

  9. #69
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 46
    Points : 86
    Points
    86
    Par défaut
    le with de ludosoft me manque aussi mais il est source d'ambiguite.

  10. #70
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 585
    Points : 1 139
    Points
    1 139
    Par défaut
    Après reflexion:
    - 100% pour la syntaxe: je trouvais qu'il manquait un with dans Java, mais le chainage est bien plus moderne, plus lisible si on le présente bien (comme tout le reste d'ailleurs) et existe déjà dans Java (StringBuilder, etc.)
    - 100% contre les méthodes qui retournent void, c'est nimporte quoi! Le 100% pour ci-dessus ne va que pour un type Toto dont les méthodes retournent une valeur de type Toto !
    L'avis publié ci-dessus est mien et ne reflète pas obligatoirement celui de mon entreprise.

  11. #71
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Points : 144
    Points
    144
    Par défaut
    j'étais plutôt pour jusqu'à cet argument
    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.
    Si on est seul à travailler sur son code, je ne vois aucun pb. C'est rarement le cas. Comme ça a été dit par la suite, bonjour l'ambiguïté.

    En fait, comme dans d'autres proposition, il faut essayer (et c'est parfois dur pour moi aussi) de ne pas penser à ce que ça pourrait permettre de pire mais de bien peser le pour et le contre.
    oui je suis d'accord mais il ne faut pas voir non plus uniquement que ce qui est bien il faut justement peser le pour et le contre.

    Pour un apport en lisibilité, je trouve qu'on peut beaucoup y perdre en temps de compréhension de code.


    Car sinon, on n'aurait jamais eu l'opérateur ternaire "? :" en Java !!!
    Bof moi je m'en serai remis. Venant du monde c++, le manque de template ou la liste variable de paramètres, jusqu'à l'arrivée de Tiger, m'a beaucoup plus gêné. C'est pas l'opérateur qui est le plus conseillé pour faire un if. Bien utilisé ça peut apporter mais ça reste très léger comme gain.Il est très souvent utilisé "pour montrer qu'on sait l'utiliser" plus que par nécessité. Cet opérateur n'est pas un plus dans les concepts du langage, n'apporte pas un plus au niveau de la façon de coder, .... le gain est vraiment léger. Donc si cette proposition est du même niveau que cet opérateur alors je suis 2x plus contre cette proposition et qu'ils investissent de leur temps dans d'autres propositions plus intéressantes.

    Moi je suis plutôt contre les apports "esthétiques" si ils n'apportent pas un réel plus. Ou alors, les mettre tout en bas de la pile de priorité.


    edit : éventuellement une différenciation comme pour le coup du ".." pour marquer la différence

  12. #72
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 766
    Points : 1 267
    Points
    1 267
    Par défaut
    Je trouve la proposition de départ vraiment pas claire. Avec le with myString {...} ou plus simplement myString{....}, on arrive à quelque chose de mieux.

    Le problème de with, bah c'est pour les programmeurs qui ont utilisés with comme nom de variable. Pas cool pour eux !

  13. #73
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    509
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 509
    Points : 568
    Points
    568
    Par défaut
    Contre!
    Comme tous les "opposant" je pense qu'avoir indiqué explicitement void en retour d'une methode doit continuer de vouloir dire "void" et pas un this implicite.

    Si le besoins se fait sentir libre au développeur de modifier les méthodes pour qu'elles renvoient l'objet en cours.
    UML avec VIOLET

  14. #74
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 766
    Points : 1 267
    Points
    1 267
    Par défaut
    Citation Envoyé par FreshVic Voir le message
    Si le besoins se fait sentir libre au développeur de modifier les méthodes pour qu'elles renvoient l'objet en cours.
    Pas possible dans le cas des API tiers ou standard.

  15. #75
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut Si on veut, on peut déjà le faire!
    En lisant tous ces post sur les "void",

    Cela m'a fait pensé que la notion de signature de la méthode n'est pas claire.
    Dans java, seuls les paramètres servent à oter les ambiguités en cas de surchage de nom de méthode. le paramètre de retour n'est pas utilisé.

    Le paramètre de retour est utilité seulement si il est assigné ou recepteur d'une nouvelle méthode.

    On peut toujours donc "jeter" le paramètre de retour.

    dans le petit exemple suivant, pour utiliser les chainages dès maintenant, j'ai remplacer void par la classe elle même, et je retourne l'objet (this). Ce qui permet de chainer les appels et ca marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Foo {
          int value;
          Foo(int value){this.value=value;}      
          Foo add(int oper1){value+=oper1; return this;}
          Foo mult(int oper1){value*=oper1; return this;}
          int getValue(){return value;
          }
    Son utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public static void main(String[] args) {
        Foo f1=(new Foo(1))
                .add(3)
                .mult(4)
                .add(6);
        Foo f2=new Foo(f1.add(3)
                         .add(4)
                         .getValue());
        f2.add(1)                         // on jette la valeur retournée !!
          .mult(4);
        System.out.println(f2.getValue());
       }
    Alors ?

  16. #76
    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
    Citation Envoyé par nicorama Voir le message
    Pas possible dans le cas des API tiers ou standard.
    Et quel est le gain ? C'est surtout ça qu'il faut voir..

    - Est-ce que cela permet de faire quelque chose d'impossible auparavant ? Non, on ne chainait pas mais c'est juste du sucre syntaxique, juste une nouvelle manière d'écrire les appels aux méthodes.

    - Est-ce que c'est plus lisible: Non si une méthode ne retourne pas void au milieu de l'enchainement on va appeler une méthode sur un autre objet en cours de route.

    - Est-ce plus maintenable: Non en cas d'exception il y a je ne sais pas combien d'appels sur la même ligne, attention a ne pas se planter lors de l'analyse du chainage qui a provoqué l'exception.

    - Est-ce plus rapide a écrire: oui on économise le nom de la variable, quelle fête..

    - Est-ce que cet avantage vaut le coup d'introduire tout ces inconvénients sachant que ça ne permet rien de nouveau au final ?

    Lorsque j'étais encore a la fac et qu'on nous farcissait la tête de conseils pour écrire du code propre, il y avait ce petit conseil parmi d'autre, genre aéré votre code, pas plus d'une instruction par ligne ... pour moi la il y a conflit avec la proposition.
    Et aller a la ligne pour chaque chainage n'est pas beaucoup plus propre car il manquera une info sur la ligne, la variable, qu'il faudra aller chercher je ne sais pas combien de lignes plus haut..

    Bien souvent on n'écrit le code qu'une fois mais on le relit plusieurs, je préfère perdre du temps une fois si ça m'en fait gagner plusieurs fois par la suite..

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

  17. #77
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    509
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 509
    Points : 568
    Points
    568
    Par défaut
    Citation Envoyé par nicorama Voir le message
    Pas possible dans le cas des API tiers ou standard.
    Effectivement, et c'est que le concepteur de l'api l'a voulu ainsi en mettant volontairement "void" en retour de ses methodes
    UML avec VIOLET

  18. #78
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 18
    Points : 19
    Points
    19
    Par défaut
    Je suis plutot contre.

    Dans le livre de Deitel comment porgrammer en Java j'ai vu que l'invcation de methodes chaines on la gere avec les set en renvoyant this.

    class Builder {
    Builder setSomething(Something x) { … return this;}
    Builder setOther(Other x) { … return this;}

    }

    Builder builder = new Builder();
    builder.setSomething(something).setOther(other);


    On aurait comme ca une invocation des methodes chaines.

  19. #79
    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
    Citation Envoyé par Jfern Voir le message
    Je suis plutot contre.

    Dans le livre de Deitel comment porgrammer en Java j'ai vu que l'invcation de methodes chaines on la gere avec les set en renvoyant this.

    class Builder {
    Builder setSomething(Something x) { … return this;}
    Builder setOther(Other x) { … return this;}

    }

    Builder builder = new Builder();
    builder.setSomething(something).setOther(other);


    On aurait comme ca une invocation des methodes chaines.
    Le problème, c'est que ca marche plus aussi facilement lorsqu'on a une autre classe qui étend Builder et qui rajouterait juste une méthode, setSubMethod().
    Et on ne pourrait pas alors écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SubBuilder subbuilder = new SubBulder();
    subbuilder.setSomething(something).setOther(other).setSubMethod(otherthing);
    Car setSomething et setOther sont définis comme retournant Builder.
    Avec la proposition suivante, on est sûr que la méthode retourne toujours bien l'objet courant. Et donc on peut vraiment écrire
    builder.setSomething(something).setOther(other).setSubMethod(otherthing);
    sans aucun problème.

    Vincent
    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

  20. #80
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    contre

    des expressions dont la sémantique implicite serait

    "[delete, close, … ](someObject).do_something_on_supposed_still_alive_object()"

    seraient possibles…

    (ou comment indiquer qu'une méthode "void" "invalide" un objet ou son contenu et implicitement retourne null plutôt que this…)

    + quelques craintes quant aux implications subtiles sur l'AOP…

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