डिजाइनिंग इंटरफेस और एसिंक्स


9

मान लीजिए कि मैंने इस IFolderRepositoryतरह के तरीकों के साथ इंटरफ़ेस बनाया है:

IEnumerable<Folder> GetAllFolders();
Folder GetFolderWithId(int id);
void AddFolder(Folder newFolder);
void ModifyFolder(Folder folderToModify, Folder folderAfterModification);
void RemoveFolder(Folder folderToRemove);

और मैंने लागू किया है DatabaseFolderRepositoryऔर कहता हूं CacheFolderRepositoryDecorator। अब Now सैकड़ों लाइनें बाद में ’मैं चाहूंगा कि मैं स्काईड्राइव फ़ोल्डर्स को जोड़ दूं, इसलिए मैं जोड़ने के लिए तैयार हूं SkyDriveFolderRepository। दुर्भाग्य से जब DatabaseFolderRepositoryकार्यान्वयन डेटाबेस के साथ बात करने के लिए सिंक्रोनस विधियों का उपयोग करता था, तो स्काइड्राइव एक asyncऔर बहुत का उपयोग करता है await। ऐसे मामले में क्या करना है? शून्य विधियों के मामले में, यह async को चिह्नित करना एक समाधान नहीं है (अपवाद को संभालने की आवश्यकता है)। क्या मुझे लौटने के लिए इंटरफ़ेस बदलना चाहिए Task<T>? यकीन है कि यह उपरोक्त उदाहरण में काम करेगा लेकिन वे सिर्फ 2 इंटरफ़ेस कार्यान्वयन कक्षाएं हैं। या मेरे अधिकांश इंटरफेस में Taskवापसी के प्रकार हैं (क्योंकि आपको नियम की आवश्यकता नहीं है)?


आपके प्रश्न (खेद) से संबंधित नहीं है, लेकिन यदि आपके पास एक IFolderइंटरफ़ेस है, तो आप Folderअपने सभी तरीकों में ठोस कार्यान्वयन ( ) पर निर्भर क्यों हैं ?
कोनराड मोरावस्की

1
आपके कॉलर को क्या उम्मीद है? क्या एपीआई आप त्रुटि कोड, अपवाद, कॉलबैक या क्या पर आधारित है? क्या आप इसे बदल सकते हैं?
david.pfx

@KonradMorawski यह टाइपो-त्रुटि था - क्षमा करें। यह अपवादों पर आधारित है और मैं इसे बदल नहीं सकता।
fex

जवाबों:


10

आप शायद एक अच्छा पढ़ने के लिए एसिंक्रोनस प्रथाओं के बारे में इस एमएसडीएन लेख को पाएंगे ।

तुम ने पूछा था:

दुर्भाग्य से जब DatabaseFolderRepositoryकार्यान्वयन डेटाबेस के साथ बात करने के लिए सिंक्रोनस विधियों का उपयोग करता था, तो स्काईड्राइव एक asyncऔर बहुत का उपयोग करता है await

यह वह जगह है जहां Async All the Wayएमएसडीएन लेख में उप-अनुभाग जुड़ा हुआ है जो आपकी स्थिति के अनुसार उचित होगा।

विशेष रूप से, यह आमतौर पर टास्क.इट या टास्क.सेल्ट को कॉल करके async कोड को ब्लॉक करने के लिए एक बुरा विचार है। यह प्रोग्रामर के लिए एक विशेष रूप से आम समस्या है जो अतुल्यकालिक प्रोग्रामिंग में "अपने पैर की उंगलियों को डुबो रहे हैं", अपने आवेदन के बस एक छोटे से हिस्से को परिवर्तित करते हैं और इसे एक तुल्यकालिक एपीआई में लपेटते हैं ताकि बाकी एप्लिकेशन परिवर्तनों से अलग हो जाए। दुर्भाग्य से, वे गतिरोध के साथ समस्याओं में भागते हैं।

चूंकि आपके पास कम से कम एक इंटरफ़ेस है जिसे अतुल्यकालिक होने की आवश्यकता है, YAGNI उलट है। आप कर रहे हैं , ताकि आपके इंटरफेस संगत कर रहे हैं परिवर्तन करने के लिए जा रहा है। हां, यह आपके लिए अधिक प्रयास करेगा। लेकिन लाभ गतिरोध का कम जोखिम है; कम जटिल डिबगिंग; और अधिक अनुमान लगाने योग्य अवरोधन (जब वास्तव में होने की आवश्यकता होती है)।

मैं आपके द्वारा पूछे गए कुछ अन्य प्रश्नों पर विचार कर रहा हूं क्योंकि मुझे लगता है कि मैंने आपके प्रश्न के मूल को संबोधित किया है। कोर के साथ सौदा करें और आपके बाकी प्रश्न दूर हो जाते हैं। लेख काफी शामिल है और आपके द्वारा लाए गए अन्य बिंदुओं को संबोधित करता है और साथ ही अतिरिक्त नुकसान की ओर इशारा करता है।

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

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