[PERL] Objet et fonction "private"

Objet et fonction "private" [PERL] - Perl - Programmation

Marsh Posté le 04-01-2004 à 06:08:56    

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
Reply

Marsh Posté le 04-01-2004 à 06:08:56   

Reply

Marsh Posté le 04-01-2004 à 15:30:37    

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.

Reply

Marsh Posté le 04-01-2004 à 16:32:29    

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

Reply

Marsh Posté le 04-01-2004 à 20:12:50    

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 '_'

Reply

Marsh Posté le 04-01-2004 à 20:18:33    

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

Reply

Marsh Posté le 04-01-2004 à 23:00:32    

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
 

Reply

Sujets relatifs:

Leave a Replay

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