2009-03-06 8 views
16

मैं वर्तमान में एक conundrum का सामना कर रहा हूँ: 2 जावास्क्रिप्ट वस्तुओं को एक साथ तार करने का सही तरीका क्या है?2 जावास्क्रिप्ट ऑब्जेक्ट्स को एकसाथ तार करने का सही तरीका क्या है?

कई अलग-अलग फ़ाइलों के साथ टेक्स्ट एडिटर जैसे एप्लिकेशन की कल्पना करें। मेरे पास कुछ HTML पृष्ठ है जो नोटबुक के दृश्य को दर्शाता है। मेरे पास एक फ़ाइल नोटबुक.जेएस है जिसमें नोटबुक नियंत्रक और नोटबुक व्यू के लिए क्लास परिभाषाएं हैं।

नोटबुक नियंत्रक ऑब्जेक्ट "नोटबुक सहेजें," "लोड नोटबुक," "नई नोटबुक" जैसी नोटबुक पर व्यवसाय तर्क करने के लिए ज़िम्मेदार है। नोटबुक व्यू HTML के प्रबंधन के लिए ज़िम्मेदार है जिसका प्रस्तुति के लिए उपयोग किया जाता है। यह निम्न स्तर की सामग्री करता है जैसे "नोटबुक निकालें/सेट करें" "नोटबुक नाम प्राप्त करें/सेट करें।" यह डीओएम कार्यक्रमों (ऑनक्लिक) के लिए भी सुनता है और व्यापार की घटनाओं को बचाता है (saveNotebook)। यह निष्क्रिय दृश्य पैटर्न पर मेरा प्रयास है।

मैं चाहता हूं कि मेरा जावास्क्रिप्ट क्लाइंट-साइड कोड ऑब्जेक्ट उन्मुख, अलग चिंताओं और यूनिट-टेस्टेबल हो। मैं नोटबुक कंट्रोलर को नकली नोटबुक व्यू और इसके विपरीत के साथ परीक्षण करना चाहता हूं। इसका मतलब है कि मैं नोटबुक नियंत्रक के अंदर नोटबुक व्यू को तुरंत चालू नहीं कर सकता। इसलिए मैं

  • मेरी notebook.js कि तारों 2 एक साथ
  • अपने आवेदन में एक वैश्विक समारोह प्रत्येक में से एक का दृष्टांत और उन्हें एक साथ तार
  • उपयोग निर्भरता इंजेक्शन के लिए जानता है कि क्या में कुछ तर्क रखो करते हैं, या तो घर से उगाया जाने वाला एक या SquirrelIoc

जावा में, पसंद एक प्राकृतिक है: वसंत का उपयोग करें। लेकिन यह बहुत जावास्क्रिप्ट-वाई प्रतीत नहीं होता है। क्या करने के लिए सही बात है?

+0

शायद मैं कुछ याद कर रहा हूँ, लेकिन तुम सिर्फ यकीन है कि आप के बजाय एकत्रीकरण रचना का उपयोग कर रहे बनाकर testability हासिल नहीं कर सकते? –

+0

यही विचार है। लेकिन सवाल यह है कि वस्तुओं के एकत्रीकरण को तारने का सही तरीका क्या है? –

उत्तर

0

मैं इस पर एक स्टैब लेने की कोशिश करूंगा, लेकिन यह कोई वास्तविक कोड देखे बिना थोड़ा मुश्किल होगा। व्यक्तिगत रूप से, मैंने कभी भी इस मामले के लिए जावास्क्रिप्ट या आईओसी के साथ (एम) वीसी पर ऐसा कोई विशिष्ट प्रयास नहीं देखा है।

सबसे पहले, आप किसके साथ परीक्षण करने जा रहे हैं? यदि आपके पास पहले से नहीं है, तो YUI Test video देखें, जिसमें जावास्क्रिप्ट के साथ यूनिट परीक्षण पर कुछ अच्छी जानकारी है।

दूसरे, जब आप कहते हैं कि "कि एकत्रीकरण ऊपर तार का सबसे अच्छा तरीका" मैं शायद सिर्फ यह एक सेटर के रूप में करना होगा डब्ल्यू/नियंत्रक

// Production 
var cont = new NotebookController(); 
cont.setView(new NotebookView()); 

// Testing the View 
var cont = new NotebookController(); 
cont.setView(new MockNotebookView()); 

// Testing the Controller 
var cont = new MockNotebookController(); 
cont.setView(new NotebookView()); 

// Testing both 
var cont = new MockNotebookController(); 
cont.setView(new MockNotebookView()); 

