2011-08-23 12 views
7

जावास्क्रिप्ट यहाँ नौसिखिया, मैं काम पर कुछ js कोड के माध्यम से जा रहा था जब मैं वस्तु निर्माण के लिए एक सहायक समारोह है, जो इसजावास्क्रिप्ट ऑब्जेक्ट निर्माण

createElement = function(name, data){ 
    if(name == TYPES.TEXT){ 
    return new Text(data); 
    } 
    else if(name == TYPES.WORD){ 
    return new Word(data); 
    } 
    else if(name == TYPES.PARAGRAPH){ 
    return new Paragraph(data); 
    } 
    else if(name == TYPES.TABLE){ 
    return new Table(data); 
    } 
    <list goes on and on and on... > 
} 

की तरह है, जबकि यह किया काम हो जाता है मैं होता चला गया में आए यह जानना कि क्या यह लिखने का एक बेहतर, साफ तरीका है।

+0

आप [स्विच संरचना] में रुचि हो सकती (https://developer.mozilla.org/en/JavaScript/Reference/Statements/switch) ... – DaveRandom

उत्तर

9

आप सही हैं, अत्यधिक if..then या switch तर्क code smell है और लगभग हमेशा कुछ और सुरुचिपूर्ण में पुन: सक्रिय किया जा सकता है। इस मामले में, एक नाम पर आधारित एक कारखाने समारोह के रूप में है कि नाम के रूप में कुंजी और मान के साथ एक शब्दकोश में पुनर्संशोधित जा सकती है

var dictionary = {}; 
dictionary[TYPES.TEXT] = Text; 
dictionary[TYPES.WORD] = Word; 
dictionary[TYPES.PARAGRAPH] = Paragraph; 
dictionary[TYPES.TABLE] = Table; 

createElement = function(name, data){ 
    return new dictionary[name](data); 
} 

लाइव उदाहरण वापस जाने के लिए: में कि लाइन: http://jsfiddle.net/KkMnd/

संपादित करें createElement विधि पहले जांच कर सकती है कि TYPES.* के लिए कुछ कॉन्फ़िगर किया गया है। यह तरीका जांचना है कि उस विधि को कॉल करने का प्रयास करने से पहले शब्दकोश में कोई तत्व है।

return (typeof dictionary[name] == 'function') ? new dictionary[name](data) : some_default_value; 
+0

मैं उसका जवाब बेहतर पसंद है। – Prospero

+0

+1 और इस समाधान के बारे में अतिरिक्त अच्छी बात यह है कि यदि आपके 'टाइप' को विस्तारित करने की आवश्यकता है, तो आपको ऐसा करने के लिए किसी भी * तर्क * को बदलने की ज़रूरत नहीं है, जिसे आपको 'स्विच' के साथ करना होगा। सरलीकृत करने और इस पैटर्न के नाम का उल्लेख करने के लिए – peirix

+3

+1 (एक कारखाना पैटर्न)। मुझे क्या चिंता है कि ओपी ने अंतिम "_else_" कथन का उल्लेख नहीं किया है और आपको इसे यहां भी लागू करना चाहिए, उदाहरण के लिए। 'वापसी (टाइपो शब्दकोश [नाम]! = 'अपरिभाषित')? शब्दकोश [नाम] (डेटा): something_goes_here; '(अगर कुछ भी नहीं मिला तो अपेक्षित परिणाम के साथ 'something_goes_here' को प्रतिस्थापित करें)। – Tadeck

0

यह थोड़ा क्लीनर होगा लेकिन स्विच स्टेटमेंट का उपयोग करने के लिए सैद्धांतिक रूप से वही होगा।

function createElement(name,data){ 
switch(name) 
{ 
case TYPES.TEXT: 
    return new Text(data) 
    break; 
case TYPES.WORD: 
    return new WORD(data) 
    break; 
default: 
    // etc. code to be executed if no values match 
} 
} 
संबंधित मुद्दे