Feature, bug ou curiosité?

Bonsoir,

version 4Dv18R3, MacOS catalina

J’appelle une méthode en lui passant comme argument un objet :
$info:=maMethode($objet)

“maMethode” doit me renvoyer une info sur la taille d’une collection, ou le nombre de propriétés, bref ce n’est pas le problème, ça fonctionne, j’obtiens bien les infos. Mais pour faire son boulot elle modifie une collection contenue dans l’objet - et quand on revient dans la méthode appelante, on a la version modifiée de l’objet. Jusqu’à aujourd’hui à ma connaissance, avant les objets, on n’avait ce genre de résultat qu’en passant un pointeur sur la variable qu’on souhaitait modifier dans la méthode appelée et récupérer modifiée dans la méthode appelante.

Ce comportement est-il dans la doc ? ou bien est-ce une sorte de bug plutôt pratique mais sur lequel il ne faut pas trop se baser, au risque de planter à la prochaine mise à jour ?

Tant qu’à tester, j’ai essayé en passant une collection plutôt qu’un objet - ça ne marche pas…

Merci pour vos avis éclairés sur cette curiosité…

Bonjour,
Les objets sont manipulés par référence (comme les menus, les listes hiérarchiques …). Ce que vous avez constaté est donc normal et documenté.
Si vous souhaitez manipuler un objet sans en modifier l’original, il faut utiliser OB Copy pour créer une nouvelle instance.
Il existe une exception : Lorsque vous passez un objet comme paramètre à un nouveau process, 4D passe une copie de l’original.

1 Like

Pour ce qui est de passer une collection à une méthode, c’est parfaitement licite. Il faudrait nous expliquer dans quelles circonstances vous n’arrivez pas à vos fins.

Désolé, je me suis mal exprimé : aucun problème avec le passage d’une collection comme argument, mais je constatais que le comportement n’était pas le même. Si je la modifie dans la méthode appelée, elle est intacte dans la méthode appelante - ce qui était le comportement que je supposais normal depuis … 30 ans (?) avec 4D.

En tout cas merci pour cette confirmation sur le passage des objets par référence. J’avais cherché mais pas assez bien pour trouver l’information dans la doc, et maintenant je ne vais plus hésiter à l’utiliser. Je dévie un peu du sujet, mais j’ai aussi cherché (et pas trouvé) si il y avait des précisions concernant l’impact sur les performances des C_VARIANT comme retour des méthodes appelées ?

Laurent,
je confirme, ça marche aussi avec une collection. Si ça ne marche pas c’est probablement que ta collection n’est pas instanciée (si ça se dit comme ça…) avant l’appel :

  • marchera pas :
c_collection($coll)
maMethodeQuiModifieColl ($coll)
  • marchera :
c_collection($coll)
$coll:=New collection
maMethodeQuiModifieColl ($coll)

Il y a une autre exception que celle mentionnée par Vincent, c’est celle d’une méthode avec l’attribut “executer sur serveur” vis à vis des paramètres $1, $2, etc. quand ce sont des références. Elle peut :

  • recevoir une “référence-pointeur” et retourner ce qui est pointé après l’avoir modifié (on peut modifier un tableau pointé par $1, par exemple)
  • recevoir une “référence-objet/collection” mais ne peut la retourner modifiée ; le contournement dans ce cas consiste à utiliser $0

Soit dit en passant, même si le second comportement est un peu antagonique du premier, c’est un joli tour de force que 2 postes (client et serveur) puissent “voir” la même chose dans une référence (adresse mémoire.)

2 Likes

effectivement…
et en plus la méthode des tests devait avoir un autre problème, je n’arrive pas à reproduire aujourd’hui le problème d’hier.

décidément, cette période de désoeuvrement forcé - et un summit dématérialisé - auront été vraiment profitable pour la modernisation de mes connaissances 4D.

Oui, elles et ils ont fait un sacré beau boulot. Bravo l’impro !