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
248. Vous ne pouvez pas participer à ce sondage.
  • Pour la proposition 1

    38 15,32%
  • Pour la proposition 2

    50 20,16%
  • Contre

    160 64,52%
Langage Java Discussion :

JDK 7: Proposition 10 : Le même type [Débat]


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 746
    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 746
    Par défaut
    Sauf que dans ce cas précisément ça n'a pas de sens vu que le but du clonage est justement de ne pas retourner this mais une nouvelle instance.

    A mon avis la encore c'est a la classe fille de bien faire son boulot et de retourner le type adéquat. Je ne sens pas le besoin de rajouter un mot clé pour pallier une mauvaise conception de la classe fille.

  2. #2
    Membre Expert
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Par défaut
    Hello,

    Citation Envoyé par super_navide Voir le message
    Le même problème se pose avec la méthode clone de Object

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     class Object { 
     
    abstract Object clone( ) ; }
     
    Truc bidule = new Truc( ) ;
    Truc cloneBidule = (Truc)bidule.clone( ) ;
    moi j'ai voté oui car je trouve ca utile et logique
    une méthode qui clone un objet renvoit toujours un objet de même type que le receveur
    La covariance permet justement d'éviter ce genre de chose.


    Citation Envoyé par Uther
    Sauf que dans ce cas précisément ça n'a pas de sens vu que le but du clonage est justement de ne pas retourner this mais une nouvelle instance.
    Je pense que là on ne parle pas d'une instance, mais plutôt du type de l'objet retourné.

    Citation Envoyé par Uther
    A mon avis la encore c'est a la classe fille de bien faire son boulot et de retourner le type adéquat. Je ne sens pas le besoin de rajouter un mot clé pour pallier une mauvaise conception de la classe fille.
    Lorsqu'une classe possède des méthodes retournant l'objet courant, il est appréciable ( et normal) que les classes qui en hérite n'est pas à se soucier (pour ces méthodes) du type à retourner.

    Si je suis au niveau de la classe buffer, je m'attends à avoir, comme type retour un objet de type Buffer, en revanche lorsque je suis au niveau de la sous-classe les mêmes méthodes renvoie la même référence mais vu comme le sous type, ce qui est finallement logique!

    Imaginons une classe possédant 150 méthodes retournant le type courant, voila la charge de travail pour le développeur pour reprendre l'ensemble des méthodes afin qu'elles renvoient le bon type...

    En effet, la notion qu'engendre ce this dit que le type de l'objet retour se raffine en même temps que l'on descend dans l'arbre d'héritage et celà grace à une certaine rigueur du typage par le language.

  3. #3
    Membre éclairé

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

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    Après relecture de l’ensemble de ce thread je dois admettre être plus mitigé.

    Je reste sur l’idée que le cast explicite a ses vertues du point de vue de la maintenance. Cependant, mon vote initial était sûrement influencé vis-à-vis de la proposition 6 (http://www.developpez.net/forums/sho...d.php?t=460131) pour laquelle je reste contre.

    En revanche, il a été mis en évidence des possibilités de créations de classes plus simples à exploiter sans pour autant remettre en cause la compréhension puisque contrairement à la proposition 6, il ne s’agit pas ici de modifier le comportement d’une fonction signée volontairement avec un retour void, mais d’exploiter des fonctions clairement définies avec un retour This.

    Bref, je serais bien enclin à changer mon vote sur cette proposition. Cela m’apprendra à voter trop vite.

    Chris

  4. #4
    Membre Expert
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Par défaut
    Hello,

    Je vote définitivement pour la proposition 1!

    Pourquoi la proposition 1 plutôt que la 2, car l'ajout d'un nouveau mot clef n'a pa de réel intérêt, deplus le mot clef this remplie parfaitement cette fonction.

    En effet, la mise en place de ce this comblerait un manque au typage de Java.

    En effet, l'utilisation du cast dans le cas décrit en exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          ByteBuffer buf = ...;
    buf.flip().position(12); // OK
    buf.flip().put(12); // Error
    ((ByteBuffer)(buf.flip())).put(12); // Obliged to cast
    montre une faiblesse du typage du language Java.
    En effet, on manipule un objet de type ByteBuffer et on est obligé de le donwcaster pour faire appel à une de ses méthodes.

    Dans un language comme Ocaml, on nomme cette notion le selftype.

    En introduisant, ce this on permet, en cas d'héritage, de faire évoluer les types retours de chaque méthode retournant l'objet courant en les spécialisants.

    En faisant celà, on élimine le recourt au transtypage (qui relève selon moi d'une mauvaise conception et d'un mauvaise pratique).

    D'alleurs, les générics et la de la covariance suivent la même idée, c'est à dire l'élimination du cast (qui engendre une plu grande sécurité au niveau du code).
    Avec ces évolutions, on renforce le typage de Java.

    Je trouve que cette proposition ressemble plus à une vrai évolution vers un vrai language objet, que la proposition 6 qui est, selon moi, plus une évolution de la syntaxe.

  5. #5
    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 : 53
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    D'une manière générale "Contre" les 2 propositions.

    En tous cas un TRES GROS "Contre" la proposition 1. En java, le mot clé "this" représente une instance (référence) et non pas un type (classe).

    Java est un langage fortement typé, en conséquence le type de retour doit etre associé au moment de sa déclaration (ici au nom de la méthode).

    Au mieux, ca serait à l'ecriture de la classe fille qu'il faudrait apporter des améliorations, par exemple avec les annotations:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Buffer {
        Buffer flip() { ... }
        Buffer position(int newPos) { ... }
        Buffer limit(int newLimit) { ... }
    }
     
    @generateSelfTypeDecorators("Buffer")
    class ByteBuffer extends Buffer {
        ByteBuffer put(byte data) { ... }
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Au mieux, ca serait à l'ecriture de la classe fille qu'il faudrait apporter des améliorations, par exemple avec les annotations:
    Je trouve au contraire que c'est à la classe parente d'indiquer si elle retourne this ou une copie, sinon comment différencier ces deux méthode (autrement que par leurs noms) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public Buffer flip();
    public Buffer clone();
    La première retourne this afin de pouvoir utiliser le chainage de méthode.
    La seconde retourne une autre instance de Buffer.


    Avec cette proposition tout est clairement défini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public this flip();
    public Buffer clone();

    a++

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 230
    Par défaut
    Bonjour,

    j'ai voté contre moi aussi car, même si c'est un peu casse-cxxxx de faire des cast explicites, parfois un peu compliqués, mais c'est selon moi la seule manière de préserver une bonne lecture du code, une gestion rigoureuse des types et surtout un débogage rapide.

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Par défaut
    contre comme pour esteban.

  9. #9
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Ce problème de devoir faire un Cast est gonflant.
    Je préfère le "This" au "this" car pour moi le "this" est une instance et pas une classe. "This" correspond plus dans mon esprit à la notion de classe.

  10. #10
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2007
    Messages : 17
    Par défaut
    J'aime l'idee, mais je ne pense pas que ca ferait programmation serieusement plus facile. Et oui, 'This' est meilleur, 'this' est l'instance de la classe, alors 'This' peut etre la classe.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4
    Par défaut Pour
    La proposition permet d'écrire simplement ce que les types génériques permettent déjà de faire de manière un peu lourde.
    Je suis pour les deux propositions car elles elles pourraient signifier deux choses différentes :

    • This indiquerait que le type de retour doit être le même que celui de la classe qui implémente la méthode
    • this indiquerait carrément que l'objet retourné est la même instance de la classe sur laquelle on a invoqué la méthode


    A mon sens ces deux notions peuvent être utiles; sachant que la deuxième est une vraie nouveauté.

  12. #12
    Invité de passage

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 995
    Par défaut
    J'aime bien la proposition 2 : This, classe de l'objet this. Ca suit la notation conseillée pour Java, c'est très clair, je trouve.

  13. #13
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Pour la proposition 2, mais pas pour les appels chaînés, plutôt pour des méthodes comme clone().

    C'est juste que j'ai toujours été frustré de me faire ch... à bien vérifier mes generics, et à quand même me taper les warnings à cause d'un clone. C'est pas pour faire mon râleur, c'est juste que je trouve l'illustration mal choisie. Je suis pas fan des appels chaînés, mais l'utilisation d'un type This combiné avec les generics peut apporter de l'expressivité (je crois).
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  14. #14
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par xavlours Voir le message
    Pour la proposition 2, mais pas pour les appels chaînés, plutôt pour des méthodes comme clone().
    Hum en effet cela pourrait être vraiment pas mal !

    Par contre je me demande s'il est possible de modifier la définition de clone() sans casser la compatibilité...

    a++

  15. #15
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Par contre je me demande s'il est possible de modifier la définition de clone() sans casser la compatibilité...
    En théorie, ça devrait être faisable, puisque l'objet renvoyé par clone() doit être du même type que l'objet d'origine. Mais rien ne le garantit à la compilation (ni même à l'exécution).
    On peut imaginer une implémentation de List tellement exotique (ou crade) que le développeur décide de renvoyer une ArrayList ou une LinkedList lors du clone. Si cette List est fournie par une Factory, l'utilisateur ne s'en rendra même pas compte à l'exécution, puisqu'il manipule une List, et qu'il caste son clone en List. Par contre, le jour du changement de JRE, ça plante.

    Mais tant pis pour eux, je suis toujours pour .
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 259
    Par défaut
    Ca pourrait être pas mal car la syntaxe des generics style
    ByteBuffer extends Buffer<ByteBuffer>
    ou la classe se passe elle même en paramètre de sa mère est un peu moche par contre un mot clef différent de this serait le bienvenu, peut être un <this> pour bien différencier les 2 non ?

  17. #17
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Voté pour la proposition 1 (pas la 2) comme ça, on évite d'ajouter un nouveau mot clé/type et on évite de casser ceux qui ont eu la malchance de nommer un de leurr type par
    This.

    Voté pour en général car ça permet de bâtir des APIs plus solides et extensibles: ça peut ne pas intéresser ceux qui mangent leur propre côde, mais dans les cas où on batît une couche sur laquelle d'autres bâtiront leur propre couche, etc., cette fonctionnalité est un must !

    P.S.: J'ai voté contré le chainage des appels void.

  18. #18
    Membre éclairé

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

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    En fait, ni l’une ni l’autre ne me séduisent.
    Niveau maintenance, je pense que le cast obligatoire a ses vertus.

    Je suis donc contre.

  19. #19
    Membre expérimenté
    Avatar de JHelp
    Inscrit en
    Octobre 2002
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 185
    Par défaut
    Je suis plutôt pour. On a ici une explication clair de ce que retourne la méthode.
    Par contre j'utiliserais This avec une majuscule pour l'instance et un mon clef style SameType pour le même type, pour ne pas avoir de confusion.
    Car si on lit un peu vite, This et this ça se ressemble beaucoup et j'imagine la confusion que pourrait en faire un débutant.
    JHelp

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 21
    Par défaut
    Bonsoir,
    Je suis assez d'accord avec cette proposition :

    pour indiquer que la méthode retournera this :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public this maMethode()... {
    //des choses
    //...
    return this; //optionnel
    }
    et sans majuscule car this est suffisamment explicite. (avec bien sur interdiction public static this methode()...)
    si j'ai bien compris qu'on ne parle que d'instance et non de classe.


    Par contre si on ne parle que de type:
    Si c'est pour avoir la même classe quelque soit l'instance je trouve ça risqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class A {
      public A renvoie(){ return new B() };
    }
     
    class B extends A {
    }
     
    class C extends A{
      public C renvoie(){ return (C)super.renvoie() };
    }
    appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    C c = new C();
    C c2 = c.renvoie();
    et là ClassCastException de B vers C.

    Peut être je me trompe mais je trouve que c'est plutôt dangereux de vouloir masquer un cast déjà potentiellement dangereux.

    A bientôt.

Discussions similaires

  1. rechercher tous les fichiers d'un même type
    Par didierdarras dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 07/09/2007, 10h43
  2. Réponses: 14
    Dernier message: 13/07/2007, 13h05
  3. Comment attraper tous les noeud d'un même type dans un tableau
    Par lodan dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 01/04/2007, 17h36
  4. 2 objets de même type dans une classe
    Par _R3nO_ dans le forum Hibernate
    Réponses: 2
    Dernier message: 28/02/2007, 17h12
  5. Réponses: 18
    Dernier message: 21/09/2006, 12h54

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