क्या किसी लाइब्रेरी के भीतर STDIN से पढ़ने के लिए इसे एक पैटर्न-विरोधी माना जाता है?


39

एक बड़ी परियोजना के लिए एक पुस्तकालय लिखने के दौरान, मैं एक काम पर काम कर रहा था, एक मुद्दा सामने आया जिसे ईमेल पते पर भेजने के लिए एक टोकन की आवश्यकता थी, और फिर कोड में वापस पारित कर दिया गया जहां इसे फिर आगे उपयोग के लिए इस्तेमाल किया जा सकता है।

मेरा सहकर्मी सिर्फ एसटीडीआईएन (पायथन का उपयोग करके code = input("Enter code: ")) से पढ़ने के लिए कहता है और फिर एक उपयोगकर्ता इसे पास करता है, हालांकि मुझे ऐसा लगता है जैसे पुस्तकालय में एक पृष्ठभूमि कार्य में पुस्तकालय का उपयोग बुरा हो सकता है (निश्चित रूप से इस मामले में)। ।

मैं सोच रहा था कि यह एक विरोधी पैटर्न माना जाता है या नहीं।


45
सब कुछ बुरा नहीं एक "प्रतिमान" है, हालांकि यह निश्चित रूप से बुरा है।
फिश

4
"पैटर्न" का मतलब है कि प्रोग्रामर अक्सर करते हैं। यह केवल एक विरोधी पैटर्न है अगर यह दोनों (ए) एक बुरा विचार है, और (बी) कुछ ऐसा है जिसे आप डेवलपर्स को हर समय करते देखते हैं।
सोलोमन स्लो

20
यह अब तक का प्रतिरूप है। एक विरोधी पैटर्न एक ऐसी चीज है जो स्वाभाविक और समझदार लगता है लेकिन जब आप इसे खोदते हैं तो यह खराब हो जाता है। आप यहाँ जो वर्णन कर रहे हैं, वह केवल स्पष्ट रूप से भीषण है।
इवान हार्पर

मैं किसी भी उत्तर की बात नहीं देख रहा हूं। उपयोगकर्ता टोकन अभ्यास का बिंदु यह साबित करना होगा कि उपयोगकर्ता का ईमेल पता काम करता है। अगर वह बात नहीं थी, तो यह केवल टोकन स्टोर करना अधिक सरल होगा।
एमोरी

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

जवाबों:


78

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

बेशक, इस नियम के अपवाद हैं, लेकिन इसके लिए एक बहुत अच्छा कारण होना चाहिए। उपयोग करने के मामले में stdin, मुझे कोई कारण नहीं मिल सकता है (जब तक कि आपका पुस्तकालय वास्तव में स्टड से पढ़ने के लिए दिनचर्या प्रदान नहीं करता है, जैसे std::cinसी ++ से)। इसके अलावा, I / O धाराओं को हार्डकोड करने के बजाय एक पैरामीटर से लेने से उनमें इतना लचीलापन आ जाता है कि यह करने लायक नहीं है।


36
अपवाद एक पुस्तकालय है जिसमें पर्यावरण के साथ बातचीत करने का एक विशिष्ट लक्ष्य है। इसके बाद भी, पर्यावरण का विवरण दूर होना चाहिए। उदाहरण के लिए, एक ग्राफिक्स ड्राइवर को PCIe बस के साथ संवाद करना पड़ता है, लेकिन बस आईडी को कॉन्फ़िगरेशन के माध्यम से प्रदान किया जाना चाहिए।

यह उस तरह का अपवाद है जैसा मैंने सोचा था: मेरा विचार ncurses के करीब था - आम तौर पर, एक पाठ-पर्यावरण उपयोगकर्ता इंटरफ़ेस लाइब्रेरी। यदि इसका उद्देश्य उपयोगकर्ता इनपुट को पढ़ना और उपयोगकर्ता आउटपुट प्रदान करना है, तो यह एक अच्छा कारण है।
एसएफ।

5
@SF। यहां तक ​​कि ncurses जैसी लाइब्रेरी को भी 0 और 1. के उपयोग को हार्डकोड करने के बजाय फ़ाइल डिस्क्रिप्टर की एक जोड़ी को तर्क के रूप में लेना चाहिए। आप एक प्रोग्राम लिखना चाहते हैं जहां स्टड और स्टडआउट को पुनर्निर्देशित किया जा सकता है और इसके बजाय आप के /dev/ttyसाथ संवाद करने के लिए खोलना चाहते हैं उपयोगकर्ता। कार्यक्रम भी एक टर्मिनल के बिना शुरू किया जा सकता है और अपने स्वयं के टर्मिनल का उपयोग करके खोल सकता है xterm -S
कैस्परल्ड

