“मेरा प्रकाश एक दर्पण है! - कहते हैं, मुझे अपना दोहरी दिखाओ ... ": एक अच्छा ढांचा डिजाइन करें और उपहार के रूप में दूसरा प्राप्त करें

प्राचीन मंदिरों के पत्थर बात करना जानते हैं, लेकिन बहुत कम लोगों ने उन्हें ध्यान दिया। ब्रह्मांड ध्वनियों से भरा हुआ है जिसे हम मनुष्य नहीं सुनते हैं; ऐसे रंग जिन्हें हम नहीं देखते हैं: कभी-कभी यह शरीर और आत्मा की वस्तुनिष्ठ सीमाएँ होती हैं, लेकिन इसके व्यक्तिपरक कारण भी होते हैं - ज्ञान और कौशल की कमी या रोज़मर्रा के व्यवहार में इनका उपयोग करने में असमर्थता। प्रोग्रामिंग की दुनिया में दूसरे का एक ज्वलंत उदाहरण - फ़ंक्शन हस्ताक्षर। OO दुनिया के बच्चे इंटरफेस में सबसे अच्छे से सोचते हैं - यह करीब है, लेकिन "बिलकुल नहीं है" और जितना ध्यान से आप बनते हैं, उतना ही यह "बिल्कुल नहीं" में बदल जाता है। और फंक्शन सिग्नेचर भी जानते हैं कि कैसे बात करनी है।

ईमानदारी से, मैं वास्तव में उच्च-स्तरीय अमूर्तताओं की ओर से शुरू करना चाहूंगा, लेकिन मेरा पिछला अनुभव बताता है कि गैर-गणितीय भाषा में सबसे सरल गणितीय सत्य "ध्वनि मत करो"। बस गुजरने में, मैं ध्यान देता हूं कि मैं जिस चीज के बारे में बात कर रहा हूं वह गणितीय विचार से पैदा हुई है - और, तदनुसार, कड़ाई से औपचारिक रूप दिया जा सकता है।
और अब - बारीकियों। संभवतः कमोबेश सभी "रूम्मगेजिंग" गोफ़ के युगांतरकारी काम को कम से कम एक बार पढ़ने के लिए परेशान करते हैं; शायद "नॉन-स्टिकिंग" वाले भी जानते हैं कि इस तरह का एक पैटर्न है - पुनरावृत्त। और निश्चित रूप से हर कोई हर दिन इसका उपयोग करता है। तो (सशर्त C # पर पकड़):

bool MoveNext(); T Current { get; } 

... और अब एक ही बात है, लेकिन बिना सिंटैक्टिक शोर (यह संकेत देता है कि वास्तव में "सिंटैक्टिक शोर के बिना" का अर्थ हैसेल में है):

 MoveNext :: () -> Bool Current :: () -> t 

... कुछ समय के लिए प्रकारों के बारे में भूलकर और तीर (->) पर ध्यान केंद्रित करते हुए, आप अनजाने में इस सवाल पर आते हैं कि अगर यह "उलटा" होगा तो क्या होगा? फिर यह पता चला:

 MoveNext' :: Bool -> () Current' :: t -> () 

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

 completed :: () -> () next :: t -> () 

क्या कुछ भी समान नहीं है? प्रतिक्रियाशील एक्सटेंशन के बारे में क्या?
वाह! एक (लगभग) शांत (मिनी) ढांचे के कार्य के हस्ताक्षर (अच्छी तरह से, अधिक सटीक, हस्ताक्षर, लेकिन दृष्टिकोण स्वयं एक व्यक्तिगत स्तर पर काम करता है) ने हमें एक और कम शांत, सही के बारे में बताया? आपको बस सावधान रहने और सुनने की जरूरत है।

श्रेणी सिद्धांत से दुनिया के लिए अच्छी खबर है
जो विषय में, निश्चित रूप से, जानता है कि IEnumerator <-> IObserver के साथ उदाहरण नया नहीं है।
यह आश्चर्य की बात है कि शायद ही किसी को पता है कि यह एकमात्र उदाहरण से दूर है (हालांकि हमें श्रद्धांजलि देनी चाहिए, विशेष रूप से यह बहुत उज्ज्वल है)।

जिज्ञासु शेष GoF पैटर्न ले सकते हैं और अपने दोहरे को देख सकते हैं। अक्सर पूर्ण बकवास निकल जाएगी - यह सामान्य है: अपने आप में, "द्वंद्व" सांसारिक दुनिया से अधिक है और खुद को व्यावहारिक उपयोग के साथ विचार करने के लिए बाध्य नहीं मानता है: लेकिन आखिरकार, सूर्य को भी चमकने के लिए लोगों से कुछ भी नहीं चाहिए।

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

सारांशित करने के लिए बेहतर, पूरी तरह से मेरे अनुभव के आधार पर:

  1. फ़ंक्शन हस्ताक्षर बोल सकते हैं, लेकिन प्रोग्रामर अक्सर बहरे होते हैं।
  2. हर बार जब आप एक अच्छी तरह से डिज़ाइन किए गए फ़ंक्शन को पूरा करते हैं, तो अपने आप से पूछें कि इसका दोहरी क्या है और क्या यह किसी भी कार्य के लिए उपयोगी हो सकता है।
  3. यदि एक दोहरे अस्तित्व में है, लेकिन ऊपर के उदाहरण में "मामूली संशोधन" की आवश्यकता है, तो सबसे अधिक संभावना है कि मूल हस्ताक्षर में कुछ निहित दोष हैं; शायद यह इसे फिर से परिभाषित करने के लिए समझ में आता है ताकि ऐसी कोई समस्या न हो?

Source: https://habr.com/ru/post/hi437520/


All Articles