2009-07-17 40 views
16

Sự khác nhau giữa gói, mô-đun và lớp trong Perl hướng đối tượng là gì?Sự khác biệt giữa gói, mô-đun và lớp trong Perl hướng đối tượng là gì?

+2

Trước khi bạn hỏi những loại câu hỏi này, hãy thử đọc tài liệu Perl trước. Nếu bạn không hiểu những gì bạn đang đọc, hãy đặt câu hỏi về điều đó. –

+1

Điều gì khiến bạn chắc chắn rằng anh ấy không có RTFM? – spoulson

+4

@spoulson: xem lịch sử câu hỏi của anh ấy. Đây không phải là một lần duy nhất. –

Trả lời

24

Mô-đun là một tệp duy nhất, một tệp .pm cung cấp mã. Đó có thể là không có gói, một gói duy nhất, hoặc nhiều hơn một gói. Một module không thực sự quan tâm những gì có trong nó, vì vậy nó có thể là mã chèn chính nó vào cùng một không gian tên, một tập hợp con truyền thống hơn trong thư viện, hoặc định nghĩa ý tưởng của lớp Perl.

Gói, còn được gọi là không gian tên, chứa các biến và trình con riêng của nó. Đó là một cách để tách biệt các phần khác nhau của chương trình của bạn. Bạn có thể tạo các gói và đưa code của bạn vào nó:

package SomePackage; 

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

Bạn nạp module để có được quyền truy cập vào các gói:

use SomePackage; # read and compile the module file 

SomePackage::some_subroutine(...); 

Một Perl lớp là một gói và hành vi liên quan của nó. Các phương pháp trong một lớp học là chương trình con chỉ bình thường, mặc dù khi chúng tôi xử lý các thủ tục con như các phương pháp, các tham số đầu tiên là điều (tên gói hoặc đối tượng, còn được gọi là referent) mà được gọi là phương pháp:

package SomeClass; 

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

Kể từ lớp chỉ là một gói phần mềm giống như bất kỳ gói khác, và có lẽ sống trong một mô-đun, bạn truy cập vào nó theo cùng một cách với use:

use SomeClass; 

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

các OO mũi tên cú pháp không một số công cụ đặc biệt để cho các some_method chương trình con biết rằng nó được gọi là phương thức. Perl đặt tham chiếu (trường hợp này là SomeClass) làm đối số đầu tiên. Ngoài ra, khi sử dụng cú pháp OO, Perl biết sử dụng các tính năng thừa kế của nó.

phương pháp gọi với '->' được referent như tham số đầu tiên phương pháp này, vì vậy cuộc gọi này:

SomeClass->new('world'); 

là cú pháp nếu bạn đã gọi nó với tên lớp là tham số đầu tiên:

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

Điều đó cũng tương tự đối với các đối tượng. Khi một đối tượng là ám chỉ:

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

đối tượng là các tham số đầu tiên là phương pháp:

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

Đó là một cách khá vòng xoay nói rằng Perl <6 không có lớp học ;-) – innaM

+0

Mặc dù, điều đó nói rằng, tôi kinda * thích * hành vi đó. Về cơ bản, PHP đã bị chặn ngắn để có được cách suy nghĩ đó, ý tôi là, nó không có, (và sẽ không bao giờ có, (* đặt ngón tay vào tai *)) hỗ trợ không gian tên làm việc. –

+5

Các gói không phải là phạm vi. Chúng được lexically scoped, nhưng không xác định phạm vi. –

12

Perl không có các lớp học. Nó có các không gian tên mà bạn thay đổi với package. Để biết chi tiết đầy đủ về Perl OOP, xem Trung gian Perl hoặc Hướng đối tượng Perl. Bạn cũng có thể xem tài liệu perltootperlboot. Trong ngắn hạn, Perl giả mạo những gì mọi người mong đợi "thực sự" lớp học được với các gói, bình thường chương trình con, và tài liệu tham khảo.

Mô-đun là một đoạn mã phân phối có trong tệp. Xem perlmod.


Tôi nói thêm về điều này trong bài đăng của tôi cho The Effective Perler, Find a module's release managers. Tôi không nhận được vào các công cụ OO, nhưng tôi nói về các điều khoản khác xung quanh "mô-đun".

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