3
@kasperd: सबसे अच्छा तरीका समझदार चूक और उन्हें ओवरराइड करने की क्षमता प्रदान कर रहा है।
एसएफ।

1
इस विशेष मामले में, मुझे इनपुट के रूप में स्ट्रीम की मांग करने का कोई कारण नहीं दिखता है । केवल टोकन को पैरामीटर के रूप में स्वीकार क्यों नहीं किया जाता है?
jpmc26

16

मैं इस बात पर विचार नहीं करूंगा कि यह एक प्रतिमान, सिर्फ एक खराब तरीके से तैयार पुस्तकालय है। यह एक स्ट्रिंग के लिए एक विधि पैरामीटर के रूप में पूछने के लिए तुच्छ होना चाहिए, जहां इनपुट सीधे में पारित किया जा सकता है।

यदि वह इस उपयोग के लायक नहीं है, तो एक विधि पैरामीटर एक धारा हो सकती है, जिसमें STDIN विधि पारित हो जाती है।

यदि वह इस उपयोग के लायक नहीं है, तो पुस्तकालय पर्याप्त लचीला नहीं है।


4

हो सकता है कि उपयोगकर्ता द्वारा प्रदान किए गए फ़ंक्शन को कॉलबैक सेट करने की आपकी लाइब्रेरी में क्षमता हो , जहां से इनपुट पढ़ा जाएगा , और फिर उस फ़ंक्शन का उपयोग करने वाले लाइब्रेरी के किसी भी हिस्से में उपयुक्त मान वापस लौटाएं।


1

यदि यह स्टडिन से पढ़ता है, तो इसका मतलब है कि यह स्टड का प्रोग्राम-स्तरीय स्वामित्व लेना चाहता है। यह संभावना किसी भी अन्य पुस्तकालय के साथ संगत नहीं है जो स्टड से पढ़ता है, वे कैसे उपयोग करते हैं, इसके लिए कम विशिष्ट प्रोटोकॉल। कम से कम मेरी अपनी व्यक्तिगत शब्दावली में, यह पुस्तकालय को एक ढांचा बना देगा , जो एक महंगा व्यापार है।

लेकिन इस मामले में, पुस्तकालय को संभवतः केवल एक इनपुट फ़ाइल विवरणक लेना चाहिए।


0

@ पॉल92 का उत्तर अच्छी सामान्य चर्चा है, लेकिन मैं इसके लिए एक संभावित स्वच्छ (ईश) समाधान प्रस्तुत करना चाहता हूं :

एक पुस्तकालय, इस कोड को किसी भी रनटाइम वातावरण के अनुकूल होने की आवश्यकता है, इसलिए आप वास्तव में STDINकुछ महत्वपूर्ण डेटा के लिए नहीं पूछ सकते हैं । एक के लिए, आपके पुस्तकालय के उपयोगकर्ताओं को कई कारणों से स्टडिन उपलब्ध नहीं हो सकता है। इसके बजाय आप यह सुनिश्चित करने के लिए कि कैसे टोकन पुनर्प्राप्त किया जाना है, को अनुकूलित करने के लिए रणनीति पैटर्न के कुछ रूप का उपयोग करना चाह सकते हैं ।

पायथन में, संभवतः सबसे अच्छा विकल्प एक फ़ंक्शन पैरामीटर के रूप में टोकन प्राप्त करने की रणनीति को पारित करना है। ऐसा कुछ:

def stdin_prompt():
    return input("Enter code: ")

def my_library_function(arg1, arg2, ... argn, token_provider = stdin_prompt):
    ...
    token = token_provider()
    ...
    return stuff

# somewhere in the user code
stuff = my_library_function(a1, a2, ... an, lambda: "123456")

इसके बारे में इस तरह से सोचें। आपको जिस टोकन की आवश्यकता है, वह लाइब्रेरी फ़ंक्शन का एक तर्क है। चूंकि टोकन के लिए मूल्य कॉल साइट पर सांख्यिकीय रूप से ज्ञात नहीं हो सकता है, आप वास्तव में तर्क के रूप में मूल्य नहीं पूछ सकते हैं। इसके बजाय, कॉल करने वाले को एक फ़ंक्शन प्रदान करना होगा जो कॉल करने पर टोकन प्रदान करने के लिए जिम्मेदार होगा।

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

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