क्या एक सर्वर को "उदार होना चाहिए" जो इसे स्वीकार करता है और "दोषपूर्ण इनपुट को चुपचाप त्याग देता है"?


27

मैं इस धारणा के तहत था कि अब तक सभी सहमत हैं कि यह अधिकतम गलती थी। लेकिन मैंने हाल ही में इस उत्तर को देखा, जिसमें 137 बार (आज के अनुसार) टिप्पणी "एक उदारवादी" है।

मेरी राय में, जो ब्राउज़र स्वीकार करते हैं, उसमें कमी इस बात का सीधा कारण थी कि HTML और कुछ अन्य वेब मानक कुछ साल पहले थे, और अभी हाल ही में उस गंदगी को ठीक से क्रिस्टलीकृत करना शुरू किया है। जिस तरह से मैं इसे देख, क्या आप स्वीकार में उदार किया जा रहा होगा इस के लिए सीसा।

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

तो, क्या मैं इस बारे में पूरी तरह से गलत हूं? क्या मेरे कार्यक्रम में निष्ठावान होना चाहिए और यह त्रुटियों को चुपचाप निगल सकता है? या मैं गलत व्याख्या कर रहा हूं कि इसका क्या मतलब है?


मूल प्रश्न ने कहा "कार्यक्रम", और मैं उस बारे में सभी का ध्यान रखता हूं। यह कार्यक्रमों के लिए समझदार हो सकता है। हालांकि, वास्तव में मेरा मतलब एपीआई है: लोगों के बजाय अन्य कार्यक्रमों के संपर्क में आने वाले इंटरफेस । HTTP एक उदाहरण है। प्रोटोकॉल एक इंटरफ़ेस है जिसका उपयोग केवल अन्य प्रोग्राम करते हैं। लोग कभी भी सीधे तारीखों को प्रदान नहीं करते हैं जो हेडर में जाते हैं जैसे "इफ़-मॉडिफाइड-चूंकि"।

तो, सवाल यह है: क्या मानक को लागू करने वाला सर्वर उदार होना चाहिए और मानक के अनुसार वास्तव में आवश्यक एक के अलावा कई अन्य प्रारूपों में तारीखों की अनुमति देनी चाहिए? मेरा मानना ​​है कि "मानवीय होना चाहिए" इस स्थिति पर लागू होता है, बजाय मानव इंटरफेस के।

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

तो, क्या कुछ एपीआई को उजागर करने वाला सर्वर उदार होना चाहिए या यह एक बहुत बुरा विचार है?


अब उपयोगकर्ता इनपुट के उदार हैंडलिंग पर। YouTrack (एक बग ट्रैकिंग सॉफ्टवेयर) पर विचार करें। यह पाठ प्रविष्टि के लिए एक भाषा का उपयोग करता है जो मार्कडाउन की याद दिलाता है। सिवाय इसके कि यह "उदार" है। उदाहरण के लिए, लेखन

- foo
- bar
- baz

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

तो, क्या मेरे सॉफ्टवेयर को इस बात पर ध्यान देना चाहिए कि इसे कौन से उपयोगकर्ता इनपुट में स्वीकार करते हैं?


4
"दोषपूर्ण इनपुट को चुपचाप त्यागें" के बारे में, मैं प्रत्येक मामले के लिए पूछूंगा कि दोषपूर्ण इनपुट के रूप में क्या माना जाना चाहिए। यदि आप किसी उपयोगकर्ता से एक प्रश्न पूछते हैं और "हाँ" या "नहीं" की अपेक्षा करते हैं, तो क्या "YES" दोषपूर्ण इनपुट है? कैसे "y" के बारे में? कैसे "oui" के बारे में? सामान्य तौर पर, उपयोगकर्ता को यह बताने में संकोच न करें कि उनका इनपुट वह नहीं है जिसकी आप अपेक्षा करते हैं। हालाँकि यह सुनिश्चित करें कि आप मेरे दिमाग में जितना संभव हो - उतना ही समावेशी रहे हैं, लेकिन इसका अर्थ "उदार होना" है।

