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!
Bạn đã xem [Module :: Pluggable] (http://search.cpan.org/~simonw/Module-Pluggable-3.9/lib/Module/Pluggable.pm) chưa? –
@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