FindById के लाभ () ।
भविष्य-प्रूफिंग : आप के साथ शुरू करते हैं Find(int)
, और बाद में अन्य विधियों (जोड़ने के लिए FindByName(string)
, FindByLegacyId(int)
, FindByCustomerId(int)
, FindByOrderId(int)
, आदि), मेरे जैसे लोगों के उम्र खर्च करने के लिए की तलाश में जाते हैं FindById(int)
। वास्तव में कोई समस्या नहीं है यदि आप एक बार आवश्यक हो Find(int)
जाने पर बदल सकते हैं FindById(int)
- भविष्य का प्रमाण इन के बारे में है यदि एस।
पढ़ने में आसान । Find
यह पूरी तरह से ठीक है अगर कॉल लगता है record = Find(customerId);
फिर भी FindById
पढ़ने के लिए थोड़ा आसान है अगर यह है record = FindById(AFunction());
।
संगति । आप लगातार आवेदन कर सकते हैं FindByX(int)
/ FindByY(int)
पैटर्न हर जगह है, लेकिन Find(int X)
/ Find(int Y)
क्योंकि वे संघर्ष संभव नहीं है।
खोजने के लाभ ()
- चुम्मा।
Find
सरल और सीधा है, और operator[]
इस संदर्भ में यह 2 सबसे अधिक अपेक्षित फ़ंक्शन नामों में से एक है। (कुछ लोकप्रिय विकल्प जा रहा है get
, lookup
या fetch
संदर्भ के आधार पर)।
- अंगूठे के एक नियम के रूप में, यदि आपके पास एक फ़ंक्शन नाम है जो एक एकल प्रसिद्ध शब्द है जो सटीक रूप से वर्णन करता है कि फ़ंक्शन क्या करता है, इसका उपयोग करें। भले ही एक लंबा बहु-शब्द नाम हो जो यह बताता है कि फ़ंक्शन क्या करता है, थोड़ा बेहतर है। उदाहरण: लंबाई बनाम नंबरऑफलाइन । एक व्यापार है, और जहां रेखा खींचना एक चल रही बहस का विषय है।
- आमतौर पर अतिरेक से बचना अच्छा है। अगर हम देखें
FindById(int id)
, तो हम इसे बदलकर आसानी से अतिरेक को दूर कर सकते हैं Find(int id)
, लेकिन एक व्यापार बंद है - हम कुछ स्पष्टता खो देते हैं।
वैकल्पिक रूप से आप दृढ़ता से टाइप किए गए Ids का उपयोग करके दोनों के लाभ प्राप्त कर सकते हैं :
CustomerRecord Find(Id<Customer> id)
// Or, depending on local coding standards
CustomerRecord Find(CustomerId id)
का कार्यान्वयन Id<>
: C # में आईडी मानों को दृढ़ता से टाइप करना
यहां टिप्पणियाँ, साथ ही साथ ऊपर दिए गए लिंक में, इस बारे में कई चिंताओं को उठाया गया है Id<Customer>
कि मैं संबोधित करना चाहूंगा:
- चिंता 1: यह जेनरिक का दुरुपयोग है।
CustomerId
और OrderID
विभिन्न प्रकार ( customerId1 = customerId2;
=> अच्छा, customerId1 = orderId1;
=> बुरा) हैं, लेकिन उनका कार्यान्वयन लगभग समान है, इसलिए हम उन्हें कॉपी पेस्ट या मेटाप्रोग्रामिंग के साथ लागू कर सकते हैं। जबकि जेनेरिक को उजागर करने या छिपाने के बारे में एक चर्चा में मूल्य है, जो कि जेनेरिक के लिए मेटाप्रोग्रामिंग है।
- चिंता 2: यह साधारण गलतियों को नहीं रोकता है। यह एक समस्या की तलाश में एक समाधान है । मुख्य मुद्दे जो दृढ़ता से टाइप किए गए Ids का उपयोग करके हटाया जाता है वह कॉल में गलत तर्क क्रम है
DoSomething(int customerId, int orderId, int productId)
। दृढ़ता से टाइप किए गए Ids अन्य समस्याओं को भी रोकते हैं, जिसमें एक ओपी के बारे में पूछा गया था।
- चिंता 3: यह वास्तव में सिर्फ कोड अस्पष्ट करता है। यह बताना मुश्किल है कि क्या कोई आईडी है
int aVariable
। यह बताना आसान है कि एक Id आयोजित की जाती है Id<Customer> aVariable
, और हम यह भी बता सकते हैं कि यह एक ग्राहक आईडी है।
- चिंता 4: ये Ids कोई मजबूत प्रकार नहीं हैं, बस रैपर हैं।
String
चारों ओर सिर्फ एक आवरण है byte[]
। रैपिंग, या एनकैप्सुलेशन, मजबूत टाइपिंग के साथ संघर्ष में नहीं है।
- चिंता 5: यह इंजीनियर से अधिक है। यहाँ न्यूनतम संस्करण है, हालाँकि मैं जोड़ने की सलाह देता हूँ
operator==
और operator!=
साथ ही, यदि आप विशेष रूप से भरोसा नहीं करना चाहते हैं Equals
:
।
public struct Id<T>: {
private readonly int _value ;
public Id(int value) { _value = value; }
public static explicit operator int(Id<T> id) { return id._value; }
}
T Find<T>(string name)
या(int size)
आप अपरिहार्य समस्याओं को हल करने की योजना कैसे बनाते हैं?