2009-06-24 4 views
14

J'écris des classes Perl pour supprimer les redondances des scripts et comme Perl a beaucoup de façons de créer des classes, j'ai toujours du mal à faire les classes correctement. Donc, quelqu'un a-t-il un exemple de meilleure pratique d'une classe?Comment créer une classe Perl?

La plus grande question que j'ai est de savoir s'il ne devrait pas y avoir de variables globales dans un module comment utilisez-vous les variables de sub() dans un module? Comme Java self-> foo = 10; Fondamentalement il suffit de me donner une classe écrite en Java ou en C# ou même en C++ et d'écrire la même chose en Perl. Également des points supplémentaires pour montrer comment faire correctement les variables privées, protégées et publiques. L'héritage et les interfaces seraient utiles, je suppose.

+1

Les fonctions OO de Perl manquent un peu au mieux ...: PI irait voir un simple module .pm et verrait comment elles sont implémentées –

Répondre

24

une manière typique de la création d'objets Perl est de 'bénir' un hashref. L'instance d'objet peut ensuite stocker des données par rapport à son propre ensemble de clés de hachage.

package SampleObject; 

use strict; 
use warnings; 

sub new { 
    my ($class, %args) = @_; 
    return bless { %args }, $class; 
} 

sub sample_method { 
    my ($self) = @_; 
    print $self->{sample_data}; 
} 

et utilisation:

my $obj = SampleObject->new(sample_data => 'hello world', 
          more_data => 'blah blah blah'); 
$obj->sample_method(); 

Alternativement, les méthodes accesseur/mutator peuvent être ajoutés (voir Class :: accesseur, Class :: accesseur :: Chained, etc pour mise en place aisée de ces) - ceux-ci facilitent la validation des données et ajoutent l'encapsulation (il n'est pas imposé en Perl, vous devez vous assurer que votre code ne contourne pas un accesseur/mutateur approprié et accède directement aux données dans le hashref béni).

+0

Semble le plus élégant des deux réponses. – kthakore

16

Extrayez le Moose, qui est une extension du système d'objets Perl 5.

Ce qui suit vous aidera à apprendre Moose:

+0

Je réalise que c'est une réponse populaire, mais ça ne m'a pas vraiment montré comment faire mes propres classes similaires aux autres langues OOP. – kthakore

+2

Cependant, le poste vous a indiqué. –

+2

Vous avez raison, à la place, il vous a donné des liens qui vous montrent comment faire cela. Pourquoi perdre des octets copier/coller depuis un autre endroit quand un lien est beaucoup mieux. – mpeters

23

Eh bien, le Perl est facile, mais je suis rouillé dans les autres langues, donc je vais mettre à jour avec eux dans un peu. Voici une classe Perl simple:

#!/usr/bin/perl 

package Person; 

use strict; 
use warnings; 
use Carp; 

sub new { 
    my $class = shift; 
    my $self = { @_ }; 
    croak "bad arguments" unless defined $self->{firstname} and defined $self->{lastname}; 
    return bless $self, $class; #this is what makes a reference into an object 
} 

sub name { 
    my $self = shift; 
    return "$self->{firstname} $self->{lastname}"; 
} 

#and here is some code that uses it 
package main; 

my $person = Person->new(firstname => "Chas.", lastname => "Owens"); 
print $person->name, "\n"; 

est ici la même classe écrite en utilisant les nouveaux objets de style Moose:

#!/usr/bin/perl 

package Person; 

use Moose; #does use strict; use warnings; for you 

has firstname => (is => 'rw', isa => 'Str', required => 1); 
has lastname => (is => 'rw', isa => 'Str', required => 1); 

sub name { 
    my $self = shift; 
    return $self->firstname . " " . $self->lastname; 
} 

#and here is some code that uses it 
package main; 

my $person = Person->new(firstname => "Chas.", lastname => "Owens"); 
print $person->name, "\n"; 

Et MooseX :: Declare supprime la nécessité d'un code encore plus et fait les choses sont nice:

#!/usr/bin/perl 

use MooseX::Declare; 

class Person { 
    has firstname => (is => 'rw', isa => 'Str', required => 1); 
    has lastname => (is => 'rw', isa => 'Str', required => 1); 

    method name { 
      return $self->firstname . " " . $self->lastname; 
    } 
} 

#and here is some code that uses it 
package main; 

my $person = Person->new(firstname => "Chas.", lastname => "Owens"); 
print $person->name, "\n"; 

Une note rapide, Ces deux classes sont les deux premières classes Moose que j'ai jamais écrites. Et voici quelques C code de très rouillé (ne vous coupe pas ou vous aurez besoin d'un vaccin contre le tétanos):

#include <stdio.h> 
#include <string.h> 

class Person { 
    char* firstname; 
    char* lastname; 

    public: 
    Person(char* first, char* last) { 
     firstname = first; 
     lastname = last; 
    } 

    char* name(void) { 
     int len = strlen(firstname) + strlen(lastname) + 1; 
     char* name = new char[len]; 
     name[0] = '\0'; 
     strcat(name, firstname); 
     strcat(name, " "); 
     strcat(name, lastname); 
     return name; 
    } 
}; 

int main(void) { 
    Person* p = new Person("Chas.", "Owens"); 
    char* name = p->name(); 
    printf("%s\n", name); 
    delete name; 
    delete p; 
    return 0; 
} 
+0

Exactement ce que je voulais. Vous gagnez 10 points Internet Monsieur. – kthakore

4

Outre Moose, que les gens ont déjà dit ...

Si vous êtes En parlant simplement de classes (donc, pas d'objets), vous créez généralement des données de classe avec des variables lexicales dans le fichier et utilisez une classe par fichier. Vous créez des méthodes d'accès pour les traiter. Il y a plusieurs façons de gérer cela.

Cependant, il semble que vous deviez commencer par quelque chose comme Intermediate Perl ou Object Oriented Perl de Damian Conway.Il y a trop à expliquer à quiconque pour prendre le temps de reproduire tout cela dans une réponse Stackoverflow.

+0

oooh de beaux livres. THX. – kthakore

Questions connexes