Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1428 connectés 

  FORUM HardWare.fr
  Programmation
  Algo

  clonage d'objets

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

clonage d'objets

n°395115
lorill
Posté le 15-05-2003 à 14:40:12  profilanswer
 

Bon, résumé de la situation. J'ai un ptit langage de programmation qui marchote. La dedans, j'ai des objets. Et je voudrais bien les cloner.  
 
Les objets sont représentés en C par une structure, contenant une table des attributs accessibles du langage, et des données C.
 
Bon. Pour cloner, j'avais pensé a ca :

Code :
  1. methode clone():
  2. racineDuClonage = faux
  3. si contexte.enCoursDeClonage() est faux:
  4.    context.initClonage()
  5.    racineDuClonage = vrai
  6. si contexte.dejaCloné(self):
  7.    return contexte.cloneDuPointeur(self)
  8. copie = Object.create()
  9. contexte.memoriseClone(self, copie)
  10. pour chaque membre M de la structure clonée:
  11.    copie.M = M.clone()
  12. si racineDuClonage:
  13.    contexte.resetClonage()
  14. retourne copie


 
hélas, comme kadreg< me l'a fait remarquer, l'algo est faux (trop simpliste)
 

kadreg a écrit :


parcequ'il fait pas de différence entre association, composition et aggregation. Il présuppose que tout est composition, et c'est loin d'être toujours le cas.
 
 


--------------       --------        ---------
| Professeur | ----> |classe| -----> | eleve |
--------------       --------        ---------


 
J'aimerais que si tu clone un professeur, qu'il ne me clone pas tous les élève de toutes les classes auquel ce professeur donne court.


 
ce quoi j'ai repondu :
 

lorill a écrit :


ha oui, tiens [:gratgrat]
mince.
 
comment je vais distinguer ca de :


--------------         --------------          ----------
| Hashtable  |  ----<> | Professeur | -----<#> | String |
--------------         --------------          ----------


 
c'est plus complexe que ce que je pensais :/  


 
 
une solution de fénéant que je vois serait de préciser lors du rattachement de l'attribut a l'objet si cet attribut fait partie de l'objet ou si ce n'est que la représentation d'une relation.
 
mais bof... des avis ?

mood
Publicité
Posté le 15-05-2003 à 14:40:12  profilanswer
 

n°395856
nraynaud
lol
Posté le 15-05-2003 à 19:28:27  profilanswer
 

lorill a écrit :

Bon, résumé de la situation. J'ai un ptit langage de programmation qui marchote. La dedans, j'ai des objets. Et je voudrais bien les cloner.  


 
2 solutions : deep copy ou swallow copy.
le principe swallow copy (copie en surface) : tu copies l'objet brutalement en recopiant les références.

Code :
  1. objetA-------->objetB
  2. copieA---------^


ça on sait faire, c'est facile.
 
 
deep copy (copie profonde) : tu copies l'objet et les objets qu'il référence.

Code :
  1. objetA-------->objetB
  2. copieA-------->copieB


ça c'est plus chiant, car tu va suivre des références.
donc la configuration suivante :

Code :
  1. objetA-------->objetB----->objetC-,
  2. ^---------------------------------'


devrait raisonablement envoyer ton algo dans l'espace.
C'est la présence de cycles qui fout la merde.
Il faut un détecteur de cycles ; le plus simple est un marquage des objets copiés. Tu prends un objet, s'il est pas marqué tu le copies et tu le marques, sinon tu le copies pas, tu t'arrêtes.
Il existe un autre algo, le lièvre et la tortue, mais je vois pas comment l'appliquer à ce cas.
 
