Friday 15 May 2015

c# - Delegate Method or Abstract Class -


यहाँ मेरा कार्यक्रम है:

  वर्ग कार्यक्रम {// डिजाइन 1 सार वर्ग एफ़ू { सार्वजनिक स्ट्रिंग बार {get; सेट; } सार्वजनिक सार स्ट्रिंग SayHi (); } क्लास लाउडफ़ू: एफ़ू {सार्वजनिक ओवरराइड स्ट्रिंग सिली ()} इस वापसी करें। बार्ट। टूवपर (); }} वर्ग QuietFoo: एफ़ू {सार्वजनिक ओवरराइड स्ट्रिंग SayHi () {इस वापसी। बार्क। लोवर (); }} // डिजाइन 2 वर्ग फ़ू {सार्वजनिक स्ट्रिंग बार {get; सेट; } सार्वजनिक Func & lt; Foo, String & gt; Sayhi {प्राप्त करें; सेट; }} स्थिर शून्य मुख्य (स्ट्रिंग [] आर्ग्स) {// USING DESIGN 1 var शांत Foo2 = नया QuietFoo {बार = "मारियान"}; Var लाउफू 2 = नया लाउडफ़ू {बार = "अदरक"}; Console.WriteLine (quietFoo2.SayHi ()); Console.WriteLine (loudFoo2.SayHi ()); // उपयोग की जाने वाली डिजाइन 2 var शांतफू = नए फ़ू {बार = "फेलिक्स", सैहिय = (एफ) = & gt; {रिटर्न एफ। बार्। टूओवर (); }}; Var लाउफू = न्यू फ़ू {बार = "ऑस्कर", सैहई = (एफ) = & gt; {रिटर्न एफ। बार्ट टीओउपर (); }}; Console.WriteLine (quietFoo.SayHi (quietFoo)); Console.WriteLine (loudFoo.SayHi (loudFoo)); }}   

मैं "एक ही बात" को पूरा कर सकता हूं - वास्तव में वास्तव में एक ही बात नहीं है, लेकिन इसी तरह की दो अलग-अलग मार्गों के चलते हैं

डिज़ाइन 1) मैं एक अमूर्त वर्ग बना सकता हूँ जो उस क्लास के क्रियान्वयन को मजबूर करता है जिसे सईही ()

- या -

डिज़ाइन 2) मैं एक वर्ग बना सकता हूं जो एक साहहा संपत्ति परिभाषित करता है जो एक फ़ंक्शन है। (मैं इसे एक प्रतिनिधि कह रहा हूं - लेकिन मुझे यकीन नहीं है कि इसके लिए सही शब्द है)

डिज़ाइन 1 मुझे परेशान करता है क्योंकि इससे कक्षाओं में गहराई हो सकती है

अभी तक ....

डिज़ाइन 2 मुझे परेशान करता है क्योंकि यह वास्तव में अनावश्यक लगता है जब मुझे फू वास्तव में कहना है ()।

  felix .SayHi (फ़ेलिक्स)   

मेरा प्रश्न यह है कि क्या डिजाइन 1 या डिजाइन 2 का उपयोग करना बेहतर है - या उनमें से न तो जब मैं बेहतर कहता हूं तो मैं कह रहा हूं कि मेरे कार्यक्रम को बनाए रखने में सक्षम होने के मामले में अधिक व्यावहारिक है। जब मैंने विभिन्न क्लाउड एपीआई (Google Drive, Box.com, DropBox) से फ़ाइलों को डाउनलोड करने के लिए उपयोग किए जाने वाले विभिन्न वर्गों का निर्माण किया तो मैंने इसमें भाग लिया - पहले मैंने अलग कक्षाएं बनाईं, लेकिन फिर मैं दूसरी मार्ग चला गया। इन प्रकार के डिजाइन विकल्पों की बात आती है, तो मुझे लगता है कि यह वस्तुओं के बारे में सोचने में मदद करता है। समस्या डोमेन जिसे आप मॉडल की कोशिश कर रहे हैं आपने सिंगल व्यवहार में भिन्नता के रूप में लाउडफू और क्विटफू दिखाया है, लेकिन यह जानबूझकर सरल उदाहरण है। वास्तविक प्रणाली में, आपके पास दो ऑब्जेक्ट्स को अवधारणात्मक रूप से अलग करने के लिए मजबूरक कारण हो सकते हैं।

पूर्व संस्करण में, SayHi क्लास व्यवहार का एक सहज हिस्सा है, जो उचित है अगर उस व्यवहार की प्रकृति किसी आंतरिक तरीके से अपने आंतरिक राज्य से संपर्क करता है शायद सहिह का कार्यान्वयन उस वस्तु के गुणों पर निर्भर करता है जो उस व्युत्पन्न वर्ग के प्रकार के लिए विशिष्ट होता है।

उत्तरार्द्ध संस्करण में, SayingHi एक ऐसा उपकरण है जो विभिन्न उदाहरणों को सौंप दिया जा सकता है। यह उचित है जब विभिन्न प्रकार के फू उदाहरणों के बीच भेद करने के लिए कोई अन्य कारण नहीं है।

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

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


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

No comments:

Post a Comment