2008-08-11 31 views

Trả lời

22

Bạn chắc chắn nên xem 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); 
} 

Moose cung cấp cho bạn (trong số những thứ khác) phương thức khởi tạo, phương thức truy cập và nhập kiểm tra miễn phí!

Vì vậy, trong mã của bạn, bạn có thể:

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. 

Một điểm khởi đầu tốt là Moose::ManualMoose::Cookbook

Nếu bạn chỉ cần những thứ cơ bản bạn cũng có thể sử dụng Mouse mà không phải là hoàn toàn, nhưng không có hầu hết các hình phạt thời gian biên dịch.

+0

hoặc Chuột nếu bạn cần những tính năng đơn giản của Moose –

+0

là có hướng dẫn tốt cho người mới hoàn toàn trên Moose không? cảm ơn – melaos

+0

@ Alexandr, cảm ơn đã cập nhật câu trả lời. @melaos Tôi đã chỉnh sửa câu trả lời để cung cấp các liên kết – Pat

2

Hướng dẫn chính thức trên CPAN site là tốt.

Ngoài ra còn có một bài viết hay gọi là Camel POOP tại CodeProject.

+1

Lưu ý rằng tất cả các hướng dẫn perldoc cũng có sẵn tại dòng lệnh, nếu bạn có cài đặt Perl bình thường: perldoc perltoot cho cái này. (Xem thêm perlocot perldboot để vui hơn với các vật thể trong Perl.) – Telemachus

4

Hiện tại tôi sử dụng Object::InsideOut bất cứ khi nào tôi muốn đối tượng, nó khá đẹp và sẽ cung cấp cho bạn nhiều tính năng hơn các đối tượng băm tiêu chuẩn may mắn. Có nói rằng, nếu tôi đang bắt đầu một dự án mới, tôi sẽ nghiêm túc nhìn vào Moose.

Khi đọc tài liệu PERL chính thức, tôi sẽ NOT khuyên bạn nên cố gắng đóng vai trò đối tượng của riêng bạn hoặc xây dựng các đối tượng bằng cách sử dụng băm. các đối tượng "private" biến hoàn toàn phá vỡ đóng gói, điều này sẽ trở lại để cắn bạn khi bạn muốn refactor đối tượng.

4

Các đối tượng Perl KHÔNG chỉ là băm may mắn. Họ là những tài liệu tham khảo may mắn. Chúng có thể là (và thường xuyên nhất) là các tham chiếu băm may mắn, nhưng chúng có thể dễ dàng được tham chiếu vô hướng hoặc tham chiếu mảng.

7

Moose, chắc chắn.

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

Ngay lập tức, bạn có phương thức mới() miễn phí và phương thức truy cập cho thuộc tính bạn vừa xác định bằng 'có'. Vì vậy, bạn có thể nói:

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

v.v. Không chỉ vậy, nhưng các phương thức truy cập của bạn được kiểm tra kiểu miễn phí (và bạn có thể định nghĩa các kiểu của riêng mình cũng như các kiểu chuẩn). Thêm vào đó bạn có được 'mở rộng' cho phân lớp, 'với' cho các vai trò/đặc điểm, và tất cả các công cụ tuyệt vời khác cho phép bạn tiếp tục với công việc thực sự của việc viết mã OO có thể bảo trì tốt.

TMTOWTDI, nhưng công cụ này hoạt động.

1

Trên một chân, mỗi lớp là một gói; bạn thiết lập thừa kế (nhiều, nếu muốn) bằng cách đặt biến gói @ISA (tốt nhất là ở thời gian biên dịch); bạn tạo một đối tượng từ một đoạn dữ liệu hiện có (thường, nhưng không phải luôn luôn, một băm vô danh được sử dụng để lưu trữ các biến mẫu) với bless (REFERENCE [, CLASSNAME]); bạn gọi các phương thức đối tượng như $ obj-> methodname (@ARGS) và các phương thức lớp như "CLASSNAME" -> methodname (@ARGS). Có thể thay đổi nhiều thứ tự độ phân giải phương thức thừa kế bằng cách sử dụng mro.

Bởi vì điều này hơi tối giản và không ép buộc đóng gói, có nhiều mô-đun khác nhau cung cấp nhiều chức năng hơn hoặc khác nhau.

2

Tôi khuyên bạn nên xem Moose nếu bạn muốn thực hiện OO trong Perl. Tuy nhiên, nó không phải là rất hữu ích nếu bạn không hiểu những gì OO trong Perl có nghĩa là. Để hiểu rõ hơn cách Perl OO hoạt động dưới mui xe, tôi đã viết tổng quan về blog của mình: http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object-oriented-perl/

Từ quan điểm cấu trúc dữ liệu, một đối tượng được tham chiếu với một vài tính năng bổ sung. Người thông dịch biết cách xử lý các tham chiếu đặc biệt này như là Đối tượng bởi vì chúng đã được "may mắn" với từ khóa "ban phước". Các tham chiếu may mắn chứa một lá cờ cho biết chúng là một đối tượng. Về cơ bản, điều này có nghĩa là bạn có thể định nghĩa và gọi các phương thức trên chúng.

Ví dụ: nếu bạn đã tạo một hashref cơ bản, điều này sẽ không hoạt động: $ hashref-> foo();

Nhưng nếu bạn tạo một hashref may mắn (hay còn gọi là đối tượng), điều này sẽ hoạt động: $ blessed_hashref-> foo(); Moose là một mô-đun tuyệt vời cho OOP trong Perl vì nó tạo ra một lớp OO có thể thi hành và tự động xử lý các phương thức truy cập để bạn không phải xác định một loạt các getters và setters. Nếu bạn quan tâm đến việc sử dụng Devel :: Peak để xem cách trình thông dịch Perl lưu trữ các đối tượng, hãy theo liên kết đến mục nhập blog mà tôi đã đăng ở trên.

Các vấn đề liên quan