3
यदि आप अंतिम उपयोगकर्ता इनपुट के बारे में बात कर रहे हैं - जो आपके आवेदन की उपयोगकर्ता मित्रता से संबंधित है, तो आपको लिनेन्ट होना चाहिए; स्वचालित मशीन जनित इनपुट (एक एपीआई से) के लिए, आपको क्रिया (सख्त) होनी चाहिए।
बुरहान खालिद

2
वास्तव में HTML की उदारता यह थी कि यह इतना लोकप्रिय क्यों हो गया (और XHTML की सख्ती क्यों इसे गिरा दिया गया)।
ओलिवर वीलर

1
मुझे लगता है कि कुंजी यह है कि अगर यह एक ऐसा परिदृश्य है जहां आप इसे इनायत से विफल होने की अनुमति दे सकते हैं, तो आप इस घटना को कम से कम लॉग इन कर सकते हैं।
रिग

2
@OliverWeiler मुझे लगता है कि XHTML की असफलता का इस तथ्य से कोई लेना-देना नहीं था कि यह पूरी तरह से अनावश्यक था। HTML पहले से ही था और थोड़े काम किया। इसके अलावा, जबकि HTML बेशक बेहद लोकप्रिय है, यह दुख की बात है कि हम इस तकनीक को सफल कह रहे हैं। यह मांग को पूरा करता है, लेकिन यह ऐसा करता है और साथ ही सिम्बियन स्मार्टफोन की मांग को पूरा करता है।
रोमन स्टार्कोव

जवाबों:


9

बेशक आप पूरी तरह से सही हैं। कार्यक्रम कभी भी "उदार" नहीं होने चाहिए क्योंकि ऐसा करना केवल मुखौटा समस्याओं का कार्य करता है। समस्याओं को उजागर किया जाना चाहिए, गलीचा के नीचे नहीं बहना चाहिए। किसी प्रोग्राम के लिए उपयोगकर्ता के लिए सहायक होने के लिए एक सूचनात्मक त्रुटि संदेश एक पूर्ण है।

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

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


25

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

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

अंत में, मुझे लगता है कि महत्वपूर्ण बात यह है: आपके उपयोगकर्ता क्या परवाह करते हैं?


4
यूनिक्स कमांड-लाइन टूल का विशाल बहुमत जो प्रोग्रामर के बाहर लक्षित दर्शकों के लिए दावा करता है, फिर भी उपयोगकर्ताओं द्वारा गलतियाँ करने के लिए बेकार हैं। यहां तक ​​कि अगर आप एक प्रोग्रामर नहीं हैं, तो आमतौर पर एक कार्यक्रम के लिए एक समस्या को समझाने के लिए बेहतर है कि कुछ निरर्थक या अनपेक्षित किया जाए।
तिमवी

2
@romkyns: पूरी तरह से नहीं, मैं कह रहा हूं कि आपके एप्लिकेशन को उन तरीकों से त्रुटियों को संभालना चाहिए जो आपके लक्षित उपयोगकर्ताओं के लिए समझ में आते हैं।
डेमियन ब्रेख्त

@ टिमी: किस मामले में, उन यूनिक्स कमांड लाइन उपकरण खराब रूप से वास्तुशिल्प हैं;)
डेमियन ब्रेख्त

3
@romkyns - मुझे लगता है कि एक अच्छा उदाहरण होगा: डिबग मोड में, आप किसी भी समस्या को रोकने के लिए एक कार्यक्रम चाहते हैं और आपको बताएंगे कि क्या गलत हुआ। उत्पादन मोड में आप चाहते हैं कि आपका कार्यक्रम काम करने के साथ-साथ जारी रख सके, और किसी भी समस्या को हल कर सके। इस तरह, प्रोग्रामर देख सकते हैं कि उन्होंने क्या गलत किया और इसे ठीक किया, लेकिन उपयोगकर्ता उन चीजों से परेशान नहीं होंगे जिन्हें वे ठीक नहीं कर सकते। कुछ समस्याएं स्पष्ट रूप से तय नहीं की जा सकती हैं, लेकिन एक अच्छा उदाहरण सीएसएस शैली के नियम हैं, जहां आप अभी भी किसी साइट को प्रस्तुत कर सकते हैं, भले ही आप शैली के नियमों में से एक को न समझें।
मोनिका

