|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
|
Membre régulier
![]() Inscription : août 2005 Messages : 56 ![]() |
Bonjour,
Voici une petite synthèse concernant les différents opérateurs d'affectation, en complément des informations de la documentation de PC-Soft accessible ici : http://doc.pcsoft.fr/fr-FR/?utilisation-des-objets. Depuis la version 14 de Windev de nouveaux opérateurs d'affectation sont apparus (<- et <=). Ces opérateurs permettent de copier ou de cloner des objets (instances de classe) entre eux. Je part du principe arbitraire que : -"Copier par valeur" un objet vers un autre consiste à dire que la valeur des membres de l'objet de destination sera identique à celle de l'objet source de la copie. Dans ce cas, les deux objets sont indépendants l'un de l'autre. Si vous modifiez la valeur d'un membre de l'objet A, cette valeur ne sera pas modifiée dans l'objet B. Code :
Dans ce cas, les deux objets sont en fait un seul et même objet. Si vous modifiez la valeur d'un membre de l'objet A, cette valeur sera aussi modifiée dans l'objet B. Code :
Code :
![]() L'opération ObjA <= ObjB ou ObjA = ObjB peut ainsi aboutir à deux objets dont certains membres représentent en fait un seul et même membre partagé entre les deux instances et dont d'autres membres ont simplement une valeur identique. De manière plus synthétique, on peut dire que : Quelquesoit le type (dynamique ou non) des objets de part et d'autre de l'opérateur et le type de leurs membres, l'opérateur <- va : -"Copier l'adresse" TOUT les membres de ces deux objets. Quelquesoit le type (dynamique ou non) des objets de part et d'autre de l'opérateur, l'opérateur <= va : -"Copier la valeur" de TOUT les membres de type primitif, objet simple, tableau local et tableau associatif de primitifs, de structures ou d'objets simples. -"Copier l'adresse" de TOUT les membres de type objet dynamique, tableau, tableau dynamique et tableau associatif d'objets dynamiques (En gros des tableaux et tableaux de pointeurs). Pour conclure, pour être certain de bien pouvoir copier par valeur ou par adresse (l'un ou l'autre) l'intégralité des membres d'un objet, le plus simple est de se servir de l'opérateur <= ou de l'opérateur <- (et non de l'opérateur =) et de toujours utiliser dans vos objets des membres de type objet simple, tableau local ou tableau associatif de primitifs, de structures ou d'objets simples (non dynamiques). Notez qu'il est possible de charger un objet dynamique dans un membre de type objet simple sans qu'il n'y ai d'impact sur les règles d'affectation ci-dessus (A condition que cet objet soit lui même composé de membres non dynamiques ) : Code :
|
||||||||
|
|
30
|
|
|
#2 |
|
Membre émérite
![]() Inscription : août 2010 Messages : 531 ![]() |
Bonjour,
Habituellement, le mot "clonage" veut dire exactement le contraire de ce pour quoi vous l'employez, notamment en Java et C#, ce qui rend votre explication un peu difficile à lire. Je dirais plutôt "référencement". En C++ le clonage est appelé copie (comme dans votre explication) car c'est le fonctionnement standard de "=", comme en WinDev avec un objet "non dynamique". Mais en Java/C# "=" copie une référence, et un objet doit être "Cloneable" pour reproduire le "=" de WinDev avec la méthode "clone()". |
|
|
20
|
|
|
#3 | ||
|
Expert Confirmé
![]() Développeur informatique Inscription : août 2005 Messages : 1 529 ![]() |
Code :
D'une manière globale, je suis désolé, mais je trouve ton papier totalement imbouffable. Note que c'est pas de ta faute c'est juste le WLangage qui est imbouffable pour faire de la POO du coup c'est compliqué d'avoir quelque chose de clair. Le meilleur moyen de ne pas se planter est d'utiliser systématiquement ce qu'ils appellent des objets "dynamiques" c'est à dire des références. Là on peut alors raisonner comme en Java ou C#. Et l'opérateur = est tout indiqué pour avoir plusieurs références sur la même instance. EDIT : Et +1 avec Hibernatus, cloner c'est créer une instance à partir d'une autre identique à l'autre, c'est pas faire pointer deux références sur la même instance. C'est très très très une vraiment pas bonne idée de mélanger les termes comme ça. Pour un débutant ya rien de pire que ça. (Je me mets à la place du débutant en POO qui lit ça, il ne sait plus où il habite !)
__________________
"Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste." Kenneth E. Boulding "/home/earth is 102% full ... please delete anyone you can." Inconnu |
||
|
|
10
|
|
|
#4 |
|
Membre régulier
![]() Inscription : août 2005 Messages : 56 ![]() |
Bonjour, et merci pour vos commentaires.
@Marco 36 Évidemment que objB:iVal vaut 40 puisque ObjA est une référence (un pointeur si tu préfères). Donc forcément si tu lui dit de pointer au même endroit que B il vaut retourner la même valeur parce qu'il désigne la même valeur ... J'ai bien conscience qu'il s'agit d'une référence (un pointeur) et que le comportement est logique, je tente juste d'expliquer clairement pour les non initiés. Le principal problème que je soulève ici est que l'utilisation de l'opérateur <= ou = peut aboutir a des objets dont les membres sont pour certains des pointeurs (références) et d'autres non selon leur type dans la déclaration de l'objet, ce qui n'est pas vraiment explicité dans l'aide de PC-soft. Par exemple, le fait qu'un tableau associatif soit copié par valeur, alors qu'un tableau normal (non local) est copié par adresse avec l'opérateur <= ne va pas forcément de soi (y compris l'utilisation du mot clé "Local" pour les tableaux). Dans tout les cas, ce qui me semble être le plus important est de toujours utiliser dans les objets des membres de type objet simple, tableau local ou tableau associatif de primitifs, de structures ou d'objets simples (non dynamiques) pour la simple raison qu'il sera possible par la suite de copier la valeur de tout les membres d'un objet vers un autre OU de copier leur références, au choix : Si j'utilise un tableau dynamique t1 dans mon objet obj1, l'opération obj2 <= obj1 OU obj2 <- obj1 OU obj2 = obj1 fera TOUJOURS de mon membre t1 une référence partagée entre les instances. Concernant l'utilisation des termes "Copier" ou "Cloner", je les ai remplacé respectivement par "Copie par valeur" et Copie par adresse" pour qu'il n'y ai pas de confusion avec les autres langages, ces notions de "Copie" ou "Clonage" n'existant pas dans Windev. J'espère que ce sera plus clair pour tout le monde. |
|
|
10
|
|
|
#5 | ||
|
Expert Confirmé
![]() Développeur informatique Inscription : août 2005 Messages : 1 529 ![]() |
Citation:
Ceci dit, si le but est de faire découvrir la POO à des non-initiés je ne crois vraiment pas que le WLangage soit indiqué puisqu'il s'agit d'un langage procédural et non objet. Si quelqu'un veut apprendre la POO il doit s'orienter vers des langages véritablement objets, Java, C# ou qui l'implémentent correctement C++, ... Donc en fait, autant ton initiative part d'un bon sentiment et est utile (rien que pour le débat qu'elle provoque) mais par contre je la trouve mal ciblée. Elle devrait s'adresser à des gens qui connaissent déjà la POO et qui voudrait voir comment on peut faire avec Windev. Citation:
C'est plus clair car plus simple plutôt que d'aller s'embarrasser avec les termes PCSoft qui n'existent que dans le monde PCSoft. Oui c'est plus clair.
__________________
"Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste." Kenneth E. Boulding "/home/earth is 102% full ... please delete anyone you can." Inconnu |
||
|
|
00
|
|
|
#6 | |||||
|
Membre régulier
![]() Inscription : août 2005 Messages : 56 ![]() |
Citation:
Citation:
De plus l'ajout de fonctionnalités de reflection (à la java) et d'indirection sur les classes et les membres dans Windev 16 va apporter une grande souplesse et puissance dans la construction d'architectures complexes orientées objet dans Windev. Citation:
A chaque fois que j'ajoute un membre, je dois modifier cette méthode... Je veut pouvoir faire obj1 <= obj2 sans avoir à me soucier du type des membres de la classe, et ce quelque soit l'objet utilisé. De cette manière, le code devient beaucoup plus générique. De plus, je ne voit pas d’intérêt particulier à utiliser des membres dynamiques puisqu'il est possible de copier des références dans un membre non dynamique pour pouvoir profiter de la souplesse des pointeurs : Code :
|
|||||
|
|
00
|
|
|
#7 | |||||
|
Expert Confirmé
![]() Développeur informatique Inscription : août 2005 Messages : 1 529 ![]() |
Citation:
En clair : Code :
Mais ça, ça correspond à quoi : Où est l'opérateur d'instanciation ? Quel est l'intérêt d'une telle syntaxe à part créer de la confusion ? Cette notion de dynamique/non dynamique est une pure invention de PCSoft ou alors j'ai loupé un truc. La bonne et l'unique syntaxe devrait être quelque chose comme ça : Code :
__________________
"Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste." Kenneth E. Boulding "/home/earth is 102% full ... please delete anyone you can." Inconnu |
|||||
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() Inscription : décembre 2004 Messages : 19 652 ![]() |
Merci de limiter cette discussion au code proposé.
Ceci n'est pas une discussion sur la POO |
|
|
10
|
|
|
#9 | ||
|
Invité de passage
![]() Inscription : octobre 2007 Messages : 4 ![]() |
Bonjour,
article on ne peut plus interressant sur sujet (trop) peu documenté. je rencontre néanmoins un petit soucis... je lis plus haut qu'il vaut mieux eviter les allocation de membres dynamiques mais que ce passe t'il quand on doit le faire quand meme ? voici le code que j'ai posté sur le forum off aussi qui résume la situation : Code :
j'espere que je me trompe !!! |
||
|
|
01
|
|
|
#10 | ||
|
Membre émérite
![]() Inscription : août 2010 Messages : 531 ![]() |
Code :
Le mot clé "local" est important quand c'est un membre de structure/classe en revanche. |
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com