2008-08-11 27 views

Odpowiedz

22

Powinieneś koniecznie spojrzeć na Moose.

package Point; 
use Moose; # automatically turns on strict and warnings 

has 'x' => (is => 'rw', isa => 'Int'); 
has 'y' => (is => 'rw', isa => 'Int'); 

sub clear { 
    my $self = shift; 
    $self->x(0); 
    $self->y(0); 
} 

Łoś daje (między innymi) konstruktor, metody dostępu i sprawdzanie typu za darmo!

Więc w kodzie można:

my $p = Point->new({x=>10 , y=>20}); # Free constructor 
$p->x(15);  # Free setter 
print $p->x(); # Free getter 
$p->clear(); 
$p->x(15.5); # FAILS! Free type check. 

Dobrym punktem wyjścia jest Moose::Manual i Moose::Cookbook

Jeśli wystarczy podstawowe rzeczy można również użyć Mouse który nie jest tak kompletny, ale bez większość czasu kompilacji.

+0

lub Mysz, jeśli potrzebujesz tylko prostych funkcji Moose –

+0

czy istnieje dobry tutorial dla całkowicie początkujących na Moose? dzięki – melaos

+0

@ Alexandr, dzięki zaktualizował odpowiedź. @melaos Redagowałem odpowiedź, aby podać linki – Pat

2

Oficjalny tutorial na temat CPAN site jest dobry.

Istnieje również dobry artykuł o nazwie Camel POOP w CodeProject.

+1

Należy pamiętać, że wszystkie samouczki perldoc są również dostępne w linii poleceń, jeśli masz normalną instalację Perla: perldoc perltoot dla tego. (Zobacz także perldoc perlboot, aby uzyskać więcej zabawy z obiektami w Perlu.) – Telemachus

4

Obecnie używam Object::InsideOut ilekroć chcę obiektów, jest całkiem niezły i daje wiele funkcji w stosunku do standardowych obiektów hash błogosławionych. Powiedziawszy to, gdybym rozpoczynał nowy projekt, poważnie spojrzałbym na Łosia.

Choć dobrze jest zapoznać się z oficjalnej dokumentacji Perl, bym NIE polecić próbuje roli własne ramy obiektu lub obiektów budowlanych za pomocą skrótów, jego daleko kuszące, aby wziąć łatwą drogę i „szczyt” bezpośrednio do zmienne "prywatne" obiektów całkowicie przerywające enkapsulację, to powróci, by ugryźć cię, gdy chcesz refaktoryzować obiekt.

4

Obiekty perla NIE są po prostu błogosławionymi haszami. Są błogosławieni REFERENCJE. Mogą być (i najczęściej są) pobłogosławionymi hasłami, ale równie dobrze mogą być pobłogosławione jako odniesienia skalarne lub tablicowe.

7

Moose, zdecydowanie.

package Person; 
use Moose; 
has age => (isa => Int, is => 'rw'); 
has name => (isa => Str, is => 'rw'); 
1; 

Natychmiast masz za darmo nową metodę() i metody akcesorów dla atrybutów, które właśnie zdefiniowałeś z "has". Możesz więc powiedzieć:

my $person = Person->new(); 
$person->age(34); 
$person->name('Mike'); 
print $person->name, "\n"; 

i tak dalej. Co więcej, twoje metody dostępu są sprawdzane za darmo (możesz zdefiniować własne typy, a także standardowe). Plus dostajesz "rozszerzenia" dla podklasy, "z" dla ról/cech i wszelkiego rodzaju innych świetnych rzeczy, które pozwalają ci zająć się prawdziwą pracą pisania dobrego, niezawodnie konserwowalnego kodu OO.

TMTOWTI, ale ten działa.

1

Na jednej nodze każda klasa to paczka; ustalasz dziedziczenie (wiele, jeśli chcesz), ustawiając zmienną pakietu @ISA (najlepiej w czasie kompilacji); tworzysz obiekt z istniejącego fragmentu danych (często, ale nie zawsze, anonimowy skrót używany do przechowywania zmiennych instancji) z bless (REFERENCE [, CLASSNAME]); możesz wywołać metody obiektowe, takie jak $ obj-> nazwa_metody (@ARGS) i metody klasy, takie jak "CLASSNAME" -> nazwa metody (@ARGS). Kolejność sortowania wielu metod dziedziczenia można zmienić przy użyciu mro.

Ponieważ jest to nieco minimalistyczne i nie wymusza enkapsulacji, istnieje wiele różnych modułów, które zapewniają więcej lub inną funkcjonalność.

2

Bardzo polecam rzucić okiem na Łosia, jeśli chcesz zrobić OO w Perlu. Jednak nie jest to zbyt przydatne, jeśli nie rozumiesz, co oznacza OO w Perlu. Aby lepiej zrozumieć, jak działa Perl OO pod maską, napisałem na moim blogu przegląd: http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object-oriented-perl/

Z punktu widzenia struktury danych obiekt jest odniesieniem z kilkoma dodatkowymi funkcjami. Interpreter wie, że traktuje te specjalne odniesienia jako Obiekty, ponieważ zostały "pobłogosławione" słowem kluczowym "błogosławić". Błogosławione odniesienia zawierają flagę wskazującą, że są Obiektem. Zasadniczo oznacza to, że możesz na nich definiować i wywoływać metody.

Na przykład, jeśli utworzyłeś podstawowy element hashref, to nie zadziała: $ hashref-> foo();

Ale jeśli utworzysz błogosławiony haszysz (aka Object), działa to: $ blessed_hashref-> foo();

Łoś jest doskonałym modułem dla OOP w Perlu, ponieważ tworzy egzekwowalną warstwę OO I automagicznie obsługuje metody accessor, więc nie musisz definiować grupy pobierających i ustawiających. Jeśli jesteś zainteresowany użyciem Devel :: Peak, aby zobaczyć, jak interpreter Perl przechowuje obiekty, kliknij link do wpisu blogu, który napisałem powyżej.