2013-02-04 17 views
8

मैं सामान्य रूप से अपने कोड में डिजाइन पैटर्न custom objects के समान कुछ उपयोग करता हूं।जावास्क्रिप्ट कन्स्ट्रक्टर में साइड इफेक्ट्स खराब अभ्यास का उपयोग क्यों कर रहा है?

लेकिन JSLint तेवर दिखाता है पर निर्माणों इस तरह:

function MyClass() { this.init(); } 
new MyClass(data); 

क्योंकि ऑब्जेक्ट निर्माण के तुरंत बाद खारिज कर दिया जा रहा है - यह कुछ भी के लिए इस्तेमाल नहीं किया जा रहा है। हम इसे एक वैरिएबल को असाइन करके इसे अनदेखा करने के लिए जेएसलिंट को मूर्ख बना सकते हैं, लेकिन यह उस जेएसलिंट को बदलता नहीं है (और मैं कई जावास्क्रिप्ट उत्साही अनुमान लगा रहा हूं) पैटर्न को हतोत्साहित करता है।

तो एक खराब अभ्यास के रूप में देखा गया जावास्क्रिप्ट कन्स्ट्रक्टर में साइड इफेक्ट्स का उपयोग क्यों कर रहा है?

क्या इसके लायक है के लिए, मैंने सोचा था कि यह था एक अच्छा अभ्यास है क्योंकि:

  1. आप एक सेटअप कार्य हो, इस प्रकार यह उदाहरण के लिए यदि बनाए रखने के लिए आसान होना चाहिए आप बाद में एक्सेस के लिए MyClass उदाहरणों की एक सूची प्रबंधित कर रहे हैं। (किसी ऑब्जेक्ट पर किसी ऑब्जेक्ट को पुश करना एक साइड इफेक्ट है, कन्स्ट्रक्टर को "अच्छा अभ्यास" = बनाए रखने के लिए कठिन होने के बाद आपको इसे करना होगा।)
  2. इसका अपना प्रोटोटाइप है, इस प्रकार "वर्ग स्वामित्व": फायरबग इसे ऑब्जेक्ट के बजाय MyClass के उदाहरण के रूप में रिपोर्ट करता है। (यह, मेरी राय में, यह अन्य डिजाइन पैटर्न के लिए बेहतर बनाता है।)
+0

जेएसलिंट 'नया MyClass' को हतोत्साहित करता है क्योंकि आप इसे तुरंत चालू करने के बाद इसका उपयोग नहीं कर रहे हैं। इस प्रकार, इसका उपयोग केवल इसके दुष्प्रभावों के लिए किया जा रहा है। इसके बजाए, इस उदाहरण को 'प्रारंभिक (नया MyClass()) के रूप में निर्भरता इंजेक्शन का उपयोग करने के लिए फिर से लिखा जा सकता है;' (हालांकि यह उदाहरण मूर्खतापूर्ण होने के लिए इतना आसान है)। – zzzzBov

+0

क्या आप वास्तव में 'MyClass' के नए बनाए गए उदाहरणों को कभी भी असाइन नहीं कर रहे हैं (दूसरे शब्दों में, क्या यह' init() 'स्थिर विधि बनाने के लिए एक ठोस तरीका है)? इस पैटर्न का "सामान्य" उपयोग JSLint चेतावनियों को ट्रिगर नहीं करेगा। –

+0

@ FrédéricHamidi कभी नहीं, लेकिन कभी-कभी इसका साइड इफेक्ट्स होता है जो नौकरी स्वयं करता है, यानी ऐसा कुछ और करने की ज़रूरत नहीं है। एक व्यक्ति कन्स्ट्रक्टर किसी व्यक्ति ऑब्जेक्ट को तुरंत चालू कर सकता है, लेकिन आपको उस व्यक्ति पर अभी काम करने की आवश्यकता नहीं हो सकती है। यदि आपको आवश्यकता हो, तो साइड इफेक्ट्स बाद में एक्सेस के लिए सरणी में पंजीकृत हो जाएंगे। – user1994380

उत्तर

8

अपनी पुस्तक स्वच्छ कोड में, रॉबर्ट मार्टिन कहते हैं

दुष्प्रभाव झूठ हैं। आपका कार्य एक काम करने का वादा करता है, लेकिन यह अन्य छिपा चीजें भी करता है ... वे विचित्र और हानिकारक गलत हैं जो अक्सर अजीब अस्थायी युग्मन और आदेश निर्भरताओं में परिणाम देते हैं।

एरे के बारे में आपकी टिप्पणी में आपने जो वर्णन किया है वह "अजीब अस्थायी युग्मन" जैसा लगता है।

+1

सहायक उत्तर, खोज शब्द और संदर्भ सामग्री के लिए धन्यवाद। मैंने यह समान प्रश्न वाले किसी भी व्यक्ति से संबंधित पाया - [मार्क सेमैन का .NET ब्लॉग] (http: //blog.ploeh।डीके/2011/05/24/DesignSmellTemporalCoupling.aspx) (जावास्क्रिप्ट का उपयोग नहीं करता है)। कोई बेहतर जवाब लंबित नहीं है मैं इसे स्वीकार करूंगा। – user1994380

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