मैं विभिन्न प्रकार के वर्गों को संभालने के लिए कुछ बढ़ते if
संरचनाओं को संभालने का बेहतर तरीका ढूंढने की कोशिश कर रहा हूं। ये कक्षाएं, आखिरकार, कुछ अतिरिक्त राज्य जानकारी के साथ अलग-अलग मूल्य प्रकारों (int, DateTime, आदि) के आसपास रैपर हैं। तो इन वर्गों के बीच प्राथमिक अंतर उनके पास मौजूद डेटा का प्रकार है। जबकि वे जेनेरिक इंटरफेस को लागू करते हैं, उन्हें भी सजातीय संग्रह में रखा जाना चाहिए, इसलिए वे एक गैर-सामान्य इंटरफेस भी लागू करते हैं। कक्षा के उदाहरणों को उनके द्वारा प्रस्तुत किए जाने वाले डेटा के प्रकार के अनुसार संभाला जाता है और उनका प्रचार जारी रहता है या उस पर आधारित नहीं रहता है।डबल-डिस्पैच और विकल्प
हालांकि यह आवश्यक नहीं है .NET या C# समस्या, मेरा कोड सी # में है।
उदाहरण कक्षाएं: बस को संभालने के लिए
डबल डिस्पैच
मैं हाल ही में आगंतुक पैटर्न का पता चला और डबल प्रेषण के अपने प्रयोग:
interface ITimedValue {
TimeSpan TimeStamp { get; }
}
interface ITimedValue<T> : ITimedValue {
T Value { get; }
}
class NumericValue : ITimedValue<float> {
public TimeSpan TimeStamp { get; private set; }
public float Value { get; private set; }
}
class DateTimeValue : ITimedValue<DateTime> {
public TimeSpan TimeStamp { get; private set; }
public DateTime Value { get; private set; }
}
class NumericEvaluator {
public void Evaluate(IEnumerable<ITimedValue> values) ...
}
मैं दो विकल्प के साथ आए हैं ऐसा मामला यह अपील करता है क्योंकि यह अवांछित डेटा को प्रचारित करने की अनुमति नहीं देगा (अगर हम केवल एक int को संभालना चाहते हैं, तो हम डेटटाइम से अलग तरीके से इसे संभाल सकते हैं)। साथ ही, विभिन्न प्रकारों को कैसे संभाला जाता है, इस व्यवहार के व्यवहार को प्रेषण को संभालने वाली एकल कक्षा तक सीमित रखा जाएगा। लेकिन अगर एक नया मूल्य प्रकार समर्थित होना चाहिए तो रखरखाव का एक उचित हिस्सा है।
संघ कक्षा
एक वर्ग जो समर्थित हो सकता है प्रत्येक मान प्रकार के लिए एक संपत्ति में शामिल है क्या इन कक्षाओं की दुकान में से प्रत्येक। किसी मूल्य पर कोई भी ऑपरेशन उचित घटक को प्रभावित करेगा। यह डबल-प्रेषण रणनीति की तुलना में कम जटिल और कम रखरखाव है, लेकिन इसका मतलब यह होगा कि डेटा का हर टुकड़ा अनावश्यक रूप से सभी तरह से प्रचार करेगा क्योंकि आप अब उस डेटा प्रकार पर काम नहीं करते हैं, "। हालांकि, अगर नए प्रकारों को समर्थित करने की आवश्यकता है, तो उन्हें केवल इस कक्षा में जाना होगा (साथ ही जो भी अतिरिक्त वर्ग जो नए डेटा प्रकार का समर्थन करने के लिए बनाए जाने की आवश्यकता है)।
class UnionData {
public int NumericValue;
public DateTime DateTimeValue;
}
क्या बेहतर विकल्प हैं? क्या इन दो विकल्पों में से कुछ में कुछ है जो मैंने नहीं सोचा था कि मुझे चाहिए?
संभवतः 'न्यूमेरिक एवल्यूलेटर' की 'मूल्यांकन' विधि में क्या हो सकता है जो 'डेटटाइम' * या * फ्लोट पर काम करेगा? –
अभी मोबाइल पर, इसलिए मैं एक उचित उत्तर नहीं लिख सकता, लेकिन डबल प्रेषण के लिए गतिशील उपयोग के लिए गुगल करने का प्रयास करें (जो विज़िटर पैटर्न द्वारा आवश्यक बॉयलरप्लेट को बहुत कम करता है) या सी # में यूनियन प्रकार के कार्यान्वयन को याद करता है (मुझे याद है SOJ पर कहीं @ जुलिएट द्वारा एक सुंदर कार्यान्वयन) –
@ क्रिस शैन: यह डबल-प्रेषण समाधान के लाभ का हिस्सा है - इसे नहीं करना होगा। 'डेटटाइम' के लिए, या तो डबल-डिस्पैच समाधान इसे अनदेखा करता है या संस्करण समाधान इसे 0 मान के रूप में उपयोग करता है। – redman