1
@ ब्रेंडनलॉन्ग की टिप्पणी ने सिर पर कील ठोक दी - कभी-कभी उत्पादन सही होने से अधिक महत्वपूर्ण होता है। उपयोगकर्ता से इनपुट के बिना कुछ त्रुटियों (या चेतावनियों) को इनायत से पुनर्प्राप्त किया जा सकता है; यह तय करना है कि आप इन मामलों में क्या करना चाहते हैं।
डैनियल बी

7

"लीनिएंट" दो प्रकार के होते हैं: एक है गलत इनपुट को स्वीकार करना और इसे समझने की कोशिश करना, और दूसरा है विभिन्न प्रकार के इनपुट को स्वीकार करना।

आम तौर पर, आप हमेशा दूसरा चाहते हैं जब यह संभव हो। पहला जब आप तेज और कठिन मरते हैं। एक उदाहरण: तिथियाँ।

कुछ मान्य, अमान्य और अस्पष्ट सहित उदाहरण उदाहरण हैं।

  • 2011-01-02
  • 01/02/2011
  • Jan 2, 2011
  • 2-Jan-2011
  • Green

सिर्फ एक ही अवैध यहाँ इनपुट है: Green। इसे एक तिथि के रूप में स्वीकार करने का भी प्रयास न करें। चूंकि Greenस्पष्ट रूप से एक तारीख नहीं है, यह एक ऐसा मामला है जहां मौन असफलता स्वीकार्य है।

01/02/2011वैध है, लेकिन अस्पष्ट है। आप जरूरी नहीं जानते हैं कि यह यूएस दिनांक (जनवरी 2) के रूप में दर्ज किया गया है या नहीं (1 फरवरी)। यहाँ, यह शायद ज़ोर से विफल करने के लिए सबसे अच्छा है, और एक अस्पष्ट तारीख के लिए उपयोगकर्ता से पूछें।

2011-01-02आमतौर पर असंदिग्ध माना जाता है, इसलिए अक्सर आगे बढ़ना ठीक होता है और यह मान लिया जाता है कि यह "YYYY-MM-DD" प्रारूप है, और केवल रेखा के आगे विफल हो जाते हैं। हालांकि, उपयोगकर्ता इनपुट के साथ काम करते समय यह निर्णय कॉल का एक सा है।

Jan 2, 2011और 2-Jan-2011वैध और असंदिग्ध हैं, उन्हें स्वीकार किया जाना चाहिए। हालांकि, The Second of January of the year 2011है भी वैध और स्पष्ट है, लेकिन जा रहा है कि अब तक उदारता के लिए overkill है। आगे बढ़ो और इसे चुपचाप विफल करें, जैसे Green

संक्षेप में , उत्तर "यह निर्भर करता है" है। जो इनपुट किया जा सकता है उस पर एक नज़र डालें, और सुनिश्चित करें कि आप कभी भी परस्पर विरोधी प्रकार के इनपुट (जैसे DD/MM/YYYYबनाम MM/DD/YYYY) को स्वीकार नहीं कर रहे हैं ।

जुड़े हुए प्रश्न / टिप्पणी के संदर्भ में , यह एक मामला है 2011-01-02। इनपुट JSON की तरह दिखता है और JSON की तरह मान्य होगा, भले ही mimetype गलत हो; आगे बढ़ें और लाइन के नीचे किसी बिंदु पर विफल होने पर भी इसका उपयोग करने का प्रयास करें।


