"सब कुछ ठीक करें" डिज़ाइन पैटर्न क्या है?


74

2003 में linuxdevcenter.com पर स्टीफन फिगर्स के इस लेख में , ब्रैम कोहेन के बिटटोरेंट को "फिक्स एवरीथिंग" डिज़ाइन पैटर्न का उपयोग करने के रूप में वर्णित किया गया है।

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

यह उसके चेहरे पर काफी अच्छा लगता है।

हालांकि, यह मुझे लगता है कि एक आदर्शवादी "सब कुछ ठीक करें" फ़ंक्शन को कॉल करने से दक्षता की कीमत पर सिस्टम की मजबूती में सुधार होगा और संभावित रूप से युक्त सिस्टम को खराब कर देगा (जो प्रक्रियाओं को सावधानीपूर्वक योजना बना सकता है और निष्पादित कर सकता है।)।

मैं यह नहीं कह सकता कि मैंने इसे पहले इस्तेमाल किया है, हालांकि। मुझे उनके ऑनलाइन आवेदन का स्रोत भी नहीं मिल रहा है (लेकिन मुझे यह वही मिला जो इस पर आधारित होने का दावा करता है।)। न ही मुझे इस लेख के बाहर इसका संदर्भ मिल सकता है (और मैं अपने google-fu को बहुत अच्छा मानता हूं) लेकिन मुझे SOApatterns.org पर "Idempotent Capability" के लिए एक प्रविष्टि मिली

क्या इस विचार को दूसरे नाम से जाना जाता है?

"सब कुछ ठीक करें" डिज़ाइन पैटर्न क्या है? इसके पेशेवरों और विपक्ष क्या हैं?


4
मुझे संदेह है कि नाम किसी फ़ंक्शन के निश्चित बिंदु के विचार का संदर्भ भी है, x = f (x)। कोई फर्क नहीं पड़ता कि आप कितनी बार एफ से एक्स लागू करते हैं , परिणाम समान है। एक बार जब आप सही परिणाम प्राप्त कर लेते हैं, तो सही परिणाम को पुन: संसाधित करके वही सही परिणाम देता है।
9000

7
ध्यान दें कि कोई भी व्यक्ति अपने इच्छित किसी भी नाम को दे सकता है, लेकिन यह एक प्रसिद्ध सॉफ्टवेयर पैटर्न नहीं बनाता है। Idempotency अपने आप में एक प्रसिद्ध अवधारणा है; ऐसा लगता है कि यह रचनात्मक रूप से यहां उपयोग किया जा रहा है।
रॉबर्ट हार्वे

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

3
This sounds quite nice on the face of it. वास्तव में? यह मुझे भयानक लगता है!
माइकल

3
@ मिचेल आपको पैकेज मैनेजर पसंद नहीं हैं? वे एक ही अवधारणा के आधार पर काम करते हैं, बस एक छोटे पैमाने पर: मार्क जिसे आप देखना चाहते हैं, "सब कुछ ठीक करें" को चलाने के लिए सिस्टम को चिह्नित करें, यह उपयुक्त के रूप में इंस्टॉल / अपग्रेड / अपग्रेड करता है, लेकिन बदलाव होने पर ही कुछ करना पड़ता है।
इज़्काता

जवाबों:


100

मान लें कि आपके पास एक HTML पृष्ठ है जो काफी जटिल है - यदि आप एक ड्रॉपडाउन में कुछ लेते हैं, तो दूसरा नियंत्रण दिखाई दे सकता है, या तीसरे नियंत्रण में मान बदल सकते हैं। वहाँ दो तरीके आप इस दृष्टिकोण सकता है:

  1. प्रत्येक नियंत्रण के लिए एक अलग हैंडलर लिखें, जो उस नियंत्रण की घटनाओं पर प्रतिक्रिया करता है, और आवश्यकतानुसार अन्य नियंत्रणों को अद्यतन करता है।

  2. एक भी हैंडलर लिखें जो पेज पर सभी नियंत्रणों की स्थिति को देखता है और सब कुछ ठीक करता है

