क्या जेएस बुलियन के पास कस्टम गुण एक बुरा अभ्यास है?


41

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

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

इसके विरुद्ध 3 तर्क हैं जिनकी मैं कल्पना कर सकता हूं:

  1. यह थोड़ा असामान्य / अप्रत्याशित है जब किसी भी इंटरफ़ेस के लिए स्पष्ट होना बेहतर है और मुश्किल नहीं है।
  2. यह एक पुआल आदमी का तर्क हो सकता है, लेकिन इसके साथ एक किनारे का मामला होने के नाते मैं इसे कुछ जेएस अनुकूलक, क्रूसिफायर, वीएम या एक मामूली साफ भाषा विनिर्देश परिवर्तन आदि के बाद चुपचाप बैकफ़ायर की कल्पना कर सकता हूं।
  3. बेहतर है - संक्षिप्त, स्पष्ट और सामान्य - बिल्कुल वैसा ही करने का तरीका।

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


प्लॉट ट्विस्ट की चेतावनी।

ऊपर पूर्ण महिमा में मूल प्रश्न है। मैथ्यू Crumley और senevoldsen के रूप में दोनों ने कहा कि यह एक झूठे (झूठे?) आधार पर आधारित है। ठीक जेएस परंपरा में मॉडर्निज़्र क्या करता है एक भाषा चाल और एक गंदा है। यह जेएस के लिए उकसाता है जो एक आदिम बूल होता है जो अगर झूठ बोलता है तो प्रॉप्स (जो चुपचाप विफल रहता है) को जोड़ने की कोशिश के बाद भी गलत रहेगा और एक बूलियन ऑब्जेक्ट जिसमें कस्टम प्रॉप्स हो सकते हैं लेकिन ऑब्जेक्ट का हमेशा सत्य होना। मॉडर्निज़र या तो बूलियन झूठी या एक सच्ची बूलियन वस्तु देता है।

मेरा मूल प्रश्न यह माना जाता है कि चाल अलग तरह से काम करती है और इसलिए सबसे लोकप्रिय उत्तर मानक मानकों के साथ (पूरी तरह से मान्य) कोडिंग से निपटते हैं। हालाँकि मुझे लगता है कि उत्तर पूरी चाल में सबसे अधिक उपयोगी (और विधि का उपयोग करने के खिलाफ अंतिम तर्क) भी हैं, इसलिए मैं उनमें से एक को स्वीकार कर रहा हूं। सभी प्रतिभागियों को धन्यवाद!


35
बूलियन प्रकार का विस्तार करना एक शास्त्रीय wtf है

7
ध्यान दें कि जेएस में, वे nullसमर्थित न होने पर वापस लौट सकते हैं और यदि ऐसा है तो स्वरूपों की एक सरणी। जेएस में एक सूची को सत्य माना जाता है, और nullमिथ्या है।
jpmc26


3
इससे पहले कि आप इस प्रश्न का उत्तर दें: जावास्क्रिप्ट में "बूलियन" और "बूलियन" के बीच एक बड़ा अंतर है। वे एक ही बात नहीं कर रहे हैं और कोई भी जवाब जो बूलियन को भुनाने के लिए अमान्य नहीं है।
पीटर बी

2
आप में से जो लोग जंगल में इस तरह का कुछ देखने के लिए स्तब्ध हैं, मॉर्डनिज्र के रूप में लोकप्रिय एक पुस्तकालय में, उनके गीथहब से प्रासंगिक कोड है: github.com/Modernizr/Modernizr/blob/…
क्रिस नीलसन

जवाबों:


38

सामान्य डिजाइन सिद्धांतों के अलावा, एक जिम्मेदारी है, और कम से कम आश्चर्य की तरह है, वहाँ एक जावास्क्रिप्ट विशेष कारण यह है कि यह एक अच्छा विचार नहीं है: वहाँ एक बहुत बड़ा अंतर है booleanऔर Booleanजावास्क्रिप्ट में है कि यह सामान्य स्थिति में काम करने से रोकता है।

