L'apparition du mot-clé const est-il prévu dans une version à venir du JDK?

Version imprimable

Voir 40 message(s) de cette discussion en une page
Page 2 sur 3 PremièrePremière 123 DernièreDernière
D'abord il existe une parentée entre la classe muable et son vis-à-vis immuable, mais ce n'est pas la même implémentation d'une classe parente. C'est une erreur que je commaittais au départ, et que j'essaie de ne plus commettre aujourd'hui. Il faut plutôt voir la classe immuable comme une sorte de clef, qui te donne accés, ou qui te permets de repérer, ou qui te permets de sanctuariser, une valeur muable.

En fait les deux valeurs - muable et immuable - ne sont pas utilisés dans les mêmes contextes, et donc n'ont pas les mêmes méthodes, les mêmes propos.

Citation:

Envoyé par grunt2000
  • Le nombre de bugs possibles lors de l'écriture d'un clone est important. Il est vraiment très facile de se tromper. Et quand on s'est trompé, sa classe immutable ne vaut plus rien.

  • Citation:

    Envoyé par grunt2000

    Peut être. Là encore, il faut comparer avec les autres solutions. Dans l'implémentation d'une interface, je n'ai jamais eu la sensation d'être très protégé.
    Citation:

    Envoyé par grunt2000
    - Si l'immuabilité est réalisée par une interface reprenant les getters et non une classe dédiée alors:
    • 20% (au moins) des développeurs se trompent et écrivent:
      class Personne extends ConstPersonne, ce qui est une faute.

    Oui et non. Classes muables et immuables évoluent de façon indépandantes.
    Donc...
  • 26/04/2007, 11h08
    adiGuba
    Citation:

    Envoyé par grunt2000
    - si c'est une classe immutable qui est réalisée, travaillant en interne sur une copie de données.

    Cela dépend des données que tu utilises !

    :arrow: Essayes de coder ta classe Personne en utilisant un StringBuffer (donc une classe muable) au lieu d'une String (qui est immuable), et tu verras que tu te retrouveras avec bien plus de copie de données...


    Citation:

    Envoyé par grunt2000
    Il y a consommation de temps système, de ressources mémoire.

    Faux les classes immuables permettent justement d'éviter des copies inutiles. Ce sont les classes muables qui impliques l'utilisation de ces copies !

    Citation:

    Envoyé par grunt2000
    Il faut créer un code dédié pour les setters

    Seulement pour les setters des attributs muables ;)

    Citation:

    Envoyé par grunt2000
    ou mettre en place une solide méthode clone().

    Une classe immuable n'a pas besoin d'être cloner !!! A quoi cela pourrait-il bien servir ???

    Citation:

    Envoyé par grunt2000
    Il existe donc deux implémentations d'une classe. La classe A et la classe AImmutable.

    Le seul point où je suis d'accord : on peut avoir besoin de deux implémentations (même si ce n'est pas forcément une obligation).
    L'implémentation immuable permet de partager la référence librement sans craindre qu'elle ne soit modifié.
    L'implémentation muable doit être utilisé de manière restreinte si on veut contrôler son état.

    Citation:

    Envoyé par grunt2000
    Le nombre de bugs possibles lors de l'écriture d'un clone est important. Il est vraiment très facile de se tromper. Et quand on s'est trompé, sa classe immutable ne vaut plus rien.

    Mais les classes immuables n'ont pas besoin d'être cloné... As-tu vu une implémentation de clone() dans la classe String ?

    Citation:

    Envoyé par grunt2000
    - Si l'immuabilité est réalisée par une interface reprenant les getters et non une classe dédiée alors:

    Alors ce n'est pas de l'immuabilité mais une "vue"...

    Citation:

    Envoyé par grunt2000
    20% (au moins) des développeurs se trompent et écrivent:
    class Personne extends ConstPersonne, ce qui est une faute.

    ...

    A aprtir de là je t'ai un peu perdu car je ne comprend pas trop ce que tu veux dire... :koi:



    Citation:

    Envoyé par gifffftane
    Et puis au fait tant qu'on y est, une autre technique utile et mieux que l'idée de la vue non modifiable est celle du listener (entre écouter et voir, y a-t-il une différence ? ), qui demande à réfléchir sur qui écoute quoi.

    Justement cela peut être un cas d'utilisation de la vue non-modifiable : tu veux que les listeners puissent avoir accès aux valeurs des attributs de ton objet muable, mais qu'il ne puisse pas le modifier...

    Donc soit tu utilises un objet Event immuable qui contiendrait une copie des attributs, soit tu utilises un wrapper qui ne te permettent que de voir les attribut...

    Pour moi immuabilité et vue non-modifiable sont deux choses très différentes ;)

    a++
  • 26/04/2007, 11h27
    grunt2000
    Bon on va se mettre d'accord sur un exemple.

    Voici cette classe:

    Code:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    /**
     * Une commande de client.
     */
    public class BonDeCommande
    {
    /** Le client qui a commandé. */
    private Client m_client;
     
    /** Le prix total de sa commande. */
    private double m_dPrix;
     
    /** La composition de sa commande. */
    private Vector<Article> m_composition;
     
        public BonDeCommande() {...}
        public Client getClient() {...}
        public double getPrix() {...}
        public Vector<Article> getArticles() {...}
        public void setClient(Client client) {...}
        public void setPrix(double prix) {...}
        public void setArticles(Vector<Articles> articles) {...}
    }

    Comment créez-vous soit votre classe soit votre interface (comme vous préférez) immutable à partir de celle-ci?

    Et comment l'employez-vous?

    J'ai une instance d'un bon de commande de noël à ma disposition,

    Code:

    1
    2
    3
    4
    5
    6
    7
    8
     
    BonDeCommande commandeDeNoel = new BonDeCommande();
    Vector<Article> cadeaux = new Vector<Article>();
    cadeaux.add(new Article("Train électrique"));
    cadeaux.add(new Article("Puzzle"));
    commandeDeNoel.setArticles(cadeaux);
    commandeDeNoel.setPrix(15);
    commandeDeNoel.setClient(new Client("Ernest le bel"));


    et je veux retourner un immutable de cet instance d'objet, commandeDeNoel, sous le nom commandeDeNoelConstante. Comment procédez-vous?

    Code:

    1
    2
     
    BonDeCommandeImmutable commandeDeNoelConstante = ... ?

  • 26/04/2007, 13h50
    gifffftane
    Question : pourquoi ? Et qui veut retourner une instance immuable, qui en a besoin ?

    Dans les cas où il n'y a pas de raison particulière, seulement une sorte de crainte que des développements futurs mettent le bazard dans des objets que j'ai peur que tout le monde modifie sans prévenir, alors j'utilise clone, c'est tout.

    Je trouve ça très pratique, parce que cela implique de réfléchir aux composants de l'objet (pour savoir comment gérer le clone en profondeur), réflexion qui servira plus tard à décider ce qu'il faudra retenir pour l'immuable.

    Ici, ce qui est intéressant, ce n'est pas vraiment de savoir s'il faudrait sous-cloner le Vector des articles, mais plutôt de savoir s'il faut cloner le client. En effet, cloner un client, à ce stade, cela ne veut sans doute pas dire grand chose.

    Donc la notion de constante sur un bon de commande implique la notion de constante sur le client. Etc.

    Et grâce au concept du clone, on peut mener et expérimenter cette réflexion avec un impact minima sur le code.

    De plus, comme l'ensemble des fonctions et propriétés de l'objet reste actif, on peut le soumettre à un plus grand nombre d'épreuves et de contraintes, de cas d'usages, qui affineront sa définition, et, peut être, aboutiront à d'autres choses que d'être de stupides constantes ; par exemple des classes plus adaptées à la GUI, ou à la sauvegarde, ou que sais-je.
  • 26/04/2007, 14h12
    adiGuba
    Citation:

    Envoyé par grunt2000
    Comment créez-vous soit votre classe soit votre interface (comme vous préférez) immutable à partir de celle-ci?

    Attention : on n'a pas parlé "d'interface immuable" (ce qui est impossible puisque l'immuabilité est une spécificité de l'implémentation) mais de "vue non-modifiable" (ce qui se rapproche le plus du concept du const...



    Enfin pour faire une classe immuable, il faut d'abord savoir si les attributs qui les composent sont muable ou pas. Donc il nous faut au moins que tu répondes aux infos suivantes :

    • La classe Client est-elle immuable ou pas ?
    • La classe Vector (j'aurais plutôt utilisé List dans une signature de méthode) est muable, mais qu'en est-il de la classe Article ? Muable ou pas ?


    De plus ces réponses ont également une influence sur le code de ta classe muable BonDeCommande, donc ce serait bien que tu donnes le code complet pour comparer ;)


    a++
  • 26/04/2007, 14h41
    grunt2000
    Je vais simplifier le problème ainsi.

    Cet objet BonDeCommande, j'en possède une instance nommée bonDeCommande.

    Je veux transmettre cette instance de BonDeCommande à cette fonction qui en a besoin:

    Code:

    1
    2
    3
    4
     
    public void ignobleFélon(.... bonDeCommande)
    {
    }

    Et comme je n'ai très confiance en elle, j'ai décidé de ne pas lui donner l'objet original.

    soit ainsi:
    public void ignobleFélon(BonDeCommandeImmutable bonDeCommande)

    en transmettant un objet "Immutable" basé sur une copie de l'instance bonDeCommande que j'ai, ou selon n'importe quel procédé de votre imagination qui la protègera.

    soit de cette manière:
    public void ignobleFélon(BonDeCommandeConst bonDeCommande)
    En utilisant une sous-interface "constante".


    Les membres de la classe BonDeCommande (Client, Article) ne sont pas immutables eux-mêmes au démarrage du problème posé.
  • 26/04/2007, 15h20
    gifffftane
    Je ne sais pas si l'exercice a un sens, mais enfin moi je clonerais tout, si tout est clonable. Sinon, je créerais un nouvelle objet BonDeCommande avec de nouveaux Clients et Articles, si je peux créer ces objets là. Si je ne peux pas le faire, alors je créerais une classe qui fasse toutes les interfaces (gros boulot, qui immanquablement, me fera penser que tout cela est complètement inutile et qu'en réfléchissant un petit peu, c'est à dire en changeant l'approche du problème, je trouverai quelque chose de mieux).

    Donc, moralité : change l'approche du problème.

    Au lieu de penser technique avec les const, pense cas d'usage utilisateur, et à ce que cela t'apprend sur son monde à lui.
  • 26/04/2007, 15h37
    grunt2000
    J'ai du mal à vous comprendre. Au début de ce message, j'ai dit que j'appelais de mes voeux l'arrivée du mot-clé const en java pour résoudre une gamme de problèmes que final ne parvient pas à traiter.

    Vous m'avez répondu qu'une classe immutable était ce qui se faisait de mieux pour traiter les problèmes que j'évoquais, et que cette pratique n'avait même aucun inconvénient.

    Et à présent que je demande son illustration sur un exemple concret, vous me répondez: "Changes-donc ton énoncé!". Et ainsi, vous ne répondez pas à la question posée.

    Moi je dis: java manque du mot-clé const, de manière définitive. Parce que si je l'avais, je confierais mon instance à une fonction seulement si elle me propose ce prototype:

    Code:

    1
    2
    3
    4
     
    public void ignobleFélon(const BonDeCommande bonDeCommande)
    {
    }

    Et ma classe BonDeCommande aurait été modifiée ainsi:

    Code:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    /**
     * Une commande de client.
     */
    public class BonDeCommande
    {
    /** Le client qui a commandé. */
    private Client m_client;
     
    /** Le prix total de sa commande. */
    private double m_dPrix;
     
    /** La composition de sa commande. */
    private Vector<Article> m_composition;
     
        public BonDeCommande() {...}
        public Client getClient() {return(m_client);} // Modifiable.
        public const Client getClient() const {return(m_client);} // Non modifiable.
     
        public double getPrix() const {return(m_dPrix);}
     
        public Vector<Article> getArticles() {return(m_articles);} // Modifiable
        public const Vector<const Article> getArticles() const {return(m_articles);} // Non modifiable.
     
        public void setClient(Client client) {...}
        public void setPrix(double prix) {...}
        public void setArticles(Vector<Articles> articles) {...}
    }

    Si vous pensez que vos pratiques de codage sont supérieures à ce qu'apporterait le mot-clé const, puisque vous le critiquez, pourquoi ne pas m'en donner une illustration sur l'exemple que je vous donne?

    Là, nous pourrons peser le pour et le contre!
  • Voir 40 message(s) de cette discussion en une page
    Page 2 sur 3 PremièrePremière 123 DernièreDernière