1
यहाँ एक बात आप पर विचार नहीं कर रहे हैं। यदि उपयोगकर्ता ने उस स्ट्रिंग को टाइप किया है, तो हाँ, मुझे विभिन्न स्वरूपों को स्वीकार करना चाहिए, इसमें कोई संदेह नहीं है। लेकिन हम एपीआई की बात कर रहे हैं। एपीआई के ग्राहक अन्य कार्यक्रम हैं। यदि यह अपने दिनांक प्रारूप में उदार है, तो इस एपीआई को उजागर करने वाले प्रत्येक भविष्य के सर्वर को उसी तरह से उत्तरदायी होना होगा या असंगति को जोखिम में डालना होगा। आपको लगता है कि यह मददगार होने के बजाय हानिकारक है।
रोमन स्टार्कोव

1
@romkyns मुझे लगता है कि आप गलतफहमी में हैं, जहां पर झूठ निहित है। एपीआई यह क्या में उदार होना चाहिए स्वीकार करता है (यह सभी को समझना चाहिए 2011-01-02, Jan 2, 2011और 2-Jan-2011न यह क्या है, अगर यह बहुत मुश्किल लागू करने के लिए नहीं है), आउटपुट । उस एपीआई के भविष्य के ग्राहकों को किसी दिए गए के बारे में जानने की जरूरत नहीं है, जब तक कि वे उनमें से एक को सही ढंग से इनपुट नहीं कर रहे हैं। आदर्श रूप से, एपीआई परत इन सभी को उसी आंतरिक प्रतिनिधित्व में बदल देगी, जो कोड को इसे पास करने से पहले उपयोग करता है।
इजाकाटा

उदाहरण के लिए, @romkyns आउटपुट हमेशा 2011-01-02प्रारूप में हो सकता है , और यह वह है जिसे आप अपने दस्तावेज़ में डाल सकते हैं। मुझे कोई हानिकारक प्रभाव दिखाई नहीं देता है।
इजाकाता

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

1
एक जोरदार असहमत। जब तक यह उपयोगकर्ता द्वारा दर्ज किया गया इनपुट नहीं होता, तब तक इनपुट और आउटपुट दोनों पर हमेशा सख्त रहें। क्या होता है जब आपकी सेवा को फिर से लागू करने की आवश्यकता होती है? क्या आपने सभी संभावित दिनांक स्वरूपों का दस्तावेज़ दिया है? आपको उन सभी को लागू करने की आवश्यकता होगी, क्योंकि आप नहीं चाहते कि पुराने ग्राहक टूट जाएं। कृपया, सभी मशीन जनित दिनांक उदाहरणों और अवधियों के लिए ISO 8601 का उपयोग करें: यह पुस्तकालयों में अच्छी तरह से निर्दिष्ट और व्यापक रूप से उपलब्ध है। वैसे, 2011-01-02 का वास्तव में क्या मतलब है? 3:00 पर 00:00 से 2:00 तक के समय की अवधि? किस समय-क्षेत्र में?
डिब्बीके

6

खामोशी से असफलता सबसे बुरी चीज है जो आप संभवतः कभी भी कर सकते हैं। क्या आपने खामोशी से एपीआई की डिबग करने की कोशिश की है? यह असंभव है

"पुनर्प्राप्त करने के लिए अपना सर्वश्रेष्ठ करें लेकिन विस्तृत त्रुटि भेजें" और "मौन विफलता" है।


3

यह मुझे लगता है कि पोस्टेल का नियम - "आप जो करते हैं उसमें रूढ़िवादी रहें, जो आप दूसरों से स्वीकार करते हैं उसमें उदार रहें" जो कि JSON सेवा के लिए चर्चा की जा रही है। यह आमतौर पर वेब सेवाओं पर लागू होता है और UI पर नहीं।

यूआई रचनात्मक उपयोगकर्ता प्रतिक्रिया और गर्भनिरोधक उपयोगकर्ता इनपुट के लिए हमारे द्वारा उपयोग किए जाने वाले अंगूठे का नियम है।


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

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

