मेरे सिस्टम में मैं अक्सर एयरपोर्ट कोड ( "YYZ"और "LAX", "SFO"आदि) के साथ काम करता हूं , वे हमेशा एक ही प्रारूप (3 अक्षर, अपरकेस के रूप में प्रतिनिधित्व) में होते हैं। प्रणाली आमतौर पर इनमें से 25-50 (अलग-अलग) कोड प्रति एपीआई अनुरोध से निपटती है, कुल मिलाकर एक हजार से अधिक आवंटन के साथ, वे हमारे आवेदन की कई परतों से गुजरते हैं, और समानता के लिए तुलना की जाती है।
हमने बस पासिंग स्ट्रिंग्स के साथ शुरुआत की, जो थोड़ा ठीक काम करता था, लेकिन हमने जल्दी से एक गलत कोड में कई प्रोग्रामिंग गलतियों को देखा, जहां 3 अंकों का कोड अपेक्षित था। हम उन मुद्दों पर भी भागे, जहाँ हम केस-असंवेदनशील तुलना करने वाले थे और इसके परिणामस्वरूप बग नहीं बने।
इससे, मैंने चारों ओर से गुजरने वाले तारों को रोकने और एक Airportवर्ग बनाने का फैसला किया , जिसमें एक एकल निर्माता है जो हवाई अड्डे के कोड को लेता है और मान्य करता है।
public sealed class Airport
{
public Airport(string code)
{
if (code == null)
{
throw new ArgumentNullException(nameof(code));
}
if (code.Length != 3 || !char.IsLetter(code[0])
|| !char.IsLetter(code[1]) || !char.IsLetter(code[2]))
{
throw new ArgumentException(
"Must be a 3 letter airport code.",
nameof(code));
}
Code = code.ToUpperInvariant();
}
public string Code { get; }
public override string ToString()
{
return Code;
}
private bool Equals(Airport other)
{
return string.Equals(Code, other.Code);
}
public override bool Equals(object obj)
{
return obj is Airport airport && Equals(airport);
}
public override int GetHashCode()
{
return Code?.GetHashCode() ?? 0;
}
public static bool operator ==(Airport left, Airport right)
{
return Equals(left, right);
}
public static bool operator !=(Airport left, Airport right)
{
return !Equals(left, right);
}
}
इसने हमारे कोड को समझने में बहुत आसान बना दिया और हमने अपनी समानता की जांच, शब्दकोश / सेट usages को सरल बनाया। अब हम जानते हैं कि अगर हमारे तरीके एक Airportउदाहरण को स्वीकार करते हैं कि यह हमारे द्वारा अपेक्षित तरीके का व्यवहार करेगा, तो इसने हमारे तरीके को एक सरल संदर्भ जांच में बदल दिया है।
हालाँकि, मैंने जो नोटिस किया था, वह यह था कि कचरा संग्रह बहुत अधिक बार चल रहा था, जिसे मैंने Airportएकत्रित करने के बहुत सारे उदाहरणों पर नज़र रखी ।
इसका मेरा हल classएक में परिवर्तित करना था struct। अधिकतर यह एक खोजशब्द परिवर्तन था, इसके अपवाद के साथ GetHashCodeऔर ToString:
public override string ToString()
{
return Code ?? string.Empty;
}
public override int GetHashCode()
{
return Code?.GetHashCode() ?? 0;
}
जहां default(Airport)उपयोग किया जाता है उस मामले को संभालने के लिए ।
मेरे सवाल:
क्या
Airportसामान्य रूप से एक वर्ग या संरचना एक अच्छा समाधान बना रहा था, या क्या मैं गलत समस्या को हल कर रहा हूं / इसे गलत तरीके से हल कर रहा हूं? यदि यह एक अच्छा समाधान नहीं है, तो बेहतर उपाय क्या है?जहां
default(Airport)उपयोग किया जाता है वहां मेरे एप्लिकेशन को इंस्टेंस को कैसे संभालना चाहिए ?default(Airport)मेरे आवेदन के लिए एक प्रकार का निरर्थक है, इसलिए मैं उनif (airport == default(Airport) { throw ... }जगहों पर कर रहा हूं जहांAirport(और इसकीCodeसंपत्ति) का एक उदाहरण ऑपरेशन के लिए महत्वपूर्ण है।
नोट: मैंने C # / VB संरचना के प्रश्नों की समीक्षा की - शून्य डिफ़ॉल्ट मान वाले मामले से कैसे बचें, जो दी गई संरचना के लिए अमान्य माना जाता है? , और मेरे प्रश्न पूछने से पहले संरचना का उपयोग करें या नहीं , लेकिन मुझे लगता है कि मेरे प्रश्न अपने स्वयं के पद को वारंट करने के लिए पर्याप्त हैं।
default(Airport)समस्या को हल कर सकते हैं, बस डिफ़ॉल्ट इंस्टेंस को रोकना है। आप ऐसा कर सकते हैं कि एक पैरामीटर रहित कंस्ट्रक्टर लिखकर और उसमें InvalidOperationExceptionया फेंककर NotImplementedException।