booleanएक आदिम प्रकार है, एक वस्तु नहीं है, और इसमें कस्टम गुण नहीं हो सकते। अभिव्यक्तियाँ true.toString()काम की तरह हैं क्योंकि पर्दे के पीछे, यह बदल जाता है (new Boolean(true)).toString()

Boolean(एक पूंजी बी के साथ) है एक वस्तु, लेकिन बहुत कम अच्छा उपयोग करता है, और के रूप में एक प्रयोग किया जा रहा booleanनिश्चित रूप से उनमें से एक नहीं है। इसका कारण यह है, कि प्रत्येक Boolean"सही" है, चाहे उसका मूल्य कुछ भी हो , क्योंकि सभी वस्तुएं trueएक बुलियन संदर्भ में परिवर्तित हो जाती हैं। उदाहरण के लिए, इसे आज़माएँ:

var answer = new Boolean(false);
if (answer) {
  console.log("That was unexpected.");
}

तो, सामान्य तौर पर, जावास्क्रिप्ट में एक बूलियन में गुणों को जोड़ने का कोई तरीका नहीं है जो अभी भी इसे तार्किक तरीके से व्यवहार करने देता है। मॉडर्निज़र इसके साथ दूर हो सकता है क्योंकि केवल "सच्चे" मूल्यों में गुण जोड़ते हैं, जो कि आप किस तरह की उम्मीद करेंगे (यानी अगर वे बयानों में काम करते हैं)। यदि वीडियो बिल्कुल समर्थित नहीं है, Modernizr.videoतो एक वास्तविक boolean(मान के साथ false) होगा, और इसमें गुण नहीं जोड़े जा सकते।


18
मुझे लगता है कि आधुनिकतावादी दृष्टिकोण बल्कि विषम है, यह देखते हुए कि गुणों वाली एक वस्तु पहले से ही trueएक सशर्त में मूल्यांकन करती है । स्पष्ट रूप से एक का उपयोग क्यों करें Boolean?
आर्टुरो टॉरेस सांचेज़

ध्वनि तकनीकी तर्क के लिए बहुत बहुत धन्यवाद। ऐसा लगता है कि मेरा त्वरित परीक्षण त्रुटिपूर्ण था: jsbin.com/hurebi/3/edit?js,console । यहां तक ​​कि कस्टम प्रॉप्स को जोड़ने के बाद भी falseयह दोनों 'गलत' और झूठे ( ===और ==काम के रूप में) लेकिन वास्तव में आप वास्तव में आदिम बूल में प्रॉप नहीं जोड़ सकते हैं। बूल और बूल के बीच के अंतर ने मुझे स्पष्ट रूप से भगाया।
कोनराड

@ ArturoTorresSánchez क्योंकि वे इसे जिस तरह से रिटर्न वैल्यू करते हैं, वे उसी प्रकार के नाममात्र हैं।
जेरेड स्मिथ

1
@ ArturoTorresSánchez यही कारण है कि मैंने क्वालीफायर "नाममात्र" जोड़ा: P
जेरेड स्मिथ

1
@konrad संदर्भ के लिए, डिफ़ॉल्ट रूप से जावास्क्रिप्ट यह दिखाएगा कि यह आपको ऐसा करने की कोशिश करने पर शिकायत न करके संपत्तियों को प्राथमिकताओं में जोड़ने देता है। सख्त मोड का उपयोग करने से वह ठीक हो जाएगा, और TypeErrorयदि आप कोई संपत्ति जोड़ने का प्रयास करते हैं तो उसे फेंक दें (देखें jsbin.com/yovasafibo/edit?js,console )।
मैथ्यू क्रुमले

59

बधाई हो, आपने वस्तुओं की खोज की है। ऐसा नहीं करने का कारण कम से कम विस्मय का सिद्धांत कहा जाता है । एक डिजाइन से हैरान होना अच्छी बात नहीं है।

इस जानकारी को एक साथ बंडल करने में कुछ भी गलत नहीं है लेकिन आप इसे बूल में क्यों छिपाना चाहेंगे? इसे किसी ऐसी चीज़ में रखें जिसकी आपको यह पूरी जानकारी हो। बूल शामिल थे।


