क्या आप ट्रिलियन (ट्रू, फाल्स, ??) [बंद] का कोई उपयोग देखेंगे


22

कभी-कभी मेरे पास एक फ़ंक्शन होता है जो सही या गलत लौटना चाहिए। लेकिन कभी-कभी तीन संभावित मूल्य अधिक समझ में आते हैं।

कुछ भाषा में केस को पूर्णांकों या अपवादों के साथ संभाला जाएगा।

छूट के लिए आप एक उपयोगकर्ता की आयु को संभालना चाहते हैं यदि वह 18 वर्ष से अधिक है। और आपके पास एक फंक्शन है।

if(user.isAdult(country_code)){
     //Go On
}else{
     // Block access or do nothing
}

लेकिन कुछ मामलों में यह निर्भर करता है कि आपका ऐप कैसे बनाया गया है, मैं वह मामला देख सकता हूं जहां जन्मदिन का क्षेत्र अधूरा है। फिर इस फ़ंक्शन को अनिर्धारित कुछ वापस करना चाहिए।

switch(user.isAdult()){
    case true:
        // go on
        break;
    case undetermined:
        //Inform user birthday is incomplete
    case false:
        //Block access
}

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


15
अनिवार्य TDWTF लिंक: thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx :)
एडम लेअर

2
@ एना लियर: धिक्कार है, तुमने मुझे हरा दिया। ^ ^
गैबलिन

3
गैब्लिन: अरे नहीं, तुम भी मुझे अन्ना के बारे में शिकायत करने के लिए हराया।
user281377

1
ऊ, मैं टी, एफ, एफएनएफ भी प्राप्त करना चाहता था! हिलाता है मुट्ठी
माइक एम।

4
@gablin, @ammoQ, @ मायके एम .: क्षमा करें। :)
एडम लेअर

जवाबों:


33

इसे या तो एनम, पूर्णांक, प्रतीक (जैसे, लिस्प, रूबी), अशक्त प्रकार (अनिश्चित स्थिति के रूप में अशक्त), विकल्प प्रकार (जैसे, एमएल), या कुछ इसी तरह के निर्माण के साथ संभाला जा सकता है - आपकी भाषा पर निर्भर करता है।

इसलिए जब आपका उदाहरण और औचित्य ध्वनि है तो मैं इसे विकसित करने के लिए भाषा सुविधाओं की प्राथमिकता सूची में नहीं देख सकता।


n / C ++ में अशक्त को समान रूप से गलत माना जाता है। इन मामलों में आपको -1 लौटाना होगा। मुझे लगता है कि अनिर्धारित स्थिति काफी अक्सर होती है लेकिन हमेशा अलग तरीके से व्यवहार किया जाता है क्योंकि यह वाक्यविन्यास वास्तव में मौजूद नहीं है। जावा में एक बूलियन फ़ंक्शन बूलियन फ़ंक्शन के लिए सही या गलत के अलावा और कुछ नहीं लौटा सकता है। तो आप एक अलग प्रकार का उपयोग करने के लिए मजबूर हैं और अच्छी तरह से लौटाए गए मूल्य के दस्तावेज़।
Lo10c Faure-Lacroix

@Sybiam - एक अलग प्रकार का उपयोग करने में कुछ भी गलत नहीं है जहाँ उपयुक्त हो । जैसा कि मैंने कहा कि मैं एक ट्राइक प्रकार के लिए एक तर्क देख सकता हूं, लेकिन मैं इसे जल्द ही किसी भी समय मौजूदा भाषाओं में नहीं जोड़ सकता।
ChrisF

6
@Sybiam: जावा में आप एक बूलियन वापस कर सकते हैं, जो हो सकता है null। C / C ++ में आप एक एनम वापस कर सकते हैं।
मैकनील


2
@ मैक्नील शायद स्पार्टा?
syockit

5

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

switch(user.isAdult()){
   case true:
      // go on
      break;
   default:
      // Block access.
}

2
यदि डेटा अमान्य है, तो यह उपयोगकर्ता को इसे ठीक करने के लिए कह सकता है जो कम होने से अलग है जहां आप उस व्यक्ति से नए युग के इनपुट के लिए नहीं पूछते हैं। यह 2 अलग व्यवहार है। छूट के लिए कुछ सोशल साइट्स आपको गोपनीयता के लिए अधूरे जन्मदिन का इनपुट देती हैं।
Locc Faure-Lacroix

2
मुझे लगता है कि सत्यापन किसी अन्य क्षेत्र / कोड के अनुभाग में किया जाना चाहिए। पहले डेटा को मान्य करें, और फिर उस पर काम करें।
माइकल के डी

