2012-02-15 6 views
18

मेरे पास एक अन्य धागे में mini-discussion on the topic है, और विषयों के "खराब" पक्षों पर लोगों का इनपुट करना चाहते हैं।आरएक्स विषय - क्या उन्हें टाला जा सकता है?

जो लोग आरएक्स मंच को अक्सर देखते हैं उन्हें पता है कि E.Meijer does not like Subjects। जबकि मुझे आरएक्स निर्माता की राय का गहराई से सम्मान है, मैं कुछ वर्षों से कई परियोजनाओं में विषयों का व्यापक रूप से उपयोग कर रहा हूं और उनमें से कोई वास्तुशिल्प समस्या या बग नहीं है।

विषयों के साथ एकमात्र "pitfall" नाम का नाम यह है कि वे "पुन: प्रयोज्य" नहीं हैं - एक विषय पर एक अवलोकन करने के बाद, आपको इसे फिर से चालू करने की आवश्यकता है, इससे पहले कि नए ग्राहक इससे घटनाएं प्राप्त कर सकें।

"कोड गंध" और "उन्हें पसंद नहीं है" को "व्यावहारिक" उदाहरणों द्वारा समर्थित करने की आवश्यकता है - क्या आप किसी विषय का उपयोग करते समय संभावित स्थितियों पर ध्यान दे सकते हैं जिससे कोई बग या समस्या हो सकती है? या शायद आपको लगता है कि वे आसानी से आसान और हानिरहित हैं - फिर उस क्षेत्र को परिभाषित करने का प्रयास करें जहां उनका उपयोग किया जाना है।

उत्तर

22

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

हालांकि! जब आप .NET की गैर-कार्यात्मक दुनिया के साथ इंटरफेसिंग कर रहे हों तो विषय बेहद उपयोगी है। एक घटना या कॉलबैक विधि लपेटना? इसके लिए विषय बहुत अच्छे हैं। कुछ मौजूदा कोड पर आरएक्स "इंटरफ़ेस" डालने का प्रयास कर रहे हैं? विषय का प्रयोग करें!

+3

उचित लगता है। सिवाय इसके कि मैं सुझाव दूंगा कि आयोजनों को लपेटने के पहले से ही तरीके हैं यानी अवलोकनयोग्य। फ्रॉमवेन्ट (पैटर्न) जो कि विषयों के लिए फिर से बेहतर है। –

+2

मुझे विश्वास है कि वह सिर्फ घटनाओं और एसिंक कॉल को लपेटने का मतलब नहीं है, बल्कि उनसे डेटा का उपयोग कर रहा है। उदाहरण के लिए, async कॉल की 'BeginRead' /' EndRead' जोड़ी को लपेटना - 'EndRead' केवल' BeginRead' में उत्परिवर्तनीय बाइट सरणी को पार करने के लिए वास्तविक डेटा प्राप्त करने के लिए, बाइट्स पढ़ने की संख्या देता है। – Tyson

+0

अच्छा स्पष्टीकरण। – axel22

2

मैं Subject/Publish का उपयोग करता हूं जब भी प्रतिक्रियाशील संयोजक आलसी eval के कारण डुप्लीकेट किया जा रहा है।

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

मुझे लगता है कि यह उन पर्यवेक्षकों के लिए भी क्लीनर है जो आप जानते हैं परिभाषा से गर्म हैं।

6

ऐसा लगता है कि बहुत से टिप्पणीकर्ता एक-दूसरे से बात कर रहे हैं।

पिछली बार जब मैंने एक विषय का उपयोग किया था तो मुझे प्रारंभिक कॉल में एक मिडलवेयर में एक प्रतिनिधि को पास करने की आवश्यकता थी, इसलिए कुछ हुआ जब यह मुझे वापस कॉल कर सकता था। प्रतिनिधि के पास परिचित घटना हस्ताक्षर का तर्क था, लेकिन मैं FromEvent का उपयोग नहीं कर सका क्योंकि कोई घटना नहीं थी।

मुझे इसके बारे में बुरा नहीं लगा - मुझे कोई अन्य विकल्प नहीं मिला।

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

+0

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

1

एक कारण यह है कि मैं सार्वजनिक एपीआई के हिस्से के रूप में Subject<T> का उपयोग करने से सावधान रहूंगा कि यह चिंताओं को मिश्रित करता है; एक पर्यवेक्षक एक चिंताओं को देखने योग्य से अलग है।

क्या कुछ miscreant पर्यवेक्षक कॉल Subject<T> पर OnNext या OnCompleted या OnError जहां उसे तभी पर्यवेक्षक होना चाहिए था?

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

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