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

  FORUM HardWare.fr
  Programmation
  Perl

  [PERL] Objet et fonction "private"

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PERL] Objet et fonction "private"

n°601804
burgergold
5$? va chez l'diable!
Posté le 04-01-2004 à 06:08:56  profilanswer
 

je suis en train d'explorer la prog objet du coté de perl et me suis donc créé l'objet suivant
 

Code :
  1. package Html;
  2. use strict;
  3. sub new {
  4. my $class = shift;
  5. my $self = { };
  6. bless $self;
  7. $self->{"doctype"} = setDoctype();
  8. return $self;
  9. }
  10. sub setDoctype {
  11. my $self = shift;
  12. return "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">";
  13. }
  14. sub getDoctype {
  15.    my $self = shift;
  16. return $self->{"doctype"};
  17. }


 
ya moyen que ma fonction setDoctype soit private comme en C, et qu'elle ne puisse pas être appelé de l'extérieur de mon objet?


Message édité par burgergold le 04-01-2004 à 06:10:03
mood
Publicité
Posté le 04-01-2004 à 06:08:56  profilanswer
 

n°601964
burgergold
5$? va chez l'diable!
Posté le 04-01-2004 à 15:30:37  profilanswer
 

up
 
et j'ai ca quand j'exécute un script qui en fait le use
 
D:\>test.pl
Html.pm did not return a true value at D:\test.pl line 2.
BEGIN failed--compilation aborted at D:\test.pl line 2.

n°602017
burgergold
5$? va chez l'diable!
Posté le 04-01-2004 à 16:32:29  profilanswer
 

corrigé mais le up tiens toujours pour les fonctions du genre private
 

Code :
  1. package Html;
  2. use strict;
  3. sub new {
  4. my $class = shift;
  5. my $self = { };
  6. bless $self;
  7. $self->{"doctype"} = setDoctype();
  8. return $self;
  9. }
  10. 1;
  11. sub setDoctype {
  12. my $self = shift;
  13. return "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">";
  14. }
  15. sub getDoctype {
  16.    my $self = shift;
  17. return $self->{"doctype"};
  18. }

n°602117
pospos
Posté le 04-01-2004 à 20:12:50  profilanswer
 

pour ta tru value il faut mettre un 1; à lafin de tes modules
 
pour les fonctions privates ya pas vraiment de moyen normalement (ni pour les variables d'ailleurs, vu que self est souvent une reference à un hash ouvert à tous en lecture comme en ecriture...), mais l'usage est de mettre un '_' devant les fonctions privées
 
par exemple:
 
sub new{...}
 
sub getDoctype{...}
 
sub _setDoctype{...} # privée
 
et on fait de meme pour les varaible:
$self->{public}
$self->{_prive}
 
d'ailleurs le pragma fields (http://search.cpan.org/~mschwern/base-2.03/lib/fields.pm) rend privé les variables commencants par un _
 
en Perl on a l'habitude de ne jamais contraindre, donc l'usage c'est de n'utiliser que la convention du '_'

n°602120
burgergold
5$? va chez l'diable!
Posté le 04-01-2004 à 20:18:33  profilanswer
 

mais la fonction serait-elle vraiment innacessible de l'extérieur si jamais ya un _ devant?
 
en gros c'est que j'ai divers fonction qui vont manipuler mon objet mais dont l'utilisation seule ne servira à rien à l'utilisateur de ma lib, donc je m'étais dit: autant les rendre innacessible alors

n°602257
pospos
Posté le 04-01-2004 à 23:00:32  profilanswer
 

si elle sera accessible...
tous comme les variables avec un _ devant (sauf peut etre avec fields, mais je ne suis pas sur car je ne l'utilise pas)
 
je pense que tu pourrais troujer des moyens de rendre une fonction innaccessible de l'exterieur, par exemple avec qq chose du genre:
 
[code]
my $private_sub = sub {
  my $self = shift;
  my @args = @_;
  ...
}
 
$private_sub->($self, "1", "2", "3" );
 
[\code]
 
et dans ce cas cette fonction ne sera accessible que la ou $private_sub est accessible, mais bon tu pert la notation objet : tu est obligé de passe $self en premier argument, mais ca revient exactement au meme.
 
pour rappel:
[code]
my $h = Html->new;
 
# alors
$h->method(@args);
# est identique à  
Html::method($h, @args);
[\code]
 
sachant que le 2eme est meme un poil plus rapide...
de meme l'appel par deferencement à une focntion comme $private_sub->() est aussi rapide que l'appel directe
fin de la parenthese
 
pour en revenir à ton soucis, je ne pense pas qu'il faille te prendre la tete à interdir l'acces à une methode: c'est pas vraiment la phylisophie de Perl et du coup c'est pas naturel à faire
 
le mieux, c'est de faire un POD de ton module ou tu decrit les fonctions publics, qui sotn l'interface de ton module, et ou tu ne décrit pas les method privée (et tu met un _ devant pour t'y retrouver, et pour que le prochain developper Perl qui lira ton code s'y retrouve aussi)
 
apres si qq s'amuse à relire ton code et appel une fonction privée il sait k'il le fait à ses risques et péril (et si il le fait ca veut peut etre dire que ton interface est incomplete)
 
et dans ce cas il peut heriter de ta classe et réimplémenter une nouvelle méthode public qui fait ce qu'il veut (ce qui est impossible si tu a rendu ta method utltre privée avec le my $private_sub )
 
enfin voila koi, c'est à toi de voir
 


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

  [PERL] Objet et fonction "private"

 

Sujets relatifs
Melange de bbcode et html avec la fonction "nl2br" [résolu]return !0 en fin de fonction. D'ou viens cette notation ?
[PHP] Fonction qui supprime un fichier exemple : c:\dossier\file.extQuelle fonction permet d'obliger a renseigner un champ
Fonction SYSTEM(char *s) en CPasser un tableau 2dim dans une fonction en Vbscript
[PHP] Probleme sur fonctionquel fonction PHP pour voir s'il existe une base MySql sur mon serveur
[PHP}Comment appelé une fonction ?fonction swap en delphi
Plus de sujets relatifs à : [PERL] Objet et fonction "private"


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