दूसरी कॉल "बेकार" है क्योंकि आप इसे बार-बार कॉल कर सकते हैं और नियंत्रण हमेशा ठीक से व्यवस्थित होंगे। जबकि पहले कॉल (ओं) में समस्या हो सकती है यदि कॉल खो जाता है या दोहराया जाता है, उदाहरण के लिए यदि हैंडलर में से कोई एक टॉगल करता है।

दूसरे कॉल के लिए तर्क थोड़ा और अस्पष्ट होगा, लेकिन आपको केवल एक हैंडलर लिखना होगा।

और आप हमेशा दोनों समाधानों का उपयोग कर सकते हैं, "बस सब कुछ ठीक करने के लिए" फ़ंक्शन को "सुरक्षित पक्ष पर होना चाहिए" कहते हुए।

दूसरा दृष्टिकोण विशेष रूप से अच्छा है जब राज्य विभिन्न स्रोतों से आ सकता है, जैसे उपयोगकर्ता इनपुट बनाम सर्वर से प्रदान किया गया। ASP.NET में, तकनीक पोस्टबैक की अवधारणा के साथ बहुत अच्छी तरह से खेलती है क्योंकि जब भी आप पृष्ठ को प्रस्तुत करते हैं, तो आप सब कुछ ठीक करते हैं।

अब जब मैंने घटनाओं के खो जाने या बार-बार होने और अलग-अलग स्रोतों से राज्य प्राप्त करने का उल्लेख किया है, तो मैं सोच रहा हूं कि यह स्पष्ट है कि यह दृष्टिकोण बिटटोरेंट जैसी समस्या वाले स्थान पर कितना अच्छा है।

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


9
यह मुझे लगता है कि एमवीसी "फिक्स एवरीथिंग" की खासियत है: जब आप मॉडल को संशोधित करते हैं तब स्क्रैच से दृश्य को फिर से खोलते हैं, तो दृश्य को पूरी तरह से फिर से परिभाषित किया जाता है, परमात्मा के प्रयास के बिना कि क्या कार्रवाई संभावित रूप से प्रभावित हो सकती है।
Matthieu M.

3
यह अनिवार्य रूप से साल्टस्टैक, अन्सिबल और निक्स जैसी प्रणालियों के पीछे के सिद्धांत की तरह लगता है। कॉन्फ़िगरेशन के विवरण को देखते हुए, आप सैद्धांतिक रूप से कई विविध प्रणालियों को एक ही अंत स्थिति में ला सकते हैं।
कोजिरो

1
@MatthieuM। रिएक्ट डेवलपमेंट पर काफी लोकप्रिय है, रिएक्ट ऐसा है कि इसके अलावा वर्चुअल डोम को अलग करता है, इसलिए यह वास्तविक डोम को वास्तविक बदलावों से अपडेट करता है
इज़्काटा

2
@ इज़्काता प्रतिक्रिया से भी अधिक, इस जवाब ने मुझे Redux के बारे में सोचने पर मजबूर कर दिया।
केविन

2
यह इंगित करने के लिए उपयोगी हो सकता है कि "सब कुछ ठीक करें" और बेरोजगार अलग-अलग चीजें हैं: "सब कुछ ठीक करें" आमतौर पर उदासीन (लेकिन इसकी आवश्यकता नहीं है), और बेरोजगार संचालन को सब कुछ ठीक करने की आवश्यकता नहीं है या यहां तक ​​कि एक प्रदर्शन भी है जुर्माना - बस दो बार निष्पादित होने पर एक ही परिणाम दें।
हंस-पीटर स्टॉर

15

