क्या यह एक अच्छा मूल्य है कि एक विशेष मूल्य "एनम" एक एनम में है


11

मैं एक सूक्ष्म सेवा वातावरण में एक नई सेवा विकसित कर रहा हूं। यह एक REST सेवा है। सरलता के लिए, मान लें कि पथ है: / इतिहासपुस्तक

और इस पथ के लिए POST विधि एक नई इतिहास पुस्तक बनाती है।

मान लेते हैं कि एक इतिहास की पुस्तक इतिहास में एक या एक से अधिक युगों को शामिल करती है।

संक्षिप्तता के लिए, मान लें कि हमारे पास मानव इतिहास के केवल निम्नलिखित युग हैं:

  • प्राचीन
  • पोस्ट क्लासिकल
  • आधुनिक

मेरे कोड में, मैं उन्हें एक में प्रतिनिधित्व करना चाहूंगा enum

विधि का शरीर (पेलोड) JSON प्रारूप में है, और इसमें एक फ़ील्ड नाम शामिल होना चाहिए eras। यह फ़ील्ड eraमानों की एक सूची है , जिसमें यह पुस्तक शामिल है।

शरीर की तरह लग सकता है:

{
  "name": "From the cave to Einstein - a brief history review",
  "author": "Foo Bar",
  "eras": ["Ancient", "Post Classical", "Modern"]
}

इस विशिष्ट सेवा में, व्यापार तर्क है:
यदि कोई युग इनपुट में प्रदान नहीं किया गया है, तो इस पुस्तक को सभी युगों को कवर करने के लिए माना जाता है ।

एपीआई की समीक्षा में, एक सुझाव दिया गया था: युग एनम के लिए
एक और मूल्य शामिल करें ALL, स्पष्ट रूप से इंगित करने के लिए कि सभी युग कवर किए गए हैं।

मुझे लगता है कि इसके कुछ पेशेवरों और विपक्ष हैं।

पेशेवरों:

स्पष्ट इनपुट

विपक्ष:

यदि सूची में दो आइटम प्रदान किए गए हैं, तो कहें ALLऔर Ancient- आवेदन से क्या लिया जाएगा? मुझे लगता है कि ALLअन्य मूल्यों को ओवरराइड करना चाहिए, लेकिन यह नया व्यापार तर्क है।

यदि मैं विशिष्ट युग को कवर करने वाली पुस्तकों के लिए एक क्वेरी चलाता हूं, तो मैं उन पुस्तकों का प्रतिनिधित्व कैसे करूंगा जो सभी युगों को कवर करती हैं? तो ALLभी उत्पादन (एक ही तर्क का उपयोग करके) के लिए प्रयोग किया जाता है, तो यह व्याख्या करने के लिए उपभोक्ता की जिम्मेदारी है ALLके रूप में ["Ancient", "Post Classical", "Modern"]

मेरा प्रश्न

मुझे लगता है कि नया होने से ALLज्यादा भ्रम की स्थिति पैदा होती है।

तुम क्या सोचते हो? क्या आप इस ALLमान को जोड़ेंगे या इसके बिना अपना एपीआई रखेंगे?


7
यदि आप तय करते हैं कि आप परमाणु युग को जोड़ना चाहते हैं तो क्या होगा? क्या "सभी" युगों को कवर करने वाली किताबें जादुई रूप से नई सामग्री प्राप्त करती हैं? क्या आप किताबों की सामग्री के बारे में झूठ बोलना शुरू करते हैं? क्या आप सब कुछ अपडेट करते हैं? अगर कुछ किताबें वास्तव में पहले से ही परमाणु युग के बारे में सामग्री हैं, तो यह बहुत अच्छा हो सकता है।
8bittree

जवाबों:


13

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

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

टी एल; डॉ; ज्यादातर "सभी" एक यूआई निकिता है और आप सेवा स्तर पर एक ही चीज़ प्राप्त कर सकते हैं जिसमें कोई अस्पष्टता नहीं है इसलिए ऐसा न करें।


6

यदि इनपुट में कोई युग नहीं दिया गया है, तो इस पुस्तक को सभी युगों को कवर करने के लिए माना जाता है।

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

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


1

श्रेणीबद्ध चर के लिए, मैं एक ही स्तर पर "सभी" वाइल्डकार्ड डालने से बचूंगा।

ऐसा लगता है कि आपके पास समय-समय के लिए दो-स्तरीय खोज मानदंड हैं:

  1. बूलियन, is_selective?
  2. सेट, विशिष्ट श्रेणियों का विघटन

कॉलर निर्दिष्ट कर सकता है (गलत, अनदेखा) या (सही, {'प्राचीन', 'आधुनिक'})।

या आप वाइल्डकार्ड के रूप में खाली सेट की व्याख्या करना चुन सकते हैं, यह नॉट सिलेक्टिव को दर्शाता है।

आपके विशिष्ट मामले के लिए, ऐसा लगता है कि आपके पास एक निरंतर चर, वर्ष है, जो कुछ प्रसिद्ध मूल्यों के लिए विवेकाधीन है, और जो आप वास्तव में चाहते हैं वह अंतराल अंकगणित करना है। तो आपके प्रश्नों को वर्षों की एक (शुरू, अंत) सीमा स्वीकार होगी, और enums आसानी से इस तरह की विशेषताओं की आपूर्ति कर सकते हैं।


1