जब तक कोई और आपकी कल्पना को लागू नहीं करता है, तब तक केवल यह पता लगाने के लिए कि "मजबूती", कि सैकड़ों ग्राहक भरोसा करने आए हैं, वास्तव में कल्पना में नहीं था और रिवर्स-इंजीनियर होना चाहिए ...
रोमन स्टार्कोव

3

मुझे लगता है कि यह अच्छी तरह से अध्याय 1, TAOUP के खंड 6 में शामिल है। विशेष रूप से, मरम्मत का नियम , जिसमें कहा गया है कि एक कार्यक्रम को एक इनपुट के साथ क्या करना चाहिए, सही डेटा को आगे पारित करना चाहिए, और यदि सही प्रतिक्रिया विफलता है, तो ऐसा ASAP करें।

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

इसलिए दोषपूर्ण इनपुट को चुपचाप छोड़ना ठीक है, इसलिए जब तक आप उस इनपुट को संभाल रहे हैं । आपको इसे कभी भी फर्श पर नहीं छोड़ना चाहिए, जैसा कि यह था।


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

बेशक, एक एपीआई संरचना के नियम का सिर्फ एक निम्न स्तर का संस्करण है । जैसे, यह वास्तव में कम से कम आश्चर्य के नियम के तहत कवर किया गया है , क्योंकि यह एक इंटरफ़ेस है।

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

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


2

प्रोग्राम जो सर्वर पर तैनात किए जाते हैं, अधिकांश समय, हर मिनट या कभी-कभी हर सेकंड में हजारों अनुरोध लेने होते हैं। यदि कोई सर्वर प्रोग्राम स्वीकार करता है और ग्राहकों से दोषपूर्ण इनपुट को ठीक करता है, तो मुझे डर है कि इसके 2 नुकसान होंगे:

  1. कीमती सर्वर समय का नुकसान। प्रति सेकंड 1000+ अनुरोधों के साथ, प्रत्येक अनुरोध में दोषों की जाँच प्रत्येक ग्राहक के लिए धीमी प्रतिक्रिया को दर्शा सकती है।
  2. क्लाइंट / क्लाइंट-प्रोग्राम के लिए अनुचित जो सही इनपुट प्रदान करते हैं। इसके अलावा, जब एक सर्वर साइड प्रोग्रामर सर्वर कोड पर बैठता है, तो उसे विभिन्न मामलों के बारे में सोचना होगा कि दोषपूर्ण इनपुट क्या हो सकते हैं। कौन तय करेगा?

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


2

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

एक चीज जो प्रोटोकॉल के डिजाइन में बहुत मददगार हो सकती है, कल्पना का प्रारूप, या "भाषा" के लिए संभावित गैर-समझी गई वस्तुओं की चार श्रेणियों को अलग करने का एक साधन होना चाहिए:

  1. जिन चीजों को नहीं समझा जाना चाहिए, उन्हें फ़िल्टर किया जाना चाहिए।
  2. जिन चीज़ों को अनदेखा किया जाना चाहिए अगर उन्हें नहीं समझा जाए, लेकिन फिर भी अगर डेटा को पारित करने की आवश्यकता है, तो इसे बरकरार रखा जाए (शायद किसी प्रकार के आवरण को इंगित करने के लिए कि यह कम से कम एक चरण से गुजरा है जो इसे समझ नहीं पाया है)
  3. चीजें जो समझ में नहीं आने पर एक चेतावनी उत्पन्न करनी चाहिए, लेकिन डेटा रिकवरी के प्रयास को नहीं रोकना चाहिए (जैसे वेब पेज के भीतर, एक ऐसी वस्तु जिसका प्रकार अज्ञात है, लेकिन जिसका अंत फ़ाइल में अच्छी तरह से परिभाषित है, उसे लाल रंग में प्रस्तुत किया जा सकता है। "X" को पेज के शेष भाग को रोके बिना।)
  4. ऐसी चीजें जो इंगित करती हैं कि कुछ भी जो उन्हें समझ नहीं सकता है वह गंभीर और अपरिवर्तनीय समस्याएं कहीं और हैं (उदाहरण के लिए एक संकेतक जो शेष डेटा संपीड़ित है, और जो कुछ भी उस चीज को समझा जाएगा जो आवश्यक अनिश्चितता का प्रदर्शन कर सकता है)।

