Publicité

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%
+ Répondre à la discussion
Page 1 sur 5 12345 DernièreDernière
Affichage des résultats 1 à 20 sur 95
  1. #1
    Expert Confirmé Sénior

    Inscrit en
    mai 2003
    Messages
    3 283
    Détails du profil
    Informations forums :
    Inscription : mai 2003
    Messages : 3 283
    Points : 10 664
    Points
    10 664

    Par défaut JDK 7: Proposition 6 : Invocations chainées

    Aujourd'hui :

    Code :
    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 :
    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 :
    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.

  2. #2
    Membre éclairé
    Inscrit en
    septembre 2007
    Messages
    282
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 282
    Points : 308
    Points
    308

    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 Confirmé Sénior Avatar de Uther
    Homme Profil pro
    Inscrit en
    avril 2002
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2002
    Messages : 3 064
    Points : 6 708
    Points
    6 708

    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 julien
    Architecte technique
    Inscrit en
    novembre 2002
    Messages
    1 949
    Détails du profil
    Informations personnelles :
    Nom : Homme julien
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : novembre 2002
    Messages : 1 949
    Points : 3 401
    Points
    3 401

    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 confirmé Avatar de austin P.
    Inscrit en
    juin 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : juin 2004
    Messages : 182
    Points : 203
    Points
    203

    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 confirmé Avatar de bobuse
    Inscrit en
    janvier 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : janvier 2005
    Messages : 229
    Points : 245
    Points
    245

    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 julien
    Architecte technique
    Inscrit en
    novembre 2002
    Messages
    1 949
    Détails du profil
    Informations personnelles :
    Nom : Homme julien
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : novembre 2002
    Messages : 1 949
    Points : 3 401
    Points
    3 401

    Par défaut

    oui, c'est ca ! les méthodes qui renvoient void renverraient this en fait.


    une méthode
    Code :
    1
    2
    3
    public void faitQuelqueChose() {
       //plein de code
    }
    serait automatiquement vue comme

    Code :
    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
    5 688
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2006
    Messages : 5 688
    Points : 7 093
    Points
    7 093

    Par défaut

    Ca ne concernerait que les méthodes ne renvoyant rien je présume ???

  9. #9
    Membre expérimenté Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    février 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

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

    Informations forums :
    Inscription : février 2005
    Messages : 657
    Points : 590
    Points
    590

    Par défaut

    et si la première méthode générait une exception , comment pourrait on la traiter ?

  10. #10
    Membre confirmé Avatar de bobuse
    Inscrit en
    janvier 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : janvier 2005
    Messages : 229
    Points : 245
    Points
    245

    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 Confirmé Sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 312
    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 312
    Points : 21 542
    Points
    21 542

    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
    Inscrit en
    décembre 2006
    Messages
    1 976
    Détails du profil
    Informations forums :
    Inscription : décembre 2006
    Messages : 1 976
    Points : 2 779
    Points
    2 779

    Par défaut

    Pour.

    mais je verrais bien l'ecriture comme ca :
    Code :
    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

  13. #13
    Membre expérimenté Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    février 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

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

    Informations forums :
    Inscription : février 2005
    Messages : 657
    Points : 590
    Points
    590

    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 :
    1
    2
    3
    4
    5
    Thing thing = new Builder()
        .try{setSomething(something)}
    catch (e: Exception) { ...}
        .setOther(other)
        .result();
    c'est carrément illisible

  14. #14
    Expert Confirmé Sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 312
    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 312
    Points : 21 542
    Points
    21 542

    Par défaut

    En général si tu as une exception cela arrête tout le traitement, donc ce serait plutôt :
    Code :
    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 :
    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 : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : février 2004
    Messages : 1 259
    Points : 1 923
    Points
    1 923

    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 Confirmé Sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 312
    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 312
    Points : 21 542
    Points
    21 542

    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 expérimenté
    Inscrit en
    juillet 2007
    Messages
    770
    Détails du profil
    Informations forums :
    Inscription : juillet 2007
    Messages : 770
    Points : 595
    Points
    595

    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 Patrice Delorme
    Inscrit en
    mai 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrice Delorme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : mai 2007
    Messages : 187
    Points : 78
    Points
    78

    Par défaut

    alors y'aurais plus de methode retournant void?

  19. #19
    Expert Confirmé Sénior Avatar de Uther
    Homme Profil pro
    Inscrit en
    avril 2002
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2002
    Messages : 3 064
    Points : 6 708
    Points
    6 708

    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 expérimenté Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    février 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

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

    Informations forums :
    Inscription : février 2005
    Messages : 657
    Points : 590
    Points
    590

    Par défaut

    En Pascal , si je me rappelle bien on fait comme ça:
    Code :
    1
    2
    3
    4
    5
    6
    with monObjet do
    begin
    setSomething();
    setChose();
    traitemant();
    end;
    en java ça serait:
    Code :
    1
    2
    3
    4
    5
    with monObjet {
    setSomething();
    setChose();
    traitement(getChose());
    }
    qu'en pensez vous ?

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •