Question sur le "use fields" pragma - Perl - Programmation
Marsh Posté le 29-10-2005 à 20:02:05
tout d'abord le fait de recuperer self dans un new a pour but de pouvoir creer un objet à partir d'un autre, en faisant $obj->new() au lieu de CLASS->new. (d'ou le ref)
Perso je n'aime pas trop cette technique
Le second point propre à fields est le fait de typer ton objet à chaque fois (dans les methodes egalements) au moment du my. Ca n'est pas obligatoire, mais ca permet de profiter du gain de vitesse de fields: la hash table est en fait remplacée par une liste (pseudo hash, plus ou moins deprecated dans les versions actuelles de perl...)
Perso je te deconseil d'utiliser ce truc: le gain en vitesse est minim, il n'y a aucun gain en memoire, et la creation de l'objet est plus lente...
Le top du top à mon avis c'est d'utiliser le pragma enum::fields (sur CPAN). La tu a un vrai gain en vitesse et en memoire, aucune perte à la creation de l'objet (au contraire), et aucune besoin de typage pour enprofiter. Et tu a egalement l'encapsulation gratos.
Marsh Posté le 29-10-2005 à 23:28:12
Salut,
Merci pour ta réponse.
Je suis assez débutant en Perl, et je dois travailler sur du code existant, donc, je vais éviter l'utilisation de pragmas "externes".
Donc, pour en revenir à ce que tu disais, il y aura une réelle différence entre un "my Foo $self = shift;" et un "my $self = shift;" dans la méthode new? Je n'arrive pas à comprendre comment, sachant que de toute manière, le shift récupère une string contenant le nom de la "classe"?
Sinon, j'ai un peu regardé ce qu'il se passait de manière interne et effectivement, un "objet" créé avec un fields correspond à un tableau dans le premier élement est un pseudo hash renvoyant sur les éléments du tableau suivant. Par contre, d'après ce que j'ai lu, les accès sont résolus à la compilation, donc, ça doit être plutôt rapide...
Marsh Posté le 30-10-2005 à 09:15:39
oui,etc'est pour ca que tu dois le typer: pour qu'il sache que c'est un objet field et qu'il utilise le pseudo hash
Marsh Posté le 30-10-2005 à 09:18:56
Oui, mais quand je fais un $self = fields::new($self); dans mon new, même si je ne l'ai pas typée lors de la déclaration du my, il va bien savoir que c'est un objet fields, non?
Quel test pourrait me donner confirmation que ça apporte quelque chose?
Marsh Posté le 03-11-2005 à 11:34:00
oui, mais tu dois le retyper à chaque fois
pour tester tu peux faire un truc comme ca:
Code :
|
Marsh Posté le 29-10-2005 à 15:51:43
Salut,
Je lisais un peu de doc Perl concernant la création d'objets, et plus particulièrement la possibilité d'avoir des "objets rapides, en utilisant des tableaux sous jacents, avec un "use fields"
Voici le code sous jacent issue de la doc perl:
En fait, ma question concerna la ligne my Foo $self = shift;
Je voudrais comprendre ce que ça chandge de mettre un "my Foo $self" au mieu d'un "my $self". J'ai toujours vu cette dernière syntaxe... J'ai essayé d'enlever le Foo et j'ai exactement le même résultat... Ai-je raté une marche?
Ca vous dit quelque chose?