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

  FORUM HardWare.fr
  Programmation
  Perl

  Question sur le "use fields" pragma

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Question sur le "use fields" pragma

n°1234126
Yoyo@
Posté le 29-10-2005 à 15:51:43  profilanswer
 

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?
 
 
 

mood
Publicité
Posté le 29-10-2005 à 15:51:43  profilanswer
 

n°1234243
pospos
Posté le 29-10-2005 à 20:02:05  profilanswer
 

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.

n°1234300
Yoyo@
Posté le 29-10-2005 à 23:28:12  profilanswer
 

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

n°1234363
pospos
Posté le 30-10-2005 à 09:15:39  profilanswer
 

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

n°1234365
Yoyo@
Posté le 30-10-2005 à 09:18:56  profilanswer
 

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?

n°1237274
pospos
Posté le 03-11-2005 à 11:34:00  profilanswer
 

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


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

  Question sur le "use fields" pragma

 

Sujets relatifs
[JavaScript] question très bête !!![résolu]Menus - Question de débutant
[VBS] question d'noub sur les variables tabAfficher du code dans une page HTML : question de sémantique
tableaux 2d ...question de madame bellepaire de locheQuestion existentielle
[Question simple HTML] plus d'espace entre les imagesQuestion installation Mozilla Firefox svp
Une petite question sur une requete mysql. ;)question sur les free ..
Plus de sujets relatifs à : Question sur le "use fields" pragma


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