1
@Sybiam: सामान्य तौर पर, एप्लिकेशन जब जरूरत पड़ती है, तब आधार पर डेटा नहीं मांगते हैं। आप .isAdult()उपयोगकर्ता को स्वयं क्वेरी कर सकते हैं, यदि वह वास्तव में वही है जो आप चाहते हैं, और यह बेहतर काम करेगा।
डेविड थॉर्नले

5

सत्य, असत्य, अज्ञात

हां नहीं शायद

C # में आप एक अशक्त बूल का उपयोग कर सकते हैं (आप हॉरर में पुनरावृत्ति कर सकते हैं)

MS-SQL में, आप एक अशक्त बिट फ़ील्ड (ditto) का उपयोग कर सकते हैं


2
अशक्त बूलियन्स के साथ समस्या यह नहीं है कि उनके पास नल हैं, इसलिए अधिकांश लोग (मुझे शामिल) तीन-मूल्यवान तर्क के बारे में कुछ भी नहीं जानते हैं। शुरुआत के लिए कौन-सा, वैज्ञानिक
फ्रैंक

सही / गलत / कोई नहीं।
लेन्आर्ट रेगेब्रुक

2
मजेदार बात यह है कि बहुत से लोग बाइनरी, ऑक्टल और हेक्स को समझते हैं, लेकिन अपने दिमाग को टर्नरी के आसपास नहीं लपेट सकते। ऐसा क्यों है? एक ही बात, बस तीन आधार ... जो तीन मूल्य तर्क समस्या को हल करेगा।
माइकल के

5
ज्यादातर लोगों को सिर्फ एक डर है unknown
dan04

2

C ++ में, इसे एक गैर- boolरिटर्न प्रकार के साथ या एक अपवाद को फेंककर संभाला जा सकता है। यदि आप तीन-मूल्यवान रिटर्न प्रकार चाहते हैं, तो एक का उपयोग करें enum। यह उतना सेक्सी नहीं है, लेकिन यह काम करता है, और इससे भी महत्वपूर्ण बात यह है कि आप इसे हम में से बाकी लोगों के लिए भाषा को गड़बड़ाने के बिना कर सकते हैं।

boolतीन-मूल्यवान होने से समस्याएं पैदा होंगी। आप कैसे संभालते हैं bool foo; ... if (foo)..., यह मानते हुए fooकि तीन में से कोई भी मूल्य हो सकता है? ऐसे boolचर होने के फायदे हैं जो हर समय ठीक होते हैं fooऔर !fooसही होते हैं। यह कार्यक्रमों के बारे में कारण में मदद करता है।

जाँच करें कि लोग संख्यात्मक प्रसंस्करण में क्या करते हैं जब वे संभवतः NaNमान प्राप्त कर सकते हैं। यह जटिल है। मैं नहीं बल्कि साधारण बूलियन प्रसंस्करण के लिए इसके माध्यम से जाना होगा।

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


2

विचार काफी उपयोगी है। वहाँ एक पूरा क्षेत्र फज़ी लॉजिक नामक अनिश्चितता से निपटने के लिए समर्पित है ।

सौभाग्य से हमारे लिए प्रोग्रामर, आप मानक भाषा सुविधाओं के साथ फजी लॉजिक को लागू कर सकते हैं।

उदाहरण के लिए, आपके द्वारा दिए गए मामले में, उपयोगकर्ता से पूछकर अनिश्चित जानकारी आसानी से निर्धारित की जा सकती है। तो आप की तरह एक त्रिकोणीय राज्य का वर्णन ठीक काम करेगा।

अनिश्चित होने के लिए सभी प्रकार के अन्य तरीके हैं। ऐसे प्रश्नों में शामिल हैं:

  • क्या कल वर्षा होगी? यह अभी तक नहीं हुआ है, इसलिए किसी को पता नहीं चल सकता है - लेकिन आप एक शिक्षित अनुमान लगा सकते हैं और एक संभावना दे सकते हैं।
  • क्या तारा बीटा पिक्टोरिस के सौर मंडल में एक ग्रह पर बहुकोशिकीय जीवन है? इसका एक निश्चित हाँ-या-कोई उत्तर नहीं है, लेकिन हम वर्तमान में यह नहीं बता सकते हैं कि क्या है।

उन सवालों में से बहुत सारे को 0.0 (असत्य) से लेकर 1.0 (सत्य) तक की संभावनाओं का उपयोग करके और फ्लोटिंग पॉइंट गणित को लागू किया जा सकता है।

