2011-01-27 40 views
5

Tôi muốn viết một ứng dụng có thể được mở rộng thông qua các plugin, sử dụng Perl và Moose. Tôi biết có một vài mô-đun Moose để viết các plugin và tôi biết có nhiều cách khác.Tùy chọn tốt nhất để xây dựng hệ thống plugin cho ứng dụng Moose là gì?

Tùy chọn của tôi là gì? và tôi nên biết gì về họ? bất cứ điều gì tôi nên suy nghĩ về trước khi thực hiện một hệ thống plugin?

+1

Bạn đã xem [Module :: Pluggable] (http://search.cpan.org/~simonw/Module-Pluggable-3.9/lib/Module/Pluggable.pm) chưa? –

+0

@Làm tôi liếc qua các mô-đun khác nhau cùng một lúc, nhưng tôi muốn học hỏi từ kinh nghiệm của cộng đồng. Tôi nghĩ tôi đã tìm thấy ít nhất 3 cái khác nhau và đọc về những cách khác nữa. Tôi không biết tại sao rất nhiều cách tồn tại, và sự khác biệt là gì. TIMTOWTDI, nhưng thường có một lý do cho nhiều hơn một cách tồn tại. – xenoterracide

Trả lời

5

Có một số cách để cung cấp khả năng mở rộng; cho phép người dùng áp dụng vai trò cho lớp học của bạn hoặc cho phép họ chuyển vào các đối tượng nhỏ làm những điều thú vị (đại biểu). Các đại biểu thực hiện tốt hơn vai trò, nhưng sẽ yêu cầu bạn lập kế hoạch cho tất cả khả năng mở rộng ở phía trước. Vai trò cho phép nhiều hành vi đặc biệt hơn.

Dưới đây là hai phân phối CPAN mà phải mất mỗi cách tiếp cận:

Các đại biểu: AnyEvent::Subprocess

Vai trò: Devel::REPL

vai trò Plugin được thực hiện với MooseX::Object::Pluggable.

Các đại biểu được thực hiện theo cách bạn muốn; mô hình được đi qua một thể hiện của một lớp A mà hiện một số vai trò R để lớp C, và sau đó lớp C đại biểu đến A. Dưới đây là một ví dụ:

package Compare; 
use Moose::Role; 
requires 'compare'; 


package SpaceshipCompare; 
use Moose; 
with 'Compare'; 

sub compare { my ($a, $b) = @_; return $a <=> $b } 

package Sort; 
use Moose; 

has 'comparer' => (
    is  => 'ro', 
    does  => 'Compare', 
    handles => 'Compare', 
    required => 1, 
); 

sub my_sort { 
    my ($self, @list) = @_; 
    return sort { $self->compare($a, $b) } @list; 
} 

Sau đó, bạn sử dụng như thế này:

my $sorter = Sort->new(comparer => SpaceshipCompare->new); 
my @sorted = $sorter->my_sort("1one", "0", "43"); 

Nếu bạn muốn cách sắp xếp hoạt động để thay đổi, bạn chỉ cần tạo một lớp mới có vai trò Compare, và sau đó chuyển một thể hiện cho hàm tạo của sắp xếp. Linh hoạt ngay lập tức!

+0

bất kỳ cơ hội nào bạn biết sự khác biệt giữa MooseX :: Object :: Pluggable and Module :: Pluggable? – xenoterracide

+0

@xenoterracide MooseX :: Object :: Pluggable áp dụng vai trò cho lớp hiện tại dựa trên không gian tên. Module :: Pluggable cung cấp một danh sách các không gian tên/thể hiện. Chúng gần như hoàn toàn khác với phần "tra cứu không gian tên". – perigrin

+0

+1 cho ví dụ tuyệt vời – qodeninja

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