1
LOL हाँ, मैंने अपने प्रश्न में एक स्पष्ट विकल्प के रूप में ऑब्जेक्ट का उल्लेख किया है। कम से कम विस्मय का सिद्धांत एक अच्छा बिंदु है भले ही जेएस के साथ कमजोर टाइपिंग ऑब्जेक्ट कम आश्चर्यजनक हैं लेकिन फिर भी भ्रमित हैं और आपको वैसे भी डॉक्स की जांच करने की आवश्यकता है। उपयोग के लिए जैसा कि मॉडर्निज़्र एक अच्छा उदाहरण है: आपके पास समान सत्य / गलत परिणाम के साथ परीक्षणों का एक बड़ा सूट है और केवल अब और फिर आपको अधिक जानकारी पारित करने की आवश्यकता है - शायद बाद में उन लोगों की आवश्यकता भी हुई जब आप ऐसा कर सकते हैं पूरी लाइब्रेरी में ब्रेकिंग परिवर्तन करें और बूलियन के चारों ओर ज्यादातर अनावश्यक आवरण बना सकते हैं या आप बूल बढ़ा सकते हैं। IMO इतना गूंगा नहीं।
कोनराड

1
उपयोग के बारे में थोड़ा और अधिक। यदि आप बूलियन मान वापस करने के लिए छड़ी करते हैं, तो आप किसी भी (), सभी (), फ़िल्टर () को आसानी से संचालन की सूची के लिए सभी फ़ंक्शन पास कर सकते हैं। यह जेएस की तुलना में थोड़ा अपरंपरागत होने की कीमत पर मजबूत टाइपिंग या औपचारिक इंटरफेस की कमी को रोकता है - जो अब तक इसके खिलाफ मुख्य तर्क है।
कोनराड

1
"अपरंपरागत" मेरे लिए एक मजबूत तर्क की तरह नहीं लगता है।
रॉबर्ट हार्वे

मैंने प्रश्न संपादित किया। यहाँ कम से कम विस्मय का सिद्धांत है। :-)
कोनराड

16

मुख्य तर्क मैं इसके खिलाफ रखता हूं, एकल जिम्मेदारी सिद्धांत , एक बूलियन को केवल यह कहना चाहिए कि कुछ है trueया falseनहीं, क्यों या कैसे या किसी अन्य चीज के लिए। यह मेरा दृढ़ विश्वास और अभ्यास है कि अन्य वस्तुओं का उपयोग उस या किसी अन्य जानकारी को संप्रेषित करने के लिए किया जाना चाहिए।


क्या आपका मतलब बूलियन या बूलियन (कैपिटल बी के साथ) जावास्क्रिप्ट में अंतर है।
पीटर बी

लेकिन अगर आपके पास इसे परिभाषित करने वाली कोई वस्तु है और कुछ अन्य चीजें यकीनन समान सिद्धांतों का उल्लंघन नहीं करती हैं?
केसी

1
@ कैसी नहीं, क्योंकि उस उद्देश्य का उद्देश्य मूल बूलियन से भिन्न होगा। और यह केवल एक ही जिम्मेदारी होगी, उदाहरण के रूप में लेनदेन की स्थिति और कारण को संवाद करने के लिए।
जे। पिचाडो

1
@ कैसी समस्या यह नहीं है कि इस जानकारी को खुद से जोड़ना एसआरपी का उल्लंघन है। यह केवल एक समस्या बन जाता है जब जिम्मेदारी के साथ जोड़ा जाता है कि पहले से ही एक बूलियन है - सही या गलत का प्रतिनिधित्व करने के लिए। जावास्क्रिप्ट के Booleanshenanigans के बावजूद।
जैकब रायले

10

चूंकि पूरे कारण को बूलियन मान कहा जाता है, यह सच है या गलत है, मुझे यह विचार पसंद नहीं है, क्योंकि आप विकिपीडिया से इसके पूरे उद्देश्य को बहुत कम आंकते हैं

कंप्यूटर विज्ञान में, बूलियन डेटा प्रकार एक डेटा प्रकार है, जिसमें दो मान होते हैं (आमतौर पर सत्य और असत्य निरूपित), जिसका उद्देश्य तर्क और बूलियन बीजगणित के सत्य मूल्यों का प्रतिनिधित्व करना है

