Perl과 Moose을 사용하여 플러그인을 통해 확장 할 수있는 앱을 작성하고 싶습니다. 나는 플러그인을 작성하기위한 몇 가지 무스 모듈이 있으며 다른 방법이 있다는 것을 알고있다.무스 응용 프로그램 용 플러그인 시스템을 구축하는 가장 좋은 방법은 무엇입니까?
내 옵션에는 어떤 것이 있습니까? 내가 그들에 대해 무엇을 알아야합니까? 플러그인 시스템을 구현하기 전에 내가 생각해야 할 것은 무엇입니까?
Perl과 Moose을 사용하여 플러그인을 통해 확장 할 수있는 앱을 작성하고 싶습니다. 나는 플러그인을 작성하기위한 몇 가지 무스 모듈이 있으며 다른 방법이 있다는 것을 알고있다.무스 응용 프로그램 용 플러그인 시스템을 구축하는 가장 좋은 방법은 무엇입니까?
내 옵션에는 어떤 것이 있습니까? 내가 그들에 대해 무엇을 알아야합니까? 플러그인 시스템을 구현하기 전에 내가 생각해야 할 것은 무엇입니까?
확장 성을 제공하는 몇 가지 방법이 있습니다. 사용자가 클래스에 역할을 적용하거나 흥미있는 것을 수행하는 작은 객체 (델리게이트)를 전달하도록 허용합니다. 대리인은 역할보다 뛰어나지 만 모든 확장 성을 미리 계획해야합니다. 역할을 사용하면 더 많은 ad-hoc 동작이 가능합니다.
대리자 : AnyEvent::Subprocess
역할 : Devel::REPL
플러그인 역할 MooseX::Object::Pluggable 구현되는 여기
각 접근을 두 CPAN 분포이다.
위임자는 원하는대로 구현됩니다.
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;
}
그런 다음이 같은를 사용합니다 : 패턴이 어떤 클래스 C에 역할 R, 여기서 A에 다음 클래스 C 위임을하는 클래스 A의 인스턴스를 통과하는 예입니다
my $sorter = Sort->new(comparer => SpaceshipCompare->new);
my @sorted = $sorter->my_sort("1one", "0", "43");
Sort가 변경되는 방식을 원할 경우 Compare
역할을하는 새 클래스를 만든 다음 인스턴스를 Sort의 생성자에 전달하면됩니다. 즉각적인 유연성!
당신은 MooseX :: Object :: Pluggable와 Module :: Pluggable 사이의 차이점을 아는 모든 기회가 있습니까? – xenoterracide
@xenoterracide MooseX :: Object :: Pluggable은 네임 스페이스를 기반으로 현재 클래스에 역할을 적용합니다. Module :: Pluggable은 네임 스페이스/인스턴스 목록을 제공합니다. 그것들은 "look up namespaces"부분을 넘어 거의 완전히 다릅니다. – perigrin
멋진 예제의 경우 +1 – qodeninja
[Module :: Pluggable] (http://search.cpan.org/~simonw/Module-Pluggable-3.9/lib/Module/Pluggable.pm)을 보셨습니까? –
@Len 한 번에 다른 모듈을 훑어 보았지만 지역 사회 경험을 통해 배우고 싶습니다. 나는 적어도 3 가지 다른 것들을 발견하고 다른 방법들에 대해서도 읽었다 고 생각합니다. 왜 그렇게 많은 방법이 존재하는지, 그 차이점은 무엇인지 모르겠습니다. TIMTOWTDI,하지만 일반적으로 한 가지 이상의 방법이 존재해야합니다. – xenoterracide