2010-11-25 14 views
10

क्या यह खराब श्रेणी है जिसमें सी # के लिए सूची <> सूची में स्वयं का संग्रह शामिल है? यह क्यों है और एक बेहतर दृष्टिकोण क्या है और क्यों?क्या कक्षा में स्वयं का संग्रह होना चाहिए?

संपादित करें: अधिक विशेष रूप से, मेरे पास उत्पाद कहा जाता है और GetProducts() नामक कक्षा में एक विधि है जो एक सूची संग्रह देता है। यह डेटाबेस, फ्लैट फ़ाइल, या एक्सएमएल से उत्पादों को पकड़ना अच्छा है ... अभी तक सुनिश्चित नहीं है।

धन्यवाद!

+0

ठीक है, मेरे पास उत्पाद नामक एक वर्ग है और GetProducts नामक एक विधि है जो एक सूची लौटाती है और मुझे यकीन नहीं था कि यह सही दृष्टिकोण है या नहीं। – user204588

+0

मैं शायद 'ProductCollection' क्लास लिखने पर विचार करूंगा जो संग्रह से संबंधित विधियां प्रदान करेगा, लेकिन मैं इसके बारे में ज्यादा परेशान नहीं हूं। शायद आपके 'उत्पाद' वर्ग में स्थिर 'GetProducts' विधि बनाना पर्याप्त है। इस तरह, यदि आप ऐसा कह सकते हैं, तो आपकी 'उत्पाद' कक्षा किसी भी तरह के उत्पाद की तरह व्यवहार करेगी। –

उत्तर

10

उत्पाद और GetProducts() अपडेट के साथ आते हैं, मुझे लगता है कि यह ऐसी अच्छी बात नहीं हो सकती है।

मैं यहां एक सिद्धांत के अंगूठे के नियम का उपयोग करता हूं जो डोमेन पर तर्क, निर्भर करता है, विशिष्ट नहीं है। तो आपके मामले में मैं खुद से पूछूंगा: "क्या मेरे उत्पाद में अन्य वास्तविक उत्पाद हैं?" यदि उत्तर हां है तो उत्पादों का संग्रह उत्पाद वर्ग में एक पूरी तरह से कानूनी बात है। यदि नहीं पूछें कि वास्तव में इन उत्पादों में क्या शामिल है। एक दुकान शायद?

स्थिर तरीकों के साथ इस नियम का अपवाद है। यदि GetProducts() स्थिर है तो ऊपरी तर्क लागू नहीं होता है और आमतौर पर उत्पाद वर्ग में इसे ठीक करने के लिए बिल्कुल ठीक है।

+0

+1। =) –

+0

आपके उदाहरण में स्थैतिक विधि क्यों लागू नहीं होगी? बस उत्सुक। – user204588

+1

जिस तरह से मैं डेटा मॉडल के लिए स्थिर तरीकों को देखता हूं (यह कैसा लगता है) यह है कि वे उस वर्ग के साथ कुछ करने के लिए उपयोग करते हैं लेकिन एक स्तर ऊपर हैं। मुझे यकीन नहीं है कि मैं इसे ठीक से समझा रहा हूं। मैं इसे अपने सिर में समझता हूं लेकिन इसे लिखना मेरे लिए उतना आसान नहीं है :) लेकिन उदाहरण के लिए पार्स() विधियां एक सामान्य चीज हैं। 'int.Parse (somestring)' एक स्थिर विधि है और बेहतर है 'ए। पर्स (somestring)' (एक मूल्य पार्स किया जाता है) क्योंकि आप इसे 'int c = 24 + int.Parse (somestring' जैसे अभिव्यक्ति में उपयोग कर सकते हैं) '। मुझे उम्मीद है कि मैं इसे ठीक से भरोसा कर रहा हूं। – gligoran

0

यह समस्या निवारण की समस्या के आधार पर यह खराब और अच्छी दोनों हो सकती है, और यदि यह एक सामान्यीकृत वस्तु है या नहीं। कई कारक ऐसे डिजाइन निर्णयों को प्रभावित कर सकते हैं। अंत में, यह अच्छा या बुरा डिजाइन का कोई फर्क नहीं पड़ता है, लेकिन यदि यह सही रास्ता है तो आप नदी पार करने का चयन कर रहे हैं।

संपादित करें # 1

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

इस परिस्थिति में, मैं Product.GetProducts विधि स्थिर बना दूंगा। जैसे, जब आप उत्पादों लोड करना चाहते हैं, तो आप बस अपने Product वर्ग इतना की तरह संबोधित करेंगे:

IList<Product> products = Product.GetProducts(); 

खुद की एक सूची ग्रहण करेंगे कि एक उत्पाद उन घटक उत्पादों की तरह, विभिन्न अन्य उत्पादों से बना जा सकता है। लेकिन, एक स्थिर विधि के साथ, यह अधिक स्वीकार्य रूप से Product उत्पाद संबंधित व्यवसाय के लिए फैक्ट्री श्रेणी बना देगा।

+0

क्या आप यहां फैक्ट्री पैटर्न के बारे में बात कर रहे हैं या सामान्य रूप से ऑब्जेक्ट जो उत्पाद बनाता है? समझाया दृष्टिकोण के लिए – user204588

0

निश्चित रूप से यह ठीक है। ओओपी-वाई तरीके से पेड़ को लागू करने का यह समझदार तरीका है; TreeNode में List<TreeNode> m_Children फ़ील्ड होना चाहिए ताकि नोड को पता चले कि बच्चे पेड़ के ट्रैवर्सल के लिए क्या हैं।

0

जब तक यह एक जिम्मेदारी प्रिंसिपल के साथ संघर्ष नहीं करता है, मुझे लगता है कि यह कोई समस्या नहीं होगी।

2

व्यक्तिगत रूप से, मैं भंडार पैटर्न का उपयोग करेंगे:

public class IProductRepository 
{ 
    IEnumerable<Product> GetAll(); 
} 

फिर एक कार्यान्वयन लिखें:

public class ProductRepository 
{ 
    public IEnumerable<Product> GetAll() 
    { 
     // Database logic or read from an xml file... etc. 
    } 
} 

फोन करने वाले के लिए एक IProductRepository दर्रा (Ninject या महल विंडसर की तरह एक आईओसी कंटेनर का उपयोग) । फिर, यदि आवश्यक हो, तो आप कॉलर के साथ परीक्षण के लिए IProductRepository आसानी से नकल कर सकते हैं।

इस तरह आप वास्तविक मॉडल (Product) को उत्पादों के साथ "आप क्या कर सकते हैं" से अलग रखते हैं।

लेकिन, अगर Product रों भी Products (उदाहरण: SubProducts) के लिए की जरूरत है, तो आप एक ICollection<Product>Product पर साथ ही हो सकता था।

संबंधित मुद्दे