Question sur le "use fields" pragma

Question sur le "use fields" pragma - Perl - Programmation

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:
 

Code :
  1. {
  2.         package Foo;
  3.         use fields qw(foo bar _Foo_private);
  4. sub new {
  5.     my Foo $self = shift;
  6.     unless (ref $self) {
  7.  $self = fields::new($self);
  8.  $self->{_Foo_private} = "this is Foo's secret";
  9.     }
  10.     $self->{foo} = 10;
  11.     $self->{bar} = 20;
  12.     return $self;
  13. }
  14.     }


 
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?
 
 
 

Reply

Marsh Posté le 29-10-2005 à 15:51:43   

Reply

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.

Reply

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...

Reply

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

Reply

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?

Reply

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 :
  1. package Foo;
  2. use Benchmark;
  3. sub new {
  4.   ....
  5. }
  6. sub m1 {
  7.   my Foo $self = shift;
  8.   for (1..100) {
  9.     $self->{foo}
  10.   }
  11. }
  12. sub m2 {
  13.   my $self = shift;
  14.   for (1..100) {
  15.     $self->{foo}
  16.   }
  17. }
  18. sub bench_it {
  19.   my Foo $self = shift;
  20.   my $iterations = shift || 1000;
  21.   timethese($iterations, {
  22.     avec_typage => sub{$self->m1},
  23.     sans_typage => sub{$self->m2},
  24.   });
  25. }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed