TL; DR: बूलियन तर्कों का उपयोग न करें।
नीचे देखें कि वे क्यों खराब हैं, और उन्हें कैसे बदलना है (बोल्ड चेहरे में)।
बूलियन तर्क को पढ़ना बहुत कठिन है, और इस तरह बनाए रखना मुश्किल है। मुख्य समस्या यह है कि उद्देश्य आमतौर पर स्पष्ट होता है जब आप विधि हस्ताक्षर पढ़ते हैं जहां तर्क का नाम दिया जाता है। हालांकि, ज्यादातर भाषाओं में एक पैरामीटर का नामकरण आमतौर पर आवश्यक नहीं होता है। तो आपके पास विरोधी पैटर्न होंगे जैसे RSACryptoServiceProvider#encrypt(Byte[], Boolean)
कि बूलियन पैरामीटर यह निर्धारित करता है कि फ़ंक्शन में किस प्रकार के एन्क्रिप्शन का उपयोग किया जाना है।
तो आपको एक कॉल मिलेगा:
rsaProvider.encrypt(data, true);
जहां पाठक को यह निर्धारित करने के लिए कि true
वास्तव में नरक का क्या मतलब हो सकता है , विधि के हस्ताक्षर को देखना होगा। पूर्णांक पास करना निश्चित रूप से बुरा है:
rsaProvider.encrypt(data, 1);
आपको बस उतना ही बताएगा - या बल्कि: बस के रूप में कम। यहां तक कि अगर आप पूर्णांक के लिए उपयोग किए जाने वाले स्थिरांक को परिभाषित करते हैं, तो फ़ंक्शन के उपयोगकर्ता बस उन्हें अनदेखा कर सकते हैं और शाब्दिक मूल्यों का उपयोग कर सकते हैं।
इसे हल करने का सबसे अच्छा तरीका एक एन्यूमरेशन का उपयोग करना है । यदि आपको RSAPadding
दो मानों के साथ एक एनम पास करना है: OAEP
या PKCS1_V1_5
फिर आप तुरंत कोड को पढ़ सकेंगे:
rsaProvider.encrypt(data, RSAPadding.OAEP);
बूलियन में केवल दो मूल्य हो सकते हैं। इसका मतलब है कि यदि आपके पास तीसरा विकल्प है, तो आपको अपने हस्ताक्षर को फिर से भरना होगा। यदि पश्चगामी संगतता एक समस्या है, तो आमतौर पर यह आसानी से नहीं किया जा सकता है, इसलिए आपको किसी भी सार्वजनिक वर्ग को किसी अन्य सार्वजनिक विधि से विस्तारित करना होगा। यह वही है जो अंततः माइक्रोसॉफ्ट ने किया था जब उन्होंने RSACryptoServiceProvider#encrypt(Byte[], RSAEncryptionPadding)
एक बूलियन के बजाय एक प्रतिरूपण (या कम से कम एक वर्ग की नकल करना) का उपयोग किया था।
पैरामीटर के रूप में पूर्ण ऑब्जेक्ट या इंटरफ़ेस का उपयोग करना और भी आसान हो सकता है , यदि पैरामीटर को खुद को पैरामीटर करने की आवश्यकता होती है। उपरोक्त उदाहरण में OAEP पैडिंग को आंतरिक रूप से उपयोग करने के लिए हैश मान के साथ परिमाणित किया जा सकता है। ध्यान दें कि अब 6 SHA-2 हैश एल्गोरिदम और 4 SHA-3 हैश एल्गोरिदम हैं, इसलिए गणना मूल्यों की संख्या में विस्फोट हो सकता है यदि आप केवल मापदंडों के बजाय एक एकल एन्यूमरेशन का उपयोग करते हैं (यह संभवतः अगली चीज है जिसे Microsoft पता लगाने जा रहा है। )।
बूलियन पैरामीटर यह भी संकेत दे सकता है कि विधि या वर्ग अच्छी तरह से डिज़ाइन नहीं किया गया है। ऊपर दिए गए उदाहरण के साथ: .NET के अलावा कोई भी क्रिप्टोग्राफिक लाइब्रेरी, विधि हस्ताक्षर में पैडिंग फ़्लैग का बिल्कुल भी उपयोग नहीं करता है।
लगभग सभी सॉफ्टवेयर गुरु जो मुझे बूलियन तर्कों के खिलाफ चेतावनी देते हैं। मिसाल के तौर पर, जोशुआ बलोच ने उनके खिलाफ बेहद सराहनीय पुस्तक "इफेक्टिव जावा" में चेतावनी दी। सामान्य तौर पर उन्हें बस इस्तेमाल नहीं किया जाना चाहिए। आप तर्क दे सकते हैं कि उनका उपयोग किया जा सकता है यदि ऐसा मामला हो जो एक पैरामीटर है जिसे समझना आसान है। लेकिन फिर भी: Bit.set(boolean)
शायद दो तरीकों का उपयोग करके बेहतर तरीके से लागू किया जाता है : Bit.set()
और Bit.unset()
।
यदि आप सीधे उस कोड को रिफलेक्टर नहीं कर सकते हैं जो आप स्थिरांक को कम से कम परिभाषित कर सकते हैं तो उन्हें अधिक पठनीय बना सकते हैं:
const boolean ENCRYPT = true;
const boolean DECRYPT = false;
...
cipher.init(key, ENCRYPT);
की तुलना में बहुत अधिक पठनीय है:
cipher.init(key, true);
भले ही आपके पास हो:
cipher.initForEncryption(key);
cipher.initForDecryption(key);
बजाय।