tl; dr
अपने वास्तविक प्रश्न के लिए - कार्यान्वयन में स्थानीय डेटा संरचनाओं के विषय में - मैं आपके निष्कर्ष से सहमत हूं: सभी युग विशेष मूल्य से बचें क्योंकि यह ज्यादातर जटिलता और गलतियाँ करने के अवसरों को जोड़ता है। हालांकि, विशेष रूप से अंतिम उपयोगकर्ता UI और शायद क्रमबद्ध पेलोड डेटा अलग-अलग कहानियां हो सकती हैं।

स्थानीय डेटा संरचनाएँ

आइए इसे एक प्रकार के सिस्टम के नजरिए से देखें। मूल रूप से एक एनम एक प्रकार है जो विशिष्ट श्रेणियों (एन्यूमरेटर्स) के एक अव्यवस्थित सेट को परिभाषित करता है, जैसा कि @JH द्वारा पहले से ही उत्तर में बताया गया है । एनम प्रकार का एक वैरिएबल उन श्रेणियों में से एक को धारण करता है। यदि आप प्रगणक मानों के संग्रह का प्रतिनिधित्व करना चाहते हैं, तो आपको दूसरे प्रकार की आवश्यकता है:

// C++-inspired pseudo-code
enum Era { ancient, post_classical, modern };
using Eras = Collection<Era>;

एक allएन्यूमरेटर एक नो-गो है क्योंकि यह उन दो प्रकारों को एक साथ पिघला देता है। यह एक एकल श्रेणी नहीं है, बल्कि सभी संभावित श्रेणियों का एक संग्रह है।

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

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

यदि सूची में दो आइटम प्रदान किए गए हैं, तो कहें कि सभी और प्राचीन - आवेदन से क्या लिया जाएगा? [...]

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

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

सीरियल डेटा (JSON)

मूल रूप से मेरे पास एक पूरा खंड था जिसमें बनाम केवल पढ़ने के लिए प्रश्नों और "eras"सूची के लिए अलग-अलग भूमिकाएँ थीं । लेकिन अंत में मैं इसे क्योंकि KISS नष्ट कर दिया। JSON डेटा के लिए enum / collection के नियम अनुचित नहीं हैं, इसलिए चीजों को लगातार रखना सबसे सरल उपाय है।

अंत उपयोगकर्ता के लिए यूआई

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


1

मुझे लगता है कि नया सब होने से भ्रम की स्थिति पैदा होती है।

हाँ।

यदि आप एक संग्रह के दृष्टिकोण से सोचते हैं: आपके पास किसी चीज़ का पूरा संग्रह है। और हर बार जब आप केवल उस संग्रह का एक सबसेट चाहते हैं, तो आपको किसी प्रकार का फ़िल्टर प्रदान करना होगा , जब किसी तत्व को इस सबसेट का तत्व माना जाता है। और ALLमामला है, जब कोई फ़िल्टर लागू नहीं होता है, न कि "फ़िल्टरकंडिशन ALL" होता है

यदि इनपुट में कोई युग नहीं दिया गया है, तो इस पुस्तक को सभी युगों को कवर करने के लिए माना जाता है।

मैं इसे उल्टा कर दूंगा: इस पुस्तक में कोई विशिष्ट युग नहीं है।

यह एक क्वेरी परिप्रेक्ष्य से भी सुसंगत है:

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

एकमात्र बिंदु, जहां मैं ALL- श्रेणी जोड़ूंगा, उपयोगकर्ता की सुविधा के लिए है, क्योंकि यह "सब कुछ" के बजाय "कुछ भी नहीं" चुने जाने से अधिक परेशान हो सकता है।


0

मैंने हाल ही में एक मूल अनुसूचक लागू किया है और जैसा कि @LoztInSpace ने पहले ही उल्लेख किया है कि यह UI चीनी है।

उपयोगकर्ता इंटरफ़ेस एक विकल्प का चयन करते समय उपयोगकर्ता क्या हासिल करेगा, इसमें बिल्कुल स्पष्ट होना चाहिए।

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

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

विकल्पों में से एक हिस्से का उपयोग न करें सब कुछ और एक ही समय में संघर्षों से बचने के लिए कुछ को बाहर करने के लिए और सुनिश्चित करें कि यूआई उपयोगकर्ता को समझ में आता है।

मुझे लगता है कि एक अच्छा अभिविन्यास है कि उपयोग करना और "ऑल" विकल्प समझ में आता है यदि उपयोगकर्ता अवधारणा को आसानी से समझ सकता है कि "ऑल" में क्या शामिल है (एक सप्ताह में सभी दिन) या यदि नहीं तो महत्वहीन है (अमेज़ॅन पर सभी श्रेणियों को खोजें)


0

मुझे स्पष्ट रूप से ALL enum ले जाने का विचार पसंद है, लेकिन मैं उन्हें झंडे के रूप में सेट करूँगा

const enum = {
    ALL: { value: 0 },
    ANCIENT: { name: 'Ancient', value: 1 },
    POST_CLASSICAL: { name: 'Post Classical', value: 2 },
    MODERN: { name: 'Modern', value: 4 }
}

जब सभी मूल्यों का चयन किया जाता है, तो एक पुस्तकालय जैसे कि फ्लैगन या मैन्युअल रूप से बिटवाइज़ ऑपरेशंस के साथ उपयोग करना।

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

हालाँकि, मेरे पास एक NON ध्वज होगा और ग्राहक को यह निर्णय लेने दें कि जब NON का उपयोग किया जाता है, तो बाद में व्यवसाय में क्या परिवर्तन होता है।

यदि यह क्रियान्वयन किया जाता है, तो चारों ओर के इंसन्स को पास करने के बजाय, आप इसके बजाय चयनित मानों का योग पास करेंगे।

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