मैं सी # के लिए making a jquery clone हूं। अभी मुझे यह स्थापित हो गया है कि प्रत्येक विधि IEnumerable<HtmlNode>
पर एक विस्तार विधि है, इसलिए यह मौजूदा परियोजनाओं के साथ अच्छी तरह से काम करती है जो पहले से ही HtmlAgilityPack
का उपयोग कर रहे हैं। मैंने सोचा कि मैं राज्य को संरक्षित किए बिना दूर जा सकता हूं ... हालांकि, मैंने देखा कि jQuery में दो विधियां .andSelf
और .end
हैं जो एक आंतरिक ढेर से हाल ही में मिलान किए गए तत्वों को "पॉप" करती हैं। यदि मैं अपनी कक्षा बदलता हूं तो मैं इस कार्यक्षमता की नकल कर सकता हूं ताकि यह हमेशा संख्याओं के बजाय SharpQuery ऑब्जेक्ट्स पर चल रहा हो, लेकिन अभी भी एक समस्या है।मेरे सी # jQuery एपीआई को कैसे डिज़ाइन किया जाए ताकि यह उपयोग करने में भ्रमित न हो?
जावास्क्रिप्ट के साथ, आपको स्वचालित रूप से एचटीएमएल दस्तावेज़ दिया जाता है, लेकिन सी # में काम करते समय आपको इसे स्पष्ट रूप से लोड करना होगा, और यदि आप चाहें तो एक से अधिक दस्तावेज़ों का उपयोग कर सकते हैं। ऐसा प्रतीत होता है कि जब आप $('xxx')
पर कॉल करते हैं तो आप अनिवार्य रूप से एक नई jQuery ऑब्जेक्ट बनाते हैं और खाली स्टैक के साथ ताजा शुरू करते हैं। सी # में, आप ऐसा नहीं करना चाहते हैं, क्योंकि आप वेब से दस्तावेज़ को पुनः लोड/रीफ्रैच नहीं करना चाहते हैं। तो इसके बजाय, आप इसे एक बार या तो SharpQuery ऑब्जेक्ट में लोड करते हैं, या HtmlNodes की सूची में लोड करते हैं (आपको प्रारंभ करने के लिए केवल दस्तावेज़ नोड की आवश्यकता होती है)।
jQuery डॉक्स में, वे इस उदाहरण
$('ul.first').find('.foo')
.css('background-color', 'red')
.end().find('.bar')
.css('background-color', 'green')
.end();
मैं, क्योंकि मैं ()
ऑपरेटर को ओवरलोड नहीं कर सकते एक प्रारंभकर्ता विधि की जरूरत नहीं है, इसलिए आप बस के बजाय sq.Find()
के साथ शुरू है, जो पर चल रही देना दस्तावेज की जड़, अनिवार्य रूप से एक ही काम कर रही है। लेकिन फिर लोग एक लाइन पर sq.Find()
को कोशिश करने और लिखने जा रहे हैं, और फिर sq.Find()
सड़क के नीचे कहीं और, (सही ढंग से) उम्मीद है कि यह दस्तावेज़ की जड़ पर फिर से काम करेगी ... लेकिन अगर मैं राज्य को बनाए रख रहा हूं, तो आप पहले कॉल के बाद संदर्भ में अभी संशोधित किया है।
तो ... मुझे अपना एपीआई कैसे डिजाइन करना चाहिए? क्या मैं एक और Init
विधि जोड़ता हूं जो सभी प्रश्नों को स्टाक को रीसेट करता है (लेकिन फिर मैं उन्हें कैसे शुरू करने के लिए मजबूर करता हूं?), या Reset()
जोड़ें कि उन्हें अपनी लाइन के अंत में कॉल करना होगा? क्या मैं इसके बजाय []
अधिभारित करता हूं और उन्हें इसके साथ शुरू करने के लिए कहता हूं? क्या मैं कहता हूं "इसे भूल जाओ, कोई भी उन राज्य-संरक्षित कार्यों का उपयोग नहीं करता है?"
असल में, आप उस jQuery उदाहरण को सी # में कैसे लिखना पसंद करेंगे?
sq["ul.first"].Find(".foo") ...
पतन: हनन[]
संपत्ति।sq.Init("ul.first").Find(".foo") ...
पतन: कुछ नहीं वास्तव में, Init साथ शुरू करने के लिए जब तक मैं कुछ अजीब "प्रारंभ" तंत्र जोड़ने प्रोग्रामर बलों; उपयोगकर्ता.Find
से शुरू करने का प्रयास कर सकता है और नतीजे प्राप्त करने वाला नतीजा प्राप्त नहीं कर सकता है। इसके अलावा,Init
औरFind
वैसे भी बहुत समान हैं, सिवाय इसके कि पूर्व स्टैक को रीसेट करता है।sq.Find("ul.first").Find(".foo") ... .ClearStack()
पतन: प्रोग्रामर ढेर स्पष्ट करने के लिए भूल सकते हैं।ऐसा नहीं कर सकता।
end()
लागू नहीं किया गया। दो अलग-अलग वस्तुओं
का प्रयोग करें।
शायद आधार है कि सभी प्रश्नों के साथ शुरू करना चाहिए, और उसके बाद हर विधि उसके बाद एकSharpQuery
उद्देश्य यह है कि श्रृंखलित जा सकती है, रिटर्न के रूप मेंHtmlDocument
का उपयोग करें। इस तरहHtmlDocument
हमेशा प्रारंभिक स्थिति को बनाए रखता है, लेकिनSharpQuery
ऑब्जेक्ट्स में अलग-अलग राज्य हो सकते हैं। दुर्भाग्य से इसका मतलब है कि मुझे दो बार सामानों का एक गुच्छा लागू करना है (एक बार HtmlDocument के लिए, एक बार SharpQuery ऑब्जेक्ट के लिए)।new SharpQuery(sq).Find("ul.first").Find(".foo") ...
निर्माता प्रतियां दस्तावेज़ के लिए एक संदर्भ है, लेकिन ढेर रीसेट करता है।
आईएमओ 5) सबसे अच्छा विकल्प है। यह निश्चित रूप से 'HtmlDocument' से शुरू होने वाले प्रश्नों के लिए पठनीय और सहज है, और डुप्लिकेट कार्य के लिए - उम्मीद है कि आप इसे कार्यान्वित कर सकते हैं ताकि केवल विधि हस्ताक्षर डुप्लिकेट किए जाएं, लेकिन वास्तविक तर्क नहीं। (कुछ सामान्य वर्गों को कॉल करना जो काम करता है।) मुझे विकल्प 1 भी पसंद है) और व्यक्तिगत रूप से इसे ब्रैकेट के "दुर्व्यवहार" के रूप में नहीं देखते हैं। :) –
@ किर्क: '[]' आम तौर पर 'ओ (1)' ऑपरेशन इंगित करता है ... जैसे डेटा पहले ही अनुक्रमित है। इस मामले में, इसे वास्तव में एक पूर्ण खोज करना है। – mpen
फिर भी, मैं अब (1) की तरफ झुका रहा हूं। असल में, मैंने इसे इस तरह कोडिंग करना शुरू कर दिया है। यह उपयोगकर्ताओं को 'फ़िंड()' के साथ सीधे कूदने से रोकता है क्योंकि संदर्भ तब तक सेट नहीं होता है जब तक वे '[] 'पर कॉल न करें। यानी, 'फिंड()' बस कुछ भी नहीं मिलेगा क्योंकि इसमें खोज करने के लिए कुछ भी नहीं है। '[]' दस्तावेज़ नोड को संदर्भ रीसेट करता है और फिर वे खोज शुरू कर सकते हैं। – mpen