डेविड ई। शॉ नाम के एक कम्प्यूटेशनल केमिस्ट और कंप्यूटर वैज्ञानिक ने वॉल स्ट्रीट पर इस तरह की चीज़ को लागू किया और अब इसकी कीमत लगभग 2.5 बिलियन डॉलर है। तो हाँ, यह उपयोगी है। :-)


1

कई साल पहले मैंने कुछ एल्गोरिदम के साथ खेला था जो मूल्यों के प्रति विश्वास प्रदान करने के लिए सामने आ रहे थे। तरह तरह की मस्ती थी। अंतत: मैंने इससे जो हासिल किया, वह यह है कि बूलियन अक्सर एक आकस्मिक फिट होता है। वास्तव में यह एक ट्रिलियन सच / गलत / अन्य मूल्य होना चाहिए। प्रयोग में जो उस समय मेरे लिए "सर्वश्रेष्ठ" कोड का नेतृत्व करने के लिए लग रहा था। मैंने तब से किया है और हर किसी को क्या करना है, जबकि आंतरिक रूप से सोचें तो कितना आसान हो सकता है अगर हम चीजों को उसी पुराने तरीके से करना छोड़ दें ... :-)


0

केस या स्विच स्टेटमेंट इसके लिए ठीक काम करते हैं, हालांकि, पूर्णांक का उपयोग करके स्विच के साथ मनमाने ढंग से व्यवहार करते हैं।

इसके अलावा, रूबी में, 'शून्य' कुछ परिस्थितियों में गलत रूप में रिटर्न, अगर आप समानता ऑपरेटर का उपयोग, जबकि nil == falseरिटर्न false, आप गहरे लाल रंग का इस्तेमाल कर सकते हैं तो nilत्रिगुट तर्क को संभालने के लिए।


0

आपके मामले में एक अन्य विकल्प "बताओ मत पूछो" प्रिंसिपल को लागू करके नियंत्रण को पलटना हो सकता है और इसे बदल सकता है (शब्द वयस्कता, मस्तिष्क रुकावट के बारे में खेद):

user.isAdult(new OnlyAllowAdultsToLogin())

जहां OnlyAllowAdultsToLoginStrategyएक इंटरफ़ेस लागू होता है:

interface UserAdultnessPolicy
{
   void userIsAdult();
   void userIsChild();
   void userAdultnessIsUnknown();
}

क्या करता void userIsAdult()है? शायद तुम्हारा मतलब bool userIsAdult()?
टिमवी

0

मेरा बेटा मुझसे पूछ रहा था कि इस तरह से दिखने वाले परीक्षणों को कुशलता से कैसे लागू किया जाए। परीक्षण किए जा रहे झंडे केवल सच्चे / झूठे थे, लेकिन मैचकी के तीन राज्य थे (यह सच होना चाहिए, यह गलत होना चाहिए, या मुझे परवाह नहीं है)। बेशक यह एक 2bit डेटा संरचना और बिट बिटडलिंग के साथ लागू किया जा सकता है, लेकिन कोड के उस प्रकार को वास्तव में टिप्पणी करने की आवश्यकता है क्योंकि उद्देश्य कोड को देखने से आसान नहीं है।


0

सी में यह सुविधा अधिकांश पुस्तकालय कार्यों में लागू की गई है। उदाहरण के लिए स्ट्रैम्प 2 स्ट्रिंग्स और रिटर्न 0 की तुलना करता है, यदि वे समान हैं, तो 1 (यानी कोई भी सकारात्मक पूर्णांक) यदि 1 दूसरा 2 से अधिक है, और -1 (अर्थात कोई भी नकारात्मक पूर्णांक) यदि दूसरा पहले से अधिक है। ।

उसी दृष्टिकोण का उपयोग कहीं और किया जा सकता है, + / 0 / - अपने त्रि-राज्य के रूप में। यह आपको मानों पर बूलियन तर्क प्रदर्शन करने देता है यदि आप जानते हैं कि यदि 0 गलत है और कोई अन्य मान सत्य है।


0

C ++ के लिए, बूस्ट वास्तव में एक ट्रिबूल का वर्णन करता है जैसे:

ट्रिबूल वर्ग बिल्ट-इन बूल प्रकार की तरह काम करता है, लेकिन 3-राज्य बूलियन तर्क के लिए। तीन राज्य सही, गलत और अनिश्चित हैं, जहां पहले दो राज्य C ++ बूल प्रकार के बराबर हैं और अंतिम राज्य एक अज्ञात बूलियन मान का प्रतिनिधित्व करता है (जो सच या गलत हो सकता है, हम नहीं जानते)।


-1

VB6 चेकबॉक्स में यह क्षमता है। चेकबॉक्स मान 0 = बंद, 1 = चालू, 2 = ग्रे हो सकता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.