लेकिन यह आप कैसे है पर कुछ बड़े धारणा बनाता है अपने नियंत्रक को डिजाइन किया गया है और पहले से ही वस्तुओं को देख सकते हैं।

2

मैं कहूंगा, बस उन्हें एक साथ तार:

function wireTogether() { 
    var v = new View(); 
    var c = new Controller(); 
    c.setView(v); 
} 

लेकिन तब के पाठ्यक्रम एक और सवाल उठता है - कैसे आप wireTogether() फ़ंक्शन परीक्षण करते हैं?

var ok = false; 

View.prototype.isOurMock = true; 
Controller.prototype.setView = function(v) { 
    ok = v.isOurMock; 
} 

wireTogether(); 

alert(ok ? "Test passed" : "Test failed"); 
3

निर्भरता इंजेक्शन शायद आपका सर्वश्रेष्ठ दांव है:

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

3

अंतर्दृष्टि के लिए धन्यवाद।मैं एक साधारण जावास्क्रिप्ट निर्भरता इंजेक्शन उपयोगिता लिखने समाप्त हो गया। थोड़ी देर के लिए और अपनी टिप्पणी के लिए बहस के बाद, यह मेरे लिए हुआ है कि डि वास्तव में सही जवाब वजह से था:

  1. यह पूरी तरह से व्यापार तर्क से तारों की चिंताओं को अलग कर दिया है, जबकि तारों तर्क चीजों के करीब रखने के तार किया जा रहा ।
  2. यह मुझे सामान्य रूप से मेरी ऑब्जेक्ट्स पर "आप सभी वायर्ड अप" कॉलबैक प्रदान करने की इजाजत देता है ताकि मैं 3 चरण प्रारंभिक कर सकूं: सबकुछ तत्काल करें, इसे सब तार दें, सभी को कॉलबैक कॉल करें और उन्हें बताएं कि वे वायर्ड हैं ।
  3. निर्भरता लापता समस्याओं की जांच करना आसान था।

तो यहाँ डि उपयोगिता है:

var Dependency = function(_name, _instance, _dependencyMap) { 
    this.name = _name; 
    this.instance = _instance; 
    this.dependencyMap = _dependencyMap; 
} 

Dependency.prototype.toString = function() { 
    return this.name; 
} 

CONCORD.dependencyinjection = {}; 

CONCORD.dependencyinjection.Context = function() { 
    this.registry = {}; 
} 

CONCORD.dependencyinjection.Context.prototype = { 
    register : function(name, instance, dependencyMap) { 
     this.registry[name] = new Dependency(name, instance, dependencyMap); 
    }, 
    get : function(name) { 
     var dependency = this.registry[name]; 
     return dependency != null ? dependency.instance : null; 
    }, 

    init : function() { 
     YAHOO.log("Initializing Dependency Injection","info","CONCORD.dependencyinjection.Context"); 
     var registryKey; 
     var dependencyKey; 
     var dependency; 
     var afterDependenciesSet = []; 
     for (registryKey in this.registry) { 
      dependency = this.registry[registryKey]; 
      YAHOO.log("Initializing " + dependency.name,"debug","CONCORD.dependencyinjection.Context"); 

      for(dependencyKey in dependency.dependencyMap) { 
       var name = dependency.dependencyMap[dependencyKey]; 
       var instance = this.get(name); 
       if(instance == null) { 
        throw "Unsatisfied Dependency: "+dependency+"."+dependencyKey+" could not find instance for "+name; 
       } 
       dependency.instance[dependencyKey] = instance; 
      } 

      if(typeof dependency.instance['afterDependenciesSet'] != 'undefined') { 
       afterDependenciesSet.push(dependency); 
      } 
     } 

     var i; 
     for(i = 0; i < afterDependenciesSet.length; i++) { 
      afterDependenciesSet[i].instance.afterDependenciesSet(); 
     } 
    } 

} 
1

मैं जावास्क्रिप्ट के लिए नियंत्रण पुस्तकालय का एक उलट है, मैं इसके साथ बहुत खुश हूँ। https://github.com/fschwiet/jsfioc। यह घटनाओं का भी समर्थन करता है, इसलिए यदि आप एक स्टार्टअप ईवेंट चाहते हैं तो ठीक है। इसे और अधिक प्रलेखन इस्तेमाल कर सकते हैं ...

http://github.com/fschwiet/jsfioc

एक और (नए?) विकल्प है, जो बेहतर प्रलेखन और समर्थन हासिल है, है requireJS (http://requirejs.org/)।

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