एक अच्छी तरह से परिभाषित सम्मेलन होने से, जो ऐप्स डेटा प्रारूप के किसी भी संस्करण को पढ़ सकते हैं, यह पहचानने में सक्षम होंगे कि बाद के संस्करणों के अनुपालन में उत्पन्न किसी भी चीज के लिए कौन सी श्रेणी उपयुक्त है, तदर्थ अनुकूलता उपायों में कील लगाने के प्रयास की तुलना में बहुत बेहतर तरीका है। बाद में। उदाहरण के लिए, यदि किसी फ़ाइल प्रारूप में "टैग: मान" फ़ॉर्म की पंक्तियाँ हैं, तो कोई यह निर्दिष्ट कर सकता है कि किसी भी टैग का पहला वर्ण उस श्रेणी को इंगित करेगा जिसमें वह संबंधित है; मूक-अनदेखा श्रेणियों के टैग के लिए, कोई भी पहला चरित्र हो सकता है जो उस मानक के संस्करण का भी संकेत देता है जिसके लिए टैग मान्य होने की उम्मीद है (ताकि यदि "मूक-अनदेखी" टैग 3 संस्करण में मौजूद होने का दावा करता है मानक, संस्करण के लिए एक पार्सर चुपचाप इसे अनदेखा करेगा, लेकिन संस्करण 3 या बाद के लिए एक पार्सर अगर इसे पार्स नहीं कर सकता है)।

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

01/12/12
13/12/12
99/12/12

जैसे तारीखों की सूची में

2012-01-12
2012-12-13
1999/12/12

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


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

1

मेरा UI अनुभव ज्यादातर डेस्कटॉप सिस्टम से आता है। वेब साइटें अलग हैं, हालांकि मैंने कुछ साइट्स देखी हैं जो डेस्कटॉप सिस्टम को चुनौती दे सकती हैं। लेकिन इसके लायक क्या है:

मैंने पाया है कि त्रुटि संदेश बहुत अंतिम उपाय होना चाहिए; एक आदर्श प्रणाली उन्हें बिल्कुल नहीं होती। सबसे अच्छी बात यह है कि पहली बार में खराब प्रविष्टियों की अनुमति न दें: उपयोगकर्ता महीनों के ड्रॉपडाउन सूची से चयन करने पर "ग्रीन" में प्रवेश नहीं कर सकता है। वह एक धूसर बाहर बटन धक्का नहीं कर सकते।

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

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


0

बयान इंटरनेट पर सूचना भेजने के बारे में है। इंटरनेट पर सूचना भेजने के साथ एक बात यह है कि हमेशा यह लक्ष्य को प्राप्त नहीं होगा या खंडित नहीं होगा।


0

कुछ ऐसा लगता है कि यहां चूक हुई है - विफलता के परिणाम क्या हैं?

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

दूसरी ओर, अगर यह एक Minuteman III के लक्ष्य के लिए पूछ रहा है तो आप "मास्को" को इनपुट के रूप में अस्वीकार करते हैं क्योंकि यह संभावित रूप से अस्पष्ट है।


यहां तक ​​कि अगर आप एक प्रोग्रामर हैं, और आपने कुछ बेवकूफ कोड लिखे हैं, तो सिस्टम को आगे बढ़ना चाहिए और कुछ दिखाने के लिए अपनी पूरी कोशिश करनी चाहिए, बजाय इसके कि "ओआई, आपने यहां (लाइन नंबर)" चिल्लाया है ? क्या आपको नहीं लगता कि यह वास्तव में अविश्वसनीय रूप से बुरा कोड है?
रोमन स्टार्कोव 20

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