मेरे पास DatabaseRow
नामक एक अमूर्त वर्ग है जिसे, व्युत्पन्न और निर्माण के बाद, मुख्य रूप से Load(object id)
विधि से लोड किया जाता है।विधि चेनिंग के लिए सर्वोत्तम अभ्यास ("इसे वापस करें")
मेरे पास बहुत सारे कोड हैं जो कक्षा का एक नया उदाहरण बनाता है, इसे आईडी से लोड करता है, फिर कक्षा लौटाता है। मैं इस कोड को कोड की एक पंक्ति में सरल बनाना चाहता हूं (बस साफ रहना, वहां बहुत सारे वर्ग हैं जिनमें केवल उन गुणों की सूचियां होंगी जो इन लोड किए गए उदाहरणों को वापस कर दें)।
ऐसा करने के दो तरीके हैं जो मैं कर सकता हूं, लेकिन न तो मुझे 'सही' लगता है।
1. मैं अपने Load
विधि के अंत में कर सकते थे return this;
और return new Derived().Load(id);
2. का उपयोग मैं एक लोड विधि वापस जाने के लिए एक सामान्य विधि बना सकते हैं।
public static T LoadRow<T>(object id) where T : DatabaseRow, new()
{
T row = new T();
row.Load(id);
return row;
}
मैं कुछ अन्य कोड संख्या रूप में एक ही विधि का उपयोग करता है देखा है, लेकिन मैं कभी नहीं देखा है किसी भी अनुभवी डेवलपर यह सलाह देते हैं, और न ही मैं नेट ढांचे में किसी भी तरीकों में आए है कि वही काम करो, तो शायद यह सबसे अच्छा अभ्यास नहीं है?
क्या किसी को भी अन्य समाधानों के बारे में पता है जो इन दोनों से बेहतर हो सकते हैं?
समाधान:
SirViver के जवाब और टिप्पणी पढ़ने के बाद, मुझे एहसास हुआ कि सभी गुण लौटे जरूरत जा रहा है वैसे भी कैश हो जाने की। समाधान दृष्टि से अलग था, लेकिन विकल्प (जैसा कि मैं किसी भी व्यक्ति को इस जवाब के साथ आने की उम्मीद नहीं करता क्योंकि मैंने डिजाइन के इस हिस्से को समझाया नहीं है)
इन सभी उदाहरणों से लोड किया जाएगा डेटाबेस में किसी अन्य कॉलम से पुनर्प्राप्त मूल्य (यदि आप चाहें तो डेटाबेस संबंध)। इस मान से नया उदाहरण लोड करने की कोशिश करने के बजाय, मैंने कॉलम नाम से इंस्टेंस लोड करने और एक शब्दकोश में लोड किए गए मान को कैश करने का तरीका बनाया है। यह अच्छी तरह से काम करता है क्योंकि यह DatabaseRow
वर्ग के प्राथमिक कार्यों में से एक है।
private Dictionary<string, DatabaseRow> linkedRows;
protected T GetLinkedRow<T>(string key) where T : DatabaseRow, new()
{
if (linkedRows.ContainsKey(key)) return (T)linkedRows[key];
else
{
T row = new T();
row.Load(this[key]);
linkedRows.Add(key, row);
return row;
}
}
मेरे मामले में, मेरे पास एक वर्ग है जो 'डाटाबेसरो' प्राप्त करता है, और इसमें 5 गुण होते हैं जो सभी एक ही फ़ंक्शन का उपयोग करते हैं। कोड की 5 लाइनें होने के कारण, 'सार्वजनिक व्युत्पन्न MyProperty के समान {{वापसी नया व्युत्पन्न()। लोड (myInt); }} गुणों को बहु-लाइन कोड में अलग करने से अधिक neater होगा। – Connell
लेकिन संपत्ति कोड की "स्वच्छता" बिल्कुल कैसे मायने रखती है? ज्यादातर मामलों में प्रॉपर्टी कोड को विजुअल स्टूडियो द्वारा किसी भी तरह से ध्वस्त किया जाना चाहिए, और ऐसा नहीं है कि आपको लगातार कक्षा कार्यान्वयन को देखना होगा। उस ने कहा, एक संपत्ति के उपयोग पर डेटा का निर्माण और लोड करना शुरू करने के लिए काफी खतरनाक लगता है।अगर कोई नहीं जानता कि परिणाम को कैश किया जाना चाहिए तो इससे खराब प्रदर्शन और/या अप्रत्याशित व्यवहार हो सकता है। – SirViver
यह बात है !!! मुझे अब इतनी बेवकूफ लगती है। कैशिंग पर आपकी टिप्पणी ने मुझे याद दिलाया कि मैंने पहले ही इस डेटाबेस को अपने डेटाबेसरॉव क्लास के नीचे बनाया है! 'संरक्षित टी GetLinkedRow (स्ट्रिंग कुंजी) जहां टी: डाटाबेसरो, नया()' पंक्ति को लोड करता है और इसे 'कुंजी' के मान के आधार पर एक शब्दकोश में कैश करता है। –
Connell