2009-07-17 6 views
16

Quelle est la différence entre package, module et classe dans Perl orienté objet?Quelle est la différence entre package, module et classe dans Perl orienté objet?

+2

Avant de poser ce genre de questions, commencez par lire la documentation Perl. Si vous ne comprenez pas ce que vous lisez, posez des questions à ce sujet. –

+1

Qu'est-ce qui vous rend si certain qu'il n'avait pas RTFM? – spoulson

+4

@spoulson: regarde son histoire de question. Ce n'est pas une seule fois. –

Répondre

24

Les modules sont un fichier unique, un fichier .pm qui fournit le code. Cela pourrait ne pas être des paquets, un seul paquet ou plus d'un paquet. Un module ne se soucie pas vraiment de ce qu'il contient, il peut donc s'agir d'un code qui s'insère dans le même espace de noms, d'un ensemble plus traditionnel de sous-routines dans une bibliothèque, ou de définir l'idée de classe de Perl. Un package, également appelé espace de noms, contient ses propres variables et sous-routines. C'est une façon de séparer les différentes parties de votre programme. Vous créez le paquet et mettez votre code dedans:

package SomePackage; 

sub some_subroutine { ... } # really SomePackage::some_subroutine 

Vous chargez le module pour obtenir l'accès au package:

use SomePackage; # read and compile the module file 

SomePackage::some_subroutine(...); 

Une classe Perl est un package et son comportement associé. Les méthodes dans une classe sont des sous-routines tout à fait normal, bien que lorsque nous traitons les sous-routines que les méthodes, le premier paramètre est la chose (un nom de paquet ou un objet, également connu sous le référent) qui a appelé la méthode:

package SomeClass; 

sub class_method { my($class, @args) = @_; ... } 
sub instance_method { my($self, @args) = @_; ... } 

Depuis la classe est juste un paquet comme tout autre paquet, et vit probablement dans un module, vous accédez à la même manière avec use:

use SomeClass; 

my $i = SomeClass->class_method(...); 

la syntaxe flèche OO ne des choses spéciales pour laisser le sous-programme some_method savoir qu'il est être appelé comme une méthode. Perl met le référent (le SomeClass dans ce cas) comme premier argument. En outre, lors de l'utilisation de la syntaxe OO, Perl sait utiliser ses fonctionnalités d'héritage.

Les méthodes appelées par « -> » obtenir le référent comme premier paramètre à la méthode, donc cet appel:

SomeClass->new('world'); 

est syntaxiquement si vous aviez appelé avec le nom de classe comme premier paramètre:

SomeClass::new('SomeClass' ,'world'); # no inheritance this way 

Cela fonctionne de la même manière pour les objets. Lorsqu'un objet est le référent:

my $i = SomeClass->new(); 
$i->bar('world'); 

l'objet est le premier paramètre comme la méthode:

SomeClass::bar($i, 'world'); 
+0

C'est une façon assez détournée de dire que Perl <6 n'a pas de classes ;-) – innaM

+0

Bien que, cela dit, j'ai un peu * aimé * ce comportement. Principalement obtenu par PHP pour avoir cette façon de penser bien, je veux dire, il n'a pas, (et n'aura jamais, (* met les doigts dans les oreilles *)) le soutien de l'espace de noms de travail. –

+5

Les packages ne sont pas des étendues. Ils sont étendus lexicalement, mais ne définissent pas de portée. –

12

Perl n'a pas cours. Il a des espaces de noms que vous modifiez avec package. Pour les détails complets de Perl OOP, voir Intermédiaire Perl ou Orienté objet Perl. Vous pouvez également voir la documentation perltoot et perlboot. En bref, Perl simule ce que les gens attendent des classes «réelles» avec des paquets, des sous-routines normales et des références.

Un module est un élément de code distribuable contenu dans un fichier. Voir perlmod.


dire de plus à ce sujet dans mon post pour The Effective Perler, Find a module's release managers. Je ne parle pas des choses OO, mais je parle des autres termes autour de "module".

Questions connexes