2011-05-30 18 views
6

में प्लगइन ढांचे के लिए एपीआई मैं आवेदन के लिए लुआ स्क्रिप्ट के साथ एक प्लगइन सिस्टम लागू कर रहा हूं। असल में यह उपयोगकर्ताओं को लुआ में एक या एक से अधिक कार्यों को परिभाषित करके कार्यक्षमता का विस्तार करने की अनुमति देगा। प्लगइन फ़ंक्शन को एप्लिकेशन ईवेंट के जवाब में बुलाया जाएगा।लुआ

क्या लुआ में कुछ अच्छे ओपन सोर्स प्लगइन ढांचे हैं जो मॉडल के रूप में काम कर सकते हैं?

विशेष रूप से मुझे आश्चर्य है कि प्लगइन में पैरामीटर पारित करने और लौटाए गए मान प्राप्त करने का सबसे अच्छा तरीका क्या है, जो प्लगइन लेखकों के लिए लचीला और उपयोग करने में आसान दोनों है।

बस स्पष्ट करने के लिए, मुझे होस्टिंग एप्लिकेशन के दृष्टिकोण से नहीं, लुआ में स्क्रिप्ट प्रोग्रामिंग के दृष्टिकोण से एपीआई के डिजाइन में रूचि है।

लुआ में प्लगइन सिस्टम के डिजाइन से संबंधित किसी भी अन्य सलाह या सर्वोत्तम प्रथाओं की सराहना की जाएगी।

उत्तर

4

लुआ के प्रथम श्रेणी के कार्य इस तरह की चीज को इतना आसान बनाते हैं कि मुझे लगता है कि आपको ढांचे के रास्ते में ज्यादा नहीं मिलेगा। याद रखें कि लुआ का मंत्र न्यूनतम तंत्र प्रदान करना है और व्यक्तिगत प्रोग्रामर खुद के लिए नीति तैयार करते हैं।

आपका प्रश्न यहाँ बहुत ही सामान्य है, लेकिन क्या मैं अपने एपीआई के लिए सलाह देते हैं है:

  • एक एकल प्लगइन एक भी लुआ तालिका द्वारा प्रतिनिधित्व किया जाना चाहिए (बस के रूप में एक लुआ मॉड्यूल एक एकल तालिका का प्रतिनिधित्व करती है) ।

  • तालिका के फ़ील्ड में तालिका के संचालन या कॉलबैक होना चाहिए।

  • साझा राज्य तालिका में संग्रहीत नहीं होना चाहिए; यह कोड है कि तालिका बनाता है, जैसे की स्थानीय चर में संग्रहित किया जाना चाहिए,

    local initialized = false 
    
    return { 
        init = function(self, t) ... ; initialized = true end, 
        something_else = function (self, t) 
             if not initialized then error(...) end 
             ... 
            end, 
        ... 
    } 
    
  • आप यह भी देखेंगे मेरा सुझाव है कि सभी प्लगइन संचालन एक ही इंटरफ़ेस का उपयोग करें:

    1. पहला तर्क प्लगइन के लिए टेबल खुद ही
    2. एकमात्र अन्य तर्क एक तालिका है जिसमें ऑपरेशन द्वारा आवश्यक सभी अन्य जानकारी शामिल है।
    3. अंत में, प्रत्येक ऑपरेशन को परिणाम तालिका वापस करनी चाहिए।

    स्थितित्मक परिणामों की बजाय एक तालिका को पास करने और वापस करने का कारण यह है कि यह इंटरफ़ेस विकसित होने के रूप में कोड को संगत रखने में आपकी सहायता करेगा।

सारांश में, उपयोग टेबल और प्रथम श्रेणी कार्यों आक्रामक तरीके से, और अपने प्लगइन के निजी राज्य की रक्षा करना।

+1

स्क्रिप्टर्स के लिए एक आसान इंटरफ़ेस आसान हो सकता है। उदाहरण के लिए, केवल 'एंटर', 'निकास', और 'चलने' कार्यों को प्रदान करने के लिए स्क्रिप्टर्स की आवश्यकता होती है। प्रदान किए गए कार्यों के लिए डिफ़ॉल्ट का उपयोग करें। उन्हें चलाने से पहले प्रत्येक स्क्रिप्ट को लोड करने के बाद उचित वातावरण सेट करें। – lhf

+0

धन्यवाद नॉर्मन। यह एक बहुत ही सामान्य सवाल था, लेकिन आपका जवाब वह है जो मैं ढूंढ रहा था। – alexrs

+0

@lhf मुझे यह भी लगता है कि उपयोगकर्ताओं के लिए एक आसान इंटरफ़ेस आसान होगा। मैं तर्कों को टेबल के रूप में पास करने के बारे में सलाह लेता हूं, लेकिन उपयोगकर्ताओं को बस कुछ फ़ंक्शंस परिभाषित करता है और डिफ़ॉल्ट नो-ऑप सेट करता हूं। वैसे, लुआ, उत्कृष्ट काम के लिए धन्यवाद। :) – alexrs

2

प्लगइन फ़ंक्शन को एप्लिकेशन ईवेंट के जवाब में बुलाया जाएगा।

जो पर्यवेक्षक पैटर्न का सुझाव देता है।उदाहरण के लिए, यदि आपके ऐप दो घटनाओं, 'foo' और 'बार' है, तो आप की तरह कुछ लिख सकते हैं:

HostApp.listeners = { 
    foo = {}, 
    bar = {}, 
} 
function HostApp:addListener(event, listener) 
    table.insert(self.listeners[event], listener) 
end 
function HostApp:notifyListeners(event, ...) 
    for _,listener in pairs(self.listeners[event]) do 
     listener(...) 
    end 
end 

फिर जब foo घटना होता है:

self:notifyListeners('foo', 'apple', 'donut') 

एक ग्राहक (जैसे एक प्लगइन) foo घटना में रुचि सिर्फ इसके लिए एक श्रोता रजिस्टर होगा:

HostApp:addListener('foo', function(...) 
    print('foo happened!', ...) 
end) 

आपकी आवश्यकताओं के अनुरूप बढ़ाएँ।

विशेष रूप से मुझे आश्चर्य है कि सबसे अच्छा तरीका है प्लगइन करने के लिए पैरामीटर भेजने और वापस आ मूल्यों

प्लगइन केवल आपके फोन करने के लिए एक समारोह supples प्राप्त करने के लिए क्या है। आप जो भी पैरामीटर चाहते हैं उसे पास कर सकते हैं, और अपनी इच्छानुसार मूल्यों को संसाधित कर सकते हैं।