2011-01-27 14 views
5

मैं एक ऐप लिखना चाहता हूं जिसे पर्ल और Moose का उपयोग करके प्लगइन के माध्यम से बढ़ाया जा सकता है। मुझे पता है कि प्लगइन लिखने के लिए कुछ मूस मॉड्यूल हैं और मुझे पता है कि अन्य तरीके भी हैं।मूस एप्लिकेशन के लिए प्लगइन सिस्टम बनाने के लिए सबसे अच्छा विकल्प क्या है?

मेरे विकल्प क्या हैं? और मुझे उनके बारे में क्या पता होना चाहिए? प्लगइन सिस्टम को लागू करने से पहले मुझे किसी चीज के बारे में सोचना चाहिए?

+1

क्या आपने [मॉड्यूल :: प्लग करने योग्य] (http://search.cpan.org/~simonw/Module-Pluggable-3.9/lib/Module/Pluggable.pm) देखा है? –

+0

@ लेन मैंने एक बार बिंदु पर विभिन्न मॉड्यूल के माध्यम से देखा, लेकिन मैं समुदायों के अनुभव से सीखना चाहता हूं। मुझे लगता है कि मुझे कम से कम 3 अलग-अलग मिलते हैं और अन्य तरीकों के बारे में भी पढ़ते हैं। मुझे नहीं पता कि इतने सारे तरीके क्यों मौजूद हैं, और अंतर क्या है। TIMTOWTDI, लेकिन आम तौर पर एक से अधिक तरीकों से मौजूदा कारण है। – xenoterracide

उत्तर

5

एक्स्टेंसिबिलिटी प्रदान करने के कुछ तरीके हैं; उपयोगकर्ता को आपकी कक्षा में भूमिकाएं लागू करने की अनुमति दें, या उन्हें उन छोटी वस्तुओं में पारित करने दें जो दिलचस्प चीजें (प्रतिनिधि) करते हैं। प्रतिनिधि भूमिकाओं से बेहतर प्रदर्शन करते हैं, लेकिन आपको आवश्यकता होगी कि आप सभी विस्तारशीलता के लिए आगे बढ़ें। भूमिकाएं अधिक विज्ञापन-व्यवहार की अनुमति देती हैं।

प्रतिनिधि: 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 भूमिका निभाती है, और फिर सॉर्ट के कन्स्ट्रक्टर के लिए एक उदाहरण पास करें। तत्काल लचीलापन!

+0

मूसएक्स :: ऑब्जेक्ट :: प्लग करने योग्य और मॉड्यूल :: प्लग करने योग्य के बीच अंतर जानने का कोई मौका? – xenoterracide

+0

@xenoterracide MooseX :: ऑब्जेक्ट :: प्लगिंग एक नामस्थान के आधार पर वर्तमान कक्षा में भूमिका लागू करता है। मॉड्यूल :: प्लग करने योग्य नामस्थान/उदाहरणों की एक सूची प्रदान करता है। वे "नामस्थानों को देखो" भाग से लगभग पूरी तरह अलग हैं। भयानक उदाहरण – perigrin

+0

+1 प्रतिनिधिमंडल पैकेजों को शामिल या उपयोग करने के साथ कैसे काम करता है, क्या मुझे हर संभावित प्रतिनिधि को शामिल करना होगा? – qodeninja

संबंधित मुद्दे