Bien entendu, comme c'est un graphe plus complexe, ton algo doit être plus chiadé :  
- parcours en largeur ; lorsque tu es "bloqué" (fin de cycle ou feuille) tu reprends le suivant dans la file (j'espère que tu sais faire un parcour en largeur).
- parcours en profondeur ; lorsque tu es "bloqué" tu remontes dans le graphe jusqu'à trouver un objet dont un des champs n'a pas été copié. Je te déconseille fortement d'implanter cet algo en version récursive.
 
D'autre part, si tu es en monotache, tu peux éventuellement mettre en dur le champ de marquage des objets dans les entêtes (mais fait bien gaffe par la suite, c'est pas réentrant). Sinon, tu utilises un ensemble par identité (identitySet) dans un itérateur (c'est réentrant et propre mais ça bouffe de la mémoire).
 
Pour des exemples de code : Object#deepCopy et Object#swalowCopy de smalltalk.

n°395858
lorill
Posté le 15-05-2003 à 19:31:05  profilanswer
 

en fait moi c'est un clonage en profondeur que je veux (deep copy, donc).
 
la gestion des cycles, je pense gérer ca comme dans mon algo au premier post. Le probleme, c'est plus de savoir si je dois cloner un objet ou juste copier sa réference selon le cas.

n°395868
nraynaud
lol
Posté le 15-05-2003 à 19:37:11  profilanswer
 

lorill a écrit :

en fait moi c'est un clonage en profondeur que je veux (deep copy, donc).
 
la gestion des cycles, je pense gérer ca comme dans mon algo au premier post. Le probleme, c'est plus de savoir si je dois cloner un objet ou juste copier sa réference selon le cas.


http://java.sun.com/j2se/1.4.1/doc [...] ml#clone()
mais sans hiérarchie ça me parraît dur.
donc tag sur les champs.

n°395876
lorill
Posté le 15-05-2003 à 19:42:29  profilanswer
 

nraynaud a écrit :


donc tag sur les champs.


c'est a dire (tagger quoi ?) ?
marquer le fait que le champs soit "a cloner" ou tu penses a autre chose ?

n°395883
nraynaud
lol
Posté le 15-05-2003 à 19:46:09  profilanswer
 

lorill a écrit :


c'est a dire (tagger quoi ?) ?
marquer le fait que le champs soit "a cloner" ou tu penses a autre chose ?


non, c'est ça.
 
à moins que tu n'aies un moyen d'appeler la fonction que tu est en train de réecrire dans ton langage (l'équivalent de super() en java), ce qui me parraît peu probable.

n°395892
gilou
Modérateur
Modzilla
Posté le 15-05-2003 à 19:49:34  profilanswer
 

nraynaud a écrit :


 
2 solutions : deep copy ou swallow copy.
le principe swallow copy (copie en surface) : tu copies l'objet brutalement en recopiant les références.

shallow copy!
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°395902
lorill
Posté le 15-05-2003 à 19:53:31  profilanswer
 

nraynaud a écrit :


non, c'est ça.


ok, c'est la solution que j'avais envisagé fin du premier message, donc.
 
par contre je vois pas comment cloner sans récursion :??:
parce qu'en fait, les objets du langage, ca va, je peux les recuperer en iterant, mais j'ai aucun moyen de savoir si j'ai un char* a copier dans la structure, en dehors de la table des attributs...

n°395904
nraynaud
lol
Posté le 15-05-2003 à 19:54:15  profilanswer
 

gilou a écrit :

shallow copy!
A+,


gloups en plus je viens de le voir passer dans google donc shamallow copy mais gaffe à pas s'étouffer.
 
Au fait, ça à rien à foutre dans algo cette discussion, j'ai passé 20min à répondre à côté de la plaque à cause de ça.

n°395906
lorill
Posté le 15-05-2003 à 19:55:17  profilanswer
 

nraynaud a écrit :


Au fait, ça à rien à foutre dans algo cette discussion, j'ai passé 20min à répondre à côté de la plaque à cause de ça.


 
ben si, quand meme... tu le mettrais ou sinon ?

mood
Publicité
Posté le 15-05-2003 à 19:55:17  profilanswer
 

n°395909
nraynaud
lol
Posté le 15-05-2003 à 19:56:47  profilanswer
 

lorill a écrit :


parce qu'en fait, les objets du langage, ca va, je peux les recuperer en iterant, mais j'ai aucun moyen de savoir si j'ai un char* a copier dans la structure, en dehors de la table des attributs...


"Maître, reformulez votre question."
 
J'ai pas compris.

n°395912
nraynaud
lol
Posté le 15-05-2003 à 19:58:38  profilanswer
 

lorill a écrit :


 
ben si, quand meme... tu le mettrais ou sinon ?


Divers, y'a rien pour la conception des langages ici.

n°395916
lorill
Posté le 15-05-2003 à 20:01:21  profilanswer
 

prenons une String par exemple :
dedans j'ai ca :
 - StringTable * attributes (héritée d'Object)
 - char * value
 
maintenant un Integer :
 - StringTable * attributes
 - mpz_t value
 
si j'itere, je peux avoir une variable de type Object. Donc je peux cloner tout ce qui rentre dans la StringTable (les attributs). Par contre, impossible de savoir comment copier le reste.
 
Il me faut donc une implémentation par type, et appeller recursivement ces différentes méthodes clone().
 
C'est plus clair ?

n°395941
nraynaud
lol
Posté le 15-05-2003 à 20:10:12  profilanswer
 

lorill a écrit :


C'est plus clair ?


pas trop, tes exemples sont des types primitifs, il faut toujours trafiquer pour les types primitifs.
Mais un objet normal (pas integer, pas string, pas float, pas bool, pas référence faible et pas tableau), ça a quelle tête ?

n°395944
lorill
Posté le 15-05-2003 à 20:11:58  profilanswer
 

nraynaud a écrit :


pas trop, tes exemples sont des types primitifs, il faut toujours trafiquer pour les types primitifs.
Mais un objet normal (pas integer, pas string, pas float, pas bool, pas référence faible et pas tableau), ça a quelle tête ?


ha, ca c'est pas un probleme, y'a que les types primitifs qui sont chiants :o
 
un objet normal, c'est juste un type primitif avec des attributs en plus (des entrees supplémentaires dans la StringTable, donc). Du coup, la méthode clone() du type primitif duquel est dérivé l'objet s'applique

n°395954
nraynaud
lol
Posté le 15-05-2003 à 20:14:50  profilanswer
 

lorill a écrit :


ha, ca c'est pas un probleme, y'a que les types primitifs qui sont chiants :o
 
un objet normal, c'est juste un type primitif avec des attributs en plus (des entrees supplémentaires dans la StringTable, donc). Du coup, la méthode clone() du type primitif duquel est dérivé l'objet s'applique


ok, alors fais-le récursivement.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

  clonage d'objets

 

Sujets relatifs
JavaScript, accéder à plusieurs objets via une boucleDésactiver des objets d'un formulaire en cliquant dans une checkbox
J'aimerai bien faire un truc de ce style..(Gestion graphique d'objets)Envoyer plusieurs objets ACCESS via Outlook
[PHP] Afficher dans boucle les caract de 3 objets de même type ...[c++] construction de tableau d'objets
[php] session : pb utilisation avec des "objets"[PHP] utiliser beaucoup d'objets en php ?
Roles des objets tables et formulaire au sein d'une sgbdrClonage d'objets RESOLU
Plus de sujets relatifs à : clonage d'objets


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR