प्रोटोबॉफ 3 ने संदेशों पर सभी क्षेत्रों को वैकल्पिक क्यों बनाया?


15

प्रोटोबॉफ़ के सिंटैक्स 3 ने सभी फ़ील्ड्स को कीवर्ड छोड़ने requiredऔर optionalपिछले प्रोटॉ 2 सिंटैक्स से वैकल्पिक बनाया । डेवलपर्स की कुछ टिप्पणियों को पढ़ने से ऐसा लगता है कि यह आगे / पिछड़े द्विआधारी संगतता को बढ़ाने के लिए किया गया था।

लेकिन मेरे लिए, कि पैकेज के नामों को केवल संस्करण के द्वारा लागू किया जा सकता है, कहते हैं com.example.messages.v1और फिर ग्राहकों को उनके द्वारा समझे जाने वाले डीसेरिएलाइज़र को लागू करने देते हैं। उसी समय यह एक प्रकार के रूप में बताए गए कुछ अनुबंधों को हटा देता है जो सॉफ्टवेयर इंजीनियरिंग दृष्टिकोण से उपयोगी होते हैं। उदाहरण के लिए अगर मेरे पास है

message Location {
   double latitude = 1;
   double longitude = 2;
}

प्रोटो 3 में एक आधा समर्थित बनाना संभव है, लेकिन Locationएक आवश्यक फ़ील्ड प्रदान नहीं करके पूरी तरह से वैध है।

क्या ग्राहकों के बीच डेटा के आदान-प्रदान के लिए स्कीमा आधारित क्रमांकन प्रारूप बनाते समय एक बड़ी कमी नहीं है? क्या प्रत्येक आवश्यक जाँच के लिए अतिरिक्त सत्यापन कोड को स्थानांतरित करना बुरा नहीं है कि सभी आवश्यक क्षेत्रों में मान्य मूल्य हैं?


जवाबों:


13

proto3 एक बनाता संख्या (मैं यह समझ के रूप में) यह कहीं अधिक पार मंच परिदृश्यों में प्रयोग करने योग्य बनाने के उद्देश्य से परिवर्तन की। "असाइन किया गया" बनाम "निर्दिष्ट नहीं" ट्रैक करना लेकिन डिफ़ॉल्ट मान की रिपोर्ट करना " कुछ लक्ष्य प्लेटफार्मों पर लागू करना बहुत कठिन हो सकता है, और उपयोग करने के लिए भ्रमित भी हो सकता है। इस प्रकार, प्रोटो 3 बहुत सरल दृष्टिकोण अपनाता है:

  • अंतर्निहित डिफ़ॉल्ट मान प्राकृतिक शून्य मान (संख्या / enums), झूठी (बूलियन्स) या रिक्त स्ट्रिंग है (तार)
  • केवल अंतर्निहित डिफ़ॉल्ट की अनुमति है; अन्य डिफ़ॉल्ट मानों की अनुमति नहीं है
  • यदि किसी फ़ील्ड में वह डिफ़ॉल्ट मान है, तो वह क्रमबद्ध नहीं है; इससे कोई फर्क नहीं पड़ता कि यह शून्य / गलत / खाली-स्ट्रिंग बनाम स्पष्ट रूप से सौंपा गया था या नहीं
  • इस वजह से, "आवश्यक" की कोई अवधारणा नहीं है, क्योंकि "स्पष्ट रूप से एक शून्य मान असाइन किया गया है" और "कभी भी एक मान निर्दिष्ट नहीं किया गया" समान देखें

प्रोटो 3 में एक आवश्यक फ़ील्ड प्रदान न करके एक आधा समर्थित लेकिन पूरी तरह से मान्य स्थान बनाना संभव है।

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

क्या प्रत्येक आवश्यक जाँच के लिए अतिरिक्त सत्यापन कोड को स्थानांतरित करना बुरा नहीं है कि सभी आवश्यक क्षेत्रों में मान्य मूल्य हैं?

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

क्या ग्राहकों के बीच डेटा के आदान-प्रदान के लिए स्कीमा आधारित क्रमांकन प्रारूप बनाते समय एक बड़ी कमी नहीं है?

आमतौर पर नहीं, नहीं ... खासकर जब से स्कीमा संस्करण स्पष्ट है। यदि आप proto2 का उपयोग करना चाहते हैं: proto2 का उपयोग करें। कुछ भी अपने आप नहीं बदलता।


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

1
@CodesInChaos दिलचस्प है, क्योंकि मैं स्कीमा-कम प्रोटोबोफ़ के लिए कर रहा हूँ ... अच्छी तरह से, हमेशा के लिए :) प्रोटोबुफ़-नेट में, यह उम्मीद है कि अधिकांश उपयोगकर्ता कोड-प्रथम और स्कीमा-कम होंगे। और दिलचस्प रूप से (मेरे लिए, कम से कम) अधिकांश "इसे सरल, बेवकूफ़ बनाये रखते हैं" डिफ़ॉल्ट रणनीतियाँ जो प्रोटोबोफ़-नेट का उपयोग करती हैं, ठीक उसी तरह की हैं जैसे कि प्रोटो 3 का उपयोग करने के लिए चुना गया। मैं दावा करता है कि यह मेरा यादृच्छिक पक्षपातपूर्ण निर्णय की पुष्टि करता है नहीं जा रहा हूँ, लेकिन ... यह पूरी तरह से करता है :)
मार्क Gravell

मैं एक C # वर्ग को एक प्रकार का स्कीमा मानता हूं और आप निश्चित रूप से विशेषताओं के माध्यम से डिफ़ॉल्ट मान निर्दिष्ट कर सकते हैं। उदाहरण के लिए msgpack या json के साथ इसका विरोध करें, जो किसी भी प्रकार के स्कीमा के बिना एक सार्थक डेटास्ट्रक्चर बना सकता है।
कोडइन्चौस

@CodesInChaos सहमति और कहा - और हाँ, Protobuf शुद्ध निरीक्षण और सम्मान करेंगे किसी भी तरह के घोषणाओं
मार्क Gravell
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.