2010-11-01 15 views
5

मैं एक जावा अनुप्रयोग में protobuff उपयोग करने के लिए क्रमबद्धता की सुविधा के लिए करना चाहते हैं और मैं गूगल वेब साइटजावा क्रमबद्धता

प्रोटोकॉल बफ़र और OO डिजाइन प्रोटोकॉल बफर कक्षाएं मूल रूप से कर रहे हैं से इस उद्धरण के बारे में प्रश्न है गूंगा डेटा धारक (जैसे सी ++ में structs); वे ऑब्जेक्ट मॉडल में पहले प्रथम श्रेणी नागरिक नहीं बनाते हैं। यदि आप जेनरेट क्लास में समृद्ध व्यवहार जोड़ना चाहते हैं, तो करने का सबसे अच्छा तरीका यह बफर क्लास को एप्लिकेशन-विशिष्ट क्लास में लपेटना है। आप .proto फ़ाइल के डिजाइन पर नियंत्रण नहीं है, तो (अगर, कहते हैं, यदि आप किसी अन्य परियोजना से एक पुन: उपयोग कर रहे हैं) रैपिंग प्रोटोकॉल बफ़र्स भी एक अच्छा विचार है। उस मामले में, आप आवरण वर्ग का उपयोग कर सकते एक इंटरफेस बेहतर आपके आवेदन की अनूठी पर्यावरण के लिए अनुकूल शिल्प के लिए: कुछ डेटा और तरीकों छुपा, सुविधा कार्यों को उजागर करने, आदि आप व्यवहार उत्पन्न करने के लिए जोड़ कभी नहीं करना चाहिए उनसे विरासत में कक्षाएं। यह आंतरिक तंत्र को तोड़ देगा और अच्छी वस्तु-उन्मुख अभ्यास वैसे भी नहीं है।

से: http://code.google.com/apis/protocolbuffers/docs/javatutorial.html

इसका क्या मतलब है जब यह बनाया वर्ग रैप करने के लिए कहते हैं?

+0

देखो, उर्फ ​​एडाप्टर http://en.wikipedia.org/wiki/Adapter_pattern – none

उत्तर

9

परिप्रेक्ष्य 1

आप एक .proto फ़ाइल लिख सकते हैं और यह protoc है कि बिल्डर कोड उत्पन्न दे। वे सुझाव दे रहे हैं कि जेनरेट कोड में कोई भी तरीका न जोड़ना। यदि आप जेनरेट कोड में कुछ कस्टम व्यवहार जोड़ना चाहते हैं तो जेनरेट कोड को अपने स्वयं के क्लास को लपेटें।

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

public class XmlToMyMessageBuilder 
{ 
private final MyMessageBuilder protoBuilder; 

public MyMessage fromXml(byte[] input() 
{ 
protoBuilder.setXXX(); 
} 
} 

यह एक सामान्य अच्छा प्रोग्रामिंग सिद्धांत है।

परिप्रेक्ष्य 2

एक मध्यस्थ तुम भी अंतर्निहित क्रमांकन तंत्र से अपने कोड दसगुणा कर सकते हैं प्रदान करके। यह आपको धारावाहिक कार्यान्वयन स्विच करने की अनुमति देता है (कहें कि आप एक पेलोड को क्रमबद्ध करना चाहते हैं जहां सभी डेटा स्ट्रिंग प्रारूप में है ... जहां कम प्रभाव के साथ संपीड़न के साथ JSON seriazation एक बेहतर विकल्प है)। आप इस

public interface MySerializer 
{ 
boolean serialize(MyDomainObject input); 
} 

public PBBasedSerializer implements MySerializer 
{ 
private final MyMessageBuilder protoBuilder; 
... 
} 

public JsonBasedSerializer implements MySerializer 
{ 
private final JSONSerializer jsonSerializer; 
... 
} 
-1

की तरह कुछ इसका क्या मतलब है जब यह बनाया वर्ग रैप करने के लिए कहते हैं कर सकता है?

वे आपको एक कक्षा सौंप रहे हैं, जो आप कर रहे हैं उसके लिए बनाए गए बाल वर्ग के उद्देश्य से इसे लपेटें। पुस्तकालय से कच्चे वर्ग के उदाहरण के साथ बातचीत मत करो।

+0

@Bill: मुझे आपत्ति है। मास्टर वू उत्तर वास्तव में बल्कि अंतर्दृष्टिपूर्ण और सामयिक थे। (और साथ ही मनोरंजक) वे के रूप में एक ज़ेन कला प्रोग्रामिंग के उपचार (के रूप में यह होना चाहिए) से संपर्क किया, के बजाय "wahts तेह codez?" जो अक्सर एसओ पर होता है। – abelenky

+2

@abelenky: बहुत से लोग असहमत हैं। मेरे द्वारा हटाए गए उत्तरों में से कोई भी वास्तव में एक प्रश्न का उत्तर नहीं दिया। एसओ पर यहां सिर्फ "मनोरंजक" की तुलना में हमारे पास उच्च मानक है। यदि यह सिर्फ एक या दो जवाब था तो शायद यह उड़ जाएगा, लेकिन यह वास्तव में एक नवीनता खाते के लिए जगह नहीं है जो किसी उद्देश्य का कार्य नहीं करता है। –

+2

@abelenky: इसके अलावा, ध्वज में संकोच न करें "तेह codez wahts?" हटाने के लिए स्टाइल प्रश्न भी। –

3

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

प्रोटोकॉल बफर कक्षाएं .proto फ़ाइलों से उत्पन्न कर रहे हैं। इन जेनरेट किए गए वर्गों में उनके पास मौजूद फ़ील्ड में सीधे हेरफेर करने के सभी तरीके होते हैं। लेकिन उनके पास ऐसी विधियां नहीं हैं जो एक क्षेत्र को संशोधित करने से उच्च स्तर के संचालन की सेवा करती हैं।

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

+0

वैसे जेनरेट किए गए संदेश अपरिवर्तनीय हैं इसलिए हम फ़ील्ड को नहीं बदल सकते हैं, क्या हम कर सकते हैं? –

+0

यह सामग्री को संशोधित करना चाहते हैं, इसके बजाय बिल्डरों का उपयोग करें। – MForster

संबंधित मुद्दे