2009-07-17 4 views
16

Was ist der Unterschied zwischen Paket, Modul und Klasse in objektorientiertem Perl?Was ist der Unterschied zwischen Paket, Modul und Klasse in objektorientiertem Perl?

+2

Bevor Sie diese Art von Fragen stellen, lesen Sie zuerst die Perl-Dokumentation. Wenn Sie nicht verstehen, was Sie gerade lesen, stellen Sie Fragen dazu. –

+1

Was macht dich so sicher, dass er nicht RTFM hatte? – spoulson

+4

@spoulson: Schau dir seine Frage Geschichte an. Dies ist keine einmalige Sache. –

Antwort

24

Module sind eine einzelne Datei, eine .pm Datei, die Code bereitstellt. Das können keine Pakete, ein einzelnes Paket oder mehr als ein Paket sein. Ein Modul kümmert sich nicht wirklich darum, was darin enthalten ist. Es kann sich also um Code handeln, der sich selbst in denselben Namespace, eine traditionellere Unterroutine in einer Bibliothek einfügt, oder Perls Idee einer Klasse definiert.

Ein Paket, auch bekannt als Namespace, enthält seine eigenen Variablen und Subroutinen. Es ist eine Möglichkeit, verschiedene Teile Ihres Programms zu trennen. Sie das Paket erstellen und setzen Sie Ihren Code ein:

package SomePackage; 

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

Sie das Modul laden Zugriff auf das Paket zu erhalten:

use SomePackage; # read and compile the module file 

SomePackage::some_subroutine(...); 

Ein Perl-Klasse ist ein Paket und die dazugehörige Verhalten. Die Methoden in einer Klasse sind nur ganz normale Subroutinen, obwohl, wenn wir die Subroutinen als Methoden behandeln, der erste Parameter ist die Sache (ein Paketname oder das Objekt, das auch als referent bekannt), das Verfahren genannt:

package SomeClass; 

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

Seit die Klasse ist nur ein Paket wie jedes andere Paket, und wahrscheinlich lebt in einem Modul, greifen Sie es auf die gleiche Weise mit use:

use SomeClass; 

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

die OO Pfeil Syntax hat einige spezielle Sachen die some_method Unterroutine wissen zu lassen, dass es als eine Methode aufgerufen werden. Perl setzt den Referenten (das SomeClass in diesem Fall) als das erste Argument. Wenn Perl die OO-Syntax verwendet, kann Perl außerdem seine Vererbungsfunktionen verwenden.

Methoden aufgerufen, mit ‚->‘ erhalten die referent als ersten Parameter der Methode, so diesen Aufruf:

SomeClass->new('world'); 

ist syntaktisch das, wenn man es mit dem Klassennamen als ersten Parameter genannt hatte:

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

Das funktioniert für Objekte auch gleich. Wenn ein Objekt der referent ist:

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

das Objekt ist der erste Parameter als Methode:

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

Das ist eine ziemlich umständliche Art zu sagen, dass Perl <6 keine Klassen hat ;-) – innaM

+0

Obwohl, das sagte, ich mag * dieses Verhalten irgendwie *. Hauptsächlich von PHP kurzgeschlossen, um diese Art des Denkens zu bekommen, ich meine, es hat keine Namespace-Unterstützung (und wird es auch nie haben (* legt die Finger in die Ohren *)). –

+5

Pakete sind keine Bereiche. Sie sind lexikalisch begrenzt, definieren jedoch keinen Gültigkeitsbereich. –

12

Perl keine Klassen haben. Es hat Namespaces, die Sie mit package ändern. Die vollständigen Einzelheiten zu Perl OOP finden Sie unter Intermediate Perl oder Objektorientierte Perl. Sie können auch die Dokumentation perltoot und perlboot sehen. Kurz gesagt, Perl täuscht, was die Leute von "echten" Klassen erwarten, mit Paketen, normalen Subroutinen und Referenzen.

Ein Modul ist ein verteilbarer Code, der in einer Datei enthalten ist. Siehe perlmod.


sage ich mehr darüber in meinem Beitrag für The Effective Perler, Find a module's release managers. Ich komme nicht in das OO-Zeug, aber ich spreche über die anderen Begriffe rund um "Modul".

Verwandte Themen