(मेरी तह)


1
सही है, लेकिन आवश्यकता अन्यथा तय हो सकती है
svarog

8
@ केवल आवश्यकता मैं देख सकता हूँ कोड के अकुशल डिजाइनर है। यदि आपको बूल और कुछ और वापस करने की आवश्यकता है , तो इसे एक वर्ग, या टपल, या सूची, या कुछ और बनाएं जो विशेष कोड में फिट बैठता है।
15

यदि आप हाँ लौट रहे हैं, तो
Svarog

मुझे लगता है कि सवाल बूलियन ऑब्जेक्ट के बारे में है न कि बूलियन आदिम। ऑब्जेक्ट कोई मान नहीं है।
पीटर बी

1
यदि यह सही या गलत के अलावा कोई मूल्य ले सकता है, तो यह एक बूलियन भी नहीं है। जिसे, नाम दिया गया, मूर्खतापूर्ण है।
बेकार

2

सिर्फ इसलिए कि आप का मतलब यह नहीं हो सकता है, जेएस में आप किसी भी वस्तु के लिए बहुत अधिक गुण संलग्न कर सकते हैं (बुलियन शामिल हैं)

यह कैसी बुरी बात है?

एक तरफ, आप एक बूलियन (आपके उदाहरण के अनुसार) के लिए अधिक अप्रासंगिक डेटा संलग्न कर सकते हैं, कुछ ऐसा जो किसी अन्य डेवलपर को उम्मीद नहीं होगी क्योंकि यह क्यों होना चाहिए ?! बूल सिर्फ सच और झूठ के लिए होते हैं।

इसके लिए एक काउंटर पॉइंट कुछ प्रासंगिक उपयोगी गुण संलग्न करना है जो बूलियन मूल्य ( जावा ऐसा करता है ) से निपटने में आपकी मदद कर सकता है ।

उदाहरण के लिए, आप एक फ़ंक्शन संलग्न कर सकते हैं जो बूलियन मान को एक स्ट्रिंग में dirtyबदल देता है , एक ध्वज जो सच में बदल गया अगर मूल्य बदल गया है, तो वॉचर्स और ईवेंट कॉलबैक जो कि मूल्य बदल जाने पर फायर कर सकते हैं आदि।

लेकिन बूलियन को लौटाया गया (बूल जेएस में प्रथम श्रेणी की वस्तु है) में यह निर्दिष्ट करने के गुण हैं कि कौन से प्रारूप समर्थित हैं

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

{
    isSomethingSupported: true,
    isSomethingElseSupported: false,
    ....
}

1
क्या आपका मतलब बूलियन या बुलियन (पूंजी बी के साथ) है?
पीटर बी

1

आप जावास्क्रिप्ट में कस्टम गुणों के साथ बूलियन नहीं बना सकते। निम्न विफलता (कम से कम FF में):

    var x = false;
    x.foo = "bar";
    console.log(x.foo);

आप बूलियन से उपयोग या विरासत में ले सकते हैं, लेकिन जैसा कि मैथ्यू क्रुमले कहते हैं कि यह अलग परिणाम देता है। Booleanकी है प्रकार Object । जब JS को अभिव्यक्ति के बूलियन मूल्य की आवश्यकता होती है, तो यह विनिर्देशन फ़ंक्शन का उपयोग करके परिवर्तित होता है ToBoolean, जो यह बताता है कि Objectपरिणाम के लिए हमेशा होता है true। इस प्रकार मूल्य का new Boolean(false)मूल्यांकन करता है true! आप इसे इस उदाहरण में सत्यापित कर सकते हैं: https://jsfiddle.net/md7abx5z/3/

यह एकमात्र कारण है कि यह मॉडर्निज़्र के लिए काम करता है आकस्मिक है। वे केवल एक Booleanवस्तु बनाते हैं जब स्थिति सही होती है। जब वे असत्य का मूल्यांकन करते हैं तो वे साधारण ही लौटते हैं false। इसलिए यह काम करता है क्योंकि वे केवल Boolean वस्तुओं को वापस करते हैं जब परिणाम वैसे भी सच था, और कभी नहीं जब यह गलत है।


