एक्स्टेंसिबिलिटी प्रदान करने के कुछ तरीके हैं; उपयोगकर्ता को आपकी कक्षा में भूमिकाएं लागू करने की अनुमति दें, या उन्हें उन छोटी वस्तुओं में पारित करने दें जो दिलचस्प चीजें (प्रतिनिधि) करते हैं। प्रतिनिधि भूमिकाओं से बेहतर प्रदर्शन करते हैं, लेकिन आपको आवश्यकता होगी कि आप सभी विस्तारशीलता के लिए आगे बढ़ें। भूमिकाएं अधिक विज्ञापन-व्यवहार की अनुमति देती हैं।
प्रतिनिधि: 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;
}
तो फिर तुम इस तरह का उपयोग करें:: पैटर्न एक वर्ग एक उस वर्ग सेल्सियस के लिए कुछ भूमिका आर, और फिर यहाँ ए क्लास सी प्रतिनिधियों करता है का एक उदाहरण से गुजर रहा है एक उदाहरण है
my $sorter = Sort->new(comparer => SpaceshipCompare->new);
my @sorted = $sorter->my_sort("1one", "0", "43");
यदि आप सॉर्ट काम बदलने के तरीके को चाहते हैं, तो आप केवल एक नई कक्षा बनाएं जो Compare
भूमिका निभाती है, और फिर सॉर्ट के कन्स्ट्रक्टर के लिए एक उदाहरण पास करें। तत्काल लचीलापन!
क्या आपने [मॉड्यूल :: प्लग करने योग्य] (http://search.cpan.org/~simonw/Module-Pluggable-3.9/lib/Module/Pluggable.pm) देखा है? –
@ लेन मैंने एक बार बिंदु पर विभिन्न मॉड्यूल के माध्यम से देखा, लेकिन मैं समुदायों के अनुभव से सीखना चाहता हूं। मुझे लगता है कि मुझे कम से कम 3 अलग-अलग मिलते हैं और अन्य तरीकों के बारे में भी पढ़ते हैं। मुझे नहीं पता कि इतने सारे तरीके क्यों मौजूद हैं, और अंतर क्या है। TIMTOWTDI, लेकिन आम तौर पर एक से अधिक तरीकों से मौजूदा कारण है। – xenoterracide