|
Publicité ' | ||||||||||||||||||||||||
|
|
#41 | ||||||||||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 460 ![]() |
Citation:
Citation:
Citation:
Le problème n'est pas le même : si ta classe aurait été immuable tu n'aurais pas eu à utiliser const... Lorsqu'un bon de commande est créé il ne varie plus, donc il est inutile d'avoir à modifier ses attribut... Perso j'aurais donc utiliser seulement des classes immuables (avec eventuellement un Builder pour les créer), par exemple si Client et Article sont immuable, j'écrirais écrit ceci : Code :
Maintenant si tu as une classe muable : Code :
Et que tu veux reprendre le principe du const il faut utiliser une interface qui serait implémenté par ta classe principale : Code :
Citation:
On a simplement dit que l'immuabilité est plus dans la philosophie de Java... alors que tu adoptes plus une approche C++ pas très adapté à Java (et donc tu déplores l'absence du const primordiale en C++) a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
||||||||||
|
00
|
|
|
#42 | ||||||
|
Membre habitué
![]() ![]() Inscription : janvier 2007 Messages : 342 ![]() |
Dans:
Code :
this.client = (Client)client.clone(); dans ton constructeur, à mon avis. Car ton private final Client client n'empêchera pas la modification du Client qui aura été renvoyé par getClient(). Si tu utilises l'interface Code :
public BonDeCommande extends BonDeCommandeInterface Car sinon, je peux écrire: Code :
|
||||||
|
|
00
|
|
|
#43 | ||||||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 460 ![]() |
Citation:
Sinon c'est vrai qu'il faudrait en faire une copie (mais dans ce cas on devrait alors le faire même si la classe est muable). Citation:
Code :
a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
||||||
|
00
|
|
|
#44 | |
|
Membre Expert
![]() Inscription : février 2007 Messages : 2 354 ![]() |
Citation:
Et nous avons également reconnu qu'il manquait certainement un mot clef à java, ou quelque chose, pour marquer le fait d'être en lecture seule. Par contre, là où nous ne sommes pas d'accord, je pense, est que nous pensons que c'est une fausse piste que de transformer un objet modifiable en un objet en lecture seule, par un simple mot clef. Cela n'empeche pas que cela existe dans un langage ; nous pensons simplement que c'est une mauvaise solution à un vrai problème. Dans le cas où cela existe, alors c'est evidemment plus facile à écrire. Mais cela reste une fausse piste. Juste une fausse piste facile à écrire. |
|
|
|
00
|
|
|
#45 | ||
|
Membre habitué
![]() ![]() Inscription : janvier 2007 Messages : 342 ![]() |
Je ne comprends pas en quoi l'emploi du mot-clé const est une fausse piste.
Peux-tu exposer un cas où son emploi conduit à une erreur? @adiGuba: Tu as raison de souligner que const_cast<...> a été un opérateur extrêmement décrié en C++. Mais l'on peut supposer que si const était repris en Java, Sun ne commettrait pas la bêtise d'implanter cette catastrophe-là. Il y en avait d'autres, dans le même genre. reinterpret_cast, en particulier. Et pour l'empêcher il suffit d'utiliser une classe wrapper comme je l'ai indiqué précédemment ( http://www.developpez.net/forums/sho...4&postcount=23 ) Il suffit? As-tu bien lu le code que tu proposes? Même s'il est bon (à démontrer), il apparaît comme une patouille. Code :
|
||
|
|
00
|
|
|
#46 |
|
Membre Expert
![]() Inscription : février 2007 Messages : 2 354 ![]() |
Je disais que la transformation, par un mot clef, de quelque chose de muable en quelque chose d'immuable était une fausse piste. Le mot clef const lui même, je m'en fous.
Cela ne me semble pas crédible de transmettre quelque chose à quelqu'un d'autre en lui disant : Ceci tu pourrais le modifier mais attention tu n'en as pas le droit. S'il a besoin de le modifier, alors il trouvera toujours une combine, et s'il n'en a pas besoin, alors il ne le fera pas. Dans ton exemple et ta solution, rien ne dit que l'utilisateur de ton BonDeCommande n'aura pas besoin de modifier la liste des articles, et en ce cas il trouvera les moyens de le faire, quelque soit les const et autres dont on aura affublé le code. C'est là dessus que l'on tique, et pas sur le fait que le terme const est rapide à écrire. Maintenant, que ce soit moi ou d'autres, on admet qu'il serait utile de marquer une classe ou une interface déjà construite comme étant en lecture seule. Je veux dire que cette chose ne sera pas transformée, mais qu'elle est. Un String est en lecture seule ; un StringBuffer, non. Je crois qu'il serait bon de pouvoir marquer String, mais pas d'interdire ponctuellement par un mot clef d'écrire un StringBuffer. |
|
|
00
|
|
|
#47 | |
|
Membre Expert
![]() Inscription : janvier 2005 Messages : 2 801 ![]() |
Citation:
Par exemple, tu veux transmettre à ta vue une liste d'éléments du modèle. Tu pourrais imaginer lui transmettre ta List<UnObjet>, mais tu ne veux pas car il pourrait faire un .add(...) qui rendrait la gestion de ton modèle totalement incohérente. Ce que tu es obligé de faire pour garantir cela actuellement, c'est de renvoyer un Collections.unmodifiableList(taListe) (une vue non modifiable, mais dont le pattern laisse à désirer - jète une exception au runtime). Si le const était implémenté, il n'y aurait pas de "combine" pour le modifier... |
|
|
|
00
|
|
|
#48 | ||
|
Membre Expert
![]() Inscription : février 2007 Messages : 2 354 ![]() |
Citation:
Si tu veux transmettre une liste d'éléments, liste non modifiable, alors c'est qu'il y a une raison en rapport avec l'usage, et le domaine, et donc, quelque part, tu dois imaginer une classe qui exprimerait cela. C'est en recherchant cette classe que tu construiras un ensemble cohérent, et non pas en te protégeant d'usages qui seraient mauvais. Je sais bien que dans le jdk il n'y a que des trucs bancals au sujet des listes en lecture seule, et cela m'a souvent dérangé. Donc je fais des listes à moi, sans add. (en général un tableau, tout simplement). Citation:
Mais le problème fondamental demeure : l'objet que tu transmets est inadapté à son usage, puisqu'il comporte des méthodes que tu dois masquer, au risque de rendre la gestion de ton modèle incohérente. Si la gestion d'un modèle est incohérente, c'est que le modèle est incohérent. Bien sûr, rien n'est parfait, etc, aussi je conçois que l'usage d'un mot clef pourrait permettre certaines adaptations diverses. J'ai moi même bien d'autres combines approximatives. Je pense qu'il y aurait meilleur compte à définir et à pouvoir marquer ce qu'est un objet fixe, ou constant, ou immuable, peut être dans l'approche des effets de bord (pour dire qu'il n'y en a pas, bien sûr). |
||
|
|
00
|
|
|
#49 | ||||||||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 460 ![]() |
Citation:
L'utilisation du const aurait pu être une solution en Java s'il aurait été utilisée depuis le début, mais ce n'est pas le cas et l'utilisation des interfaces lui a été privilégié. Personnellement je ne vois pas de grosse différence entre les deux solutions sur le point de vue des possibilités offertes. Citation:
Code :
Mais j'avoue que je ne l'utilise pas les proxys pour cela (je me contente de l'interface). Mais tout cela est une affaire de contrat : si une méthode utilise un type spécifique elle ne doit normalement pas faire de cas particulier ou estimer qu'il s'agit d'un sous-type particulier (sauf bien sûr si c'est justement le rôle de la méthode). Tout comme une méthode C++ qui attend un const ne devrait pas utiliser const_cast... Citation:
Citation:
Code :
Mais quoi qu'il en soit l'intégration du const, et surtout son utilisation dans les APIs standards, ajouterait trop de problème d'incompatibilité pour que ce soit envisagé... a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
||||||||
|
00
|
|
|
#50 |
![]() ![]() Logan Développeur Java Inscription : août 2005 Messages : 1 305 ![]() |
Je ne vois pas en quoi la méthode clone() n'a pas de sens sur un objet Immuable : on peut avoir 2 objets identiques (même modèle de téléphone avec le même répertoire, etc...) sans se partager le même objet. D'ailleurs cela empêcherait l'utilisation de prototypes ...
En faite le vrai problème c'est de savoir si l'on veut un objet qui ne soit pas modifiable temporairement ? ou pour toute sa vie ? Dans le premier cas, il s'agit d'un problème d'autorité. Soit on utilise un verrou, soit on implémente Observer (pas nécessairement Listener). Dans le deuxième cas, il s'agit bien de l'instance d'une classe spécifique et on peut utiliser la magnifique Exception créée pour cela : UnsupportedOperationException (Voir le pattern Composant-Composé). Enfin une dernière question qu'il est bon de se poser : quel est le niveau de constance ? Si mon objet se compose d'une collection, est-ce que je peux ajouter ou retirer des éléments de celles-ci ? Est-ce ses éléments sont constants eux aussi ? Les mêmes questions se posent pour tout attribut non primitif... Mon avis est donc qu'un mot clé est inutile et que la solution sera différente pour chaque classe au sein d'un même système souhaitant utilisé ce principe. |
|
|
00
|
|
|
#51 | |||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 460 ![]() |
Citation:
Citation:
Citation:
a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
|||
|
00
|
|
|
#52 |
![]() ![]() Logan Développeur Java Inscription : août 2005 Messages : 1 305 ![]() |
Ok j'avais pris l'utilisation du mot "const" comme quelque chose de temporaire... Dans ce cas, soit utilisé que des éléments primitifs finaux (y compris dans les classes en attribut), soit la solution que j'ai évoquée.
La duplication d'un objet (ie un téléphone) permet à deux utilisateurs (ie toi et moi) de partager un objet sembable (ie téléphone de même modèle) mais distinct ! Pardon, j'étais dans mon truc et j'ai oublié de dire que les "prototypes" sont issus d'un Pattern ("Prototype" ?) de fabrique qui consiste à stocker des instances et à les dupliquer pour les demandeurs. |
|
|
00
|
|
|
#53 | ||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 460 ![]() |
Citation:
const est bien "temporaire" et permet grosso-modo d'avoir une vue en lecture seule sur un objet muable. Citation:
Mais si l'objet est immuable il ne pourra pas du tout être modifié, et donc tous les utilisateurs peuvent se partager la même instance sans que cela ne pose de problème... a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
||
|
00
|
|
|
#54 |
![]() ![]() Logan Développeur Java Inscription : août 2005 Messages : 1 305 ![]() |
Effectivement dans ce cas-là, le clone() ne semble pas utile... Excepté si l'on a tendance à comparer les références pour des raisons x ou y. Exemple : un verrou ?
Bon j'avoue un verrou avec des données ça peut sembler étrange. Mais s'il est porteur d'un contexte ça peut avoir du sens... Encore que un Singleton qui map le verrou avec son contexte résoudrait le problème. Mais je suis sûr qu'il doit bien exister un cas ou c'est nécessaire .... |
|
|
00
|
|
|
#55 |
|
Membre Expert
![]() Inscription : février 2007 Messages : 2 354 ![]() |
Ah ouf la discussion revient on commençait à s'ennuyer !
Moi non plus je ne vois pas trop à quoi le clone d'un objet constant pourrait servir... Puisqu'on aborde les diverses formes de <non>const c++</non><oui>immuables</oui>, voici un truc que j'avais trouvé interessant pour la culture générale : Implement a relaxed immutability model. |
|
|
00
|
|
|
#56 | ||||||||
|
Membre éclairé
![]() Achille Étudiant Inscription : septembre 2007 Messages : 340 ![]() |
Bonjour à tous, la discussion n'a pas été visitée depuis pas mal de temps mais c'est la première fois que je tombe dessus et en lisant ces pages j'ai pensé à un truc.
Est-ce que quelque choses comme ceci ne ferait pas le travail du mot-clé const : 1) d'abord une exception Code :
Code :
Code :
- il faut appeller checkConst() dans toutes les méthodes qui modifient les champs de l'objet. - il faut un booléen au constructeur de toutes les classes qui héritent de l'interface. - il faut réécrire toutes les classes écrites en java pour implémenter cette fonctionnalité. Pour résourdre le dernier point (oui on prend les choses à l'envers) il faudrait que se soit la classe object qui fournisse la méthode checkConst() mais bon si on parle d'extension du JDK c'est sun qui s'en charge donc pas de problème de ce côté... et on peut même passer la méthode en protected pour plus de propreté dans le code. Pour pallier au deuxième problème on pourrait apporter les modifications suivantes : (on implémentes ces fonctionnalités à la classe Object) Code :
Le dernier problème restant est que l'appel de checkConst() est nécessaire pour vérifier la validité des affectation de valeurs aux champs d'un objet. Le plus simple serait que la machine virtuelle effectue le travail seule, en appellant checConst() â chaque fois qu'une affectation à lieu mais ne sait pas si c'est implémentable ni quel peut en être le coup sur les performance. Je pense qu'une dernière difficulté se siturait là car si le comportement du mot clé const est défini il devrait pouvoir être gérer par le compilateur alors qu'avec ce type d'implémentation les test sont fait en temps réel donc ont un coup en temps de calcul pendant l'execution. Voilà c'était juste pour vous faire part des idées que cette discussion m'a évoqué. Bonne soirée, à bientôt. |
||||||||
|
|
00
|
|
|
#57 |
![]() ![]() |
Salut @ Tous !
Je ne veux pas jeter du gas (comprenez de l'essence) sur un feu éteint... Mais simplement attirer votre attention sur le modifier "transient" => http://java.sun.com/docs/books/jls/t...s.html#8.3.1.3 dont la sémantique correspond pour une certaine utilisation de const décrite dans la discussion. ceci à pour avantage de ne pas du tout overlapper sur final... Et peut-être dans certains cas, un ajout de sémantique sur transient permettrait d'obtenir la sémantique désirée pour const ++
__________________
Rédacteur "éclectique" (XML, IRC, Web...) Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC) je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque ! pensez à la balise [code] (bouton #) et au tag (en bas)
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com