1

मैं समझता हूं कि संदर्भ बदल गया है, लेकिन मैं उस मूल प्रश्न का उत्तर देना चाहूंगा जिसे मैंने जेएस के उदाहरण के रूप में पढ़ा था, लेकिन सिर्फ जेएस तक सीमित नहीं था।

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


0

अगर मैं कोड को देखता हूं तो यह वास्तव में बूलियन कस्टम गुण देने के बारे में नहीं है, बल्कि एक विधि के बारे में है जिसमें विभिन्न हस्ताक्षर हैं।

यदि यह गलत है तो आपको एक आदिम झूठी मिलती है और अगर यह सच है तो यह एक ऐसी वस्तु देता है जिसकी परिभाषा जावास्क्रिप्ट में सही है।

इसलिए, मेरी राय में आपका सवाल यह नहीं होना चाहिए कि क्या बूलियन कस्टम गुण देना एक अच्छा विचार है, लेकिन क्या यह एक अच्छा विचार है कि कई रिटर्न हस्ताक्षर वाले तरीके हैं।


0

दिए गए उदाहरण में, क्या आप सभी समर्थित वीडियो प्रारूपों की एक सरणी नहीं लौटा सकते ?

  • खाली सरणी का अर्थ है " समर्थित कोई वीडियो प्रारूप ", जिसका अर्थ है "कोई वीडियो समर्थित नहीं"।
  • अन्यथा, यदि कोई वीडियो प्रारूप समर्थित है, तो स्पष्ट रूप से सामान्य रूप से वीडियो का समर्थन किया जाता है।

मैं कम से कम यह कहना चाहूंगा कि "कस्टम बूलियन" होने की तुलना में सरणी का उपयोग करना कुछ कम आश्चर्यजनक है।

जावास्क्रिप्ट में, एक खाली सरणी को भी गलत माना जाता है , जबकि एक गैर-खाली सरणी सत्य है , इसलिए कुछ भाग्य के साथ आप केवल सरणियों पर स्विच कर सकते हैं और सब कुछ काम कर रहा होगा जैसा कि नोप को संपादित करने से पहले , मुझे सोचने के लिए मूर्खतापूर्ण है कि मैं सच्चाई को याद रख सकता हूं जावास्क्रिप्ट में वस्तुओं की: पी


एक खाली सरणी एक अगर बयान में गलत के रूप में मूल्यांकन नहीं करता है। if ([]) कंसोल.लॉग ('असत्य नहीं'); उदाहरण के लिए Chrome में 'गलत नहीं' प्रिंट करता है। टाइपोफ़ [] === 'ऑब्जेक्ट' तो कोई खाली सरणी गलत नहीं है। संदर्भ के लिए developer.mozilla.org/en-US/docs/Glossary/Truthy देखें ।
18

@ जोश ऊप्स, यू आर राइट, माय बैड। नियत
daniero

हालाँकि, मुझे यकीन नहीं है कि टाइपोफ़ चीज़ कुछ भी साबित करती है; ""typeof है "string"लेकिन यह वास्तव में falsy है
daniero

1
दूसरी तरफ, [].lengthअगर लंबाई है 0, तो गलत है , टाइपिंग अधिक नहीं है, और मेरी राय में इरादे का बेहतर संकेत if([])है कि अगर काम किया गया तो भी बेहतर होगा।
इल्युसिवब्रियन

@daniero टाइपो [] === 'वस्तु' के बारे में बात यह है कि कोई भी वस्तु सत्य है, यहां तक ​​कि नए बुलियन (झूठे)। कुछ आदिम प्रकार (जैसे स्ट्रिंग "" और नंबर 0) मिथ्या हैं, लेकिन वे ऑब्जेक्ट नहीं हैं जहां तक ​​टाइपोफ़ का संबंध है। यह याद रखने का एक और तरीका है। यह कुछ भी साबित करने के बारे में नहीं है। प्रमाण विनिर्देश या परीक्षणों में से है, जो भी आप चाहें।
22
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.