मुझे लगता है कि लेख थोड़ा दिनांकित है क्योंकि जैसा कि मैंने पढ़ा है, यह वास्तव में एक अपरंपरागत या नया विचार नहीं है। इस विचार को एक अलग पैटर्न के रूप में प्रस्तुत किया जाता है जब यह वास्तव में सिर्फ एक साधारण पर्यवेक्षक कार्यान्वयन होता है। उस समय जो मैं कर रहा था, उसके बारे में सोचते हुए, मुझे याद है कि कुछ अलग-अलग पैनलों के साथ कुछ जटिल इंटरफेस के पीछे बैठने के लिए तर्क पर काम करना, जो कि अन्योन्याश्रित थे। उपयोगकर्ता मान बदल सकता है और / या एक अनुकूलन दिनचर्या चला सकता है और उन कार्यों के आधार पर, ऐसी घटनाओं को उत्पन्न किया गया था कि यूआई आवश्यकतानुसार सुनेंगे और अपडेट करेंगे। विकास के दौरान कई मुद्दे थे जहां कुछ पैनल को अपडेट नहीं करना चाहिए था। फिक्स (डिजाइन के भीतर रहना) अन्य घटनाओं से घटनाओं को उत्पन्न करना था। अंततः, जब तक सब कुछ सही काम कर रहा था, लगभग सभी परिवर्तनों के परिणामस्वरूप सभी पैनल ताज़ा हो गए। जब किसी दिए गए पैनल को रिफ्रेश करने की आवश्यकता होती है, तो अलग करने की कोशिश की सारी जटिलता शून्य के लिए थी। और यह वैसे भी कोई फर्क नहीं पड़ा। यह प्रभावी रूप से एक समयपूर्व अनुकूलन था। मैं समय और प्रयास की एक टन बचाया होगा बस एक ही घटना है कि सब कुछ ताज़ा में यह सब ढह कर।

"सब कुछ ठीक करें" या हर तरह से ताज़ा करने के लिए डिज़ाइन किए गए असंख्य सिस्टम हैं। उन सभी CRUD इंटरफेस के बारे में सोचें जो एक पंक्ति को जोड़ते / अद्यतन करते हैं और फिर DB की आवश्यकता होती है। यह एक विदेशी दृष्टिकोण नहीं है, यह सिर्फ स्पष्ट गैर-चालाक समाधान है। आपको महसूस करना होगा कि 2003 में, यह 'पैटर्न फीवर' की ऊंचाई थी। मैं जो बता सकता था उससे, लोगों ने सोचा कि नए पैटर्न का नामकरण उनकी प्रसिद्धि और धन के लिए होने जा रहा है। मुझे गलत मत समझो, मुझे लगता है कि एक पैटर्न की अवधारणा सार में समाधान का वर्णन करने के लिए एक अत्यंत उपयोगी है। चीजें बस तरह से बंद रेल थोड़ा चला गया। यह दुर्भाग्यपूर्ण है क्योंकि इसने सामान्य तौर पर पैटर्न की अवधारणा के बारे में बहुत अधिक सनक पैदा की। यह केवल इस संदर्भ में है कि यह 'अपरंपरागत' समाधान के रूप में इस बारे में बात करने के लिए समझ में आता है। यह ORMs या DI कंटेनरों के आसपास रूढ़िवादी के समान है। इनका उपयोग न करने को अपरंपरागत के रूप में देखा जाता है भले ही लोग इन उपकरणों के अस्तित्व में आने से बहुत पहले ही सॉफ्टवेयर का निर्माण कर रहे थे और कई मामलों में वे उपकरण ओवरकिल हो गए थे।

तो वापस 'सब कुछ ठीक'। एक सरल उदाहरण है गणना के साधनों का। सरल समाधान संख्याओं को जोड़ना और मूल्यों की कार्डिनैलिटी द्वारा विभाजित करना है। यदि आप किसी संख्या को जोड़ते या संशोधित करते हैं, तो आप इसे शुरू से ही फिर से करते हैं। आप योग और संख्याओं की संख्या पर नज़र रख सकते हैं और जब कोई संख्या जोड़ता है, तो आप गिनती बढ़ाते हैं और इसे जोड़ देते हैं। अब आप फिर से सभी नंबरों को दोबारा नहीं जोड़ रहे हैं। यदि आपने कभी एक्सेल के साथ एक सूत्र के साथ काम किया है जो एक सीमा का संदर्भ देता है और उस सीमा में एक मान को संशोधित करता है, तो आपके पास 'सब कुछ ठीक करें' पैटर्न का उदाहरण है या उस सीमा का संदर्भ देने वाले किसी भी सूत्र की परवाह किए बिना पुनर्गणना होगी। यह मान प्रासंगिक था (जैसे कि समिफ़ () जैसे कुछ का उपयोग करके)।

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

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


2
मुझे पूरा यकीन है कि एक्सेल केवल उन पुनर्गणना कोशिकाओं का इरादा रखता है जो परिवर्तनों पर निर्भर हैं, यही वजह है कि पुनर्गणना के लिए सभी कोशिकाओं को ट्रिगर करने का एक तरीका है: superuser.com/questions/448376/ ... (जो मुझे लगता है कि "सब कुछ ठीक करेगा" )
हारून हॉल

@AaronHall यदि ऐसा होता है, तो यह वास्तव में खराब कार्यान्वयन है। मैं नियमित रूप से यह देखता हूं कि 60,000 कोशिकाओं की गणना के लिए 15-30 मिनट के लिए 7 सीपीयू का 100% खपत करता है। गणना जटिल नहीं हैं। मैंने अक्सर पायथन प्रोग्राम लिखे हैं जो पायथन शुरू करने सहित कुछ सेकंड में शीट में सब कुछ कर सकते हैं। यह मेरा सबसे अच्छा अनुमान था कि यह इतना लंबा समय कैसे ले सकता है। यह कुछ और हो सकता है मुझे लगता है। एक्सेल में बहुत सारे पुराने कीड़े हैं जो उस विशेषता का कारण हो सकते हैं।
जिमीजम्स

1
@AaronHall यह उस उपयोगकर्ता के साथ भी संभव है कि शीट पर ऑटो-गणना अक्षम थी। मैं अक्सर बड़ी वर्कबुक पर ऐसा करता हूं क्योंकि मेरे पास हर बार एंट्री मारने के लिए 15 मिनट भी नहीं बचते।
जिम्मीजम्स

@AaronHall मैंने कुछ और सोचा और आपके पास एक बिंदु है। मेरी धारणाएँ संभवतः व्यापक थीं। मैंने अपने जवाब को और अधिक ध्यान केंद्रित किया, जिस पर मुझे अधिक विश्वास है।
जिमीजम्स

2
@ जिमीजैम: मेरा मतलब यह है कि सबसे अच्छा तरीका परिस्थितियों के आधार पर बहुत भिन्न हो सकता है, और "सब कुछ ठीक करें" को "प्रत्येक व्यक्तिगत परिवर्तन पर उत्सुकता से सब कुछ ठीक करने" में विभाजित किया जा सकता है और सभी परिवर्तनों को पूरा करने के लिए "आलसी सब कुछ ठीक करें" "।
सुपरकाट

4

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

वे समाधान आमतौर पर सिस्टम प्रबंधन स्तर पर संचालित होते हैं, न कि व्यावसायिक तर्क स्तर, जैसा कि सवाल बताता है, लेकिन यह प्रभावी रूप से एक ही प्रतिमान है, और यद्यपि ऐसे उपकरण आमतौर पर प्रकृति में घोषित होते हैं, वही सिद्धांत प्रक्रियात्मक कोड या स्क्रिप्टिंग में लागू किए जा सकते हैं।


1

मैंने ज्यादातर यूजर इंटरफेस के भीतर इसका इस्तेमाल किया है। अच्छी बात यह है कि आप इसे एक बार लिखते हैं, और यह सरलतम से कठिनतम मामले तक सब कुछ समान रूप से अच्छी तरह से संभालता है (उदाहरण के लिए यदि उपयोगकर्ता स्क्रीन को घुमाता है, या लैपटॉप / डेस्कटॉप पर अगर उपयोगकर्ता एक खिड़की का आकार बदलता है, और लगभग सब कुछ बदल जाता है )।

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


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.