क्या कई गहरे-से-कई रिश्तों के प्रबंधन के लिए एक डिज़ाइन पैटर्न है?


10

मुझे इस डेटा पैटर्न को परिभाषित करने में परेशानी हो रही है जो मुझे कई अनुप्रयोगों पर काम करने में आया है।

यह मिश्रण है:

  1. एक वस्तु प्रकार जो स्वयं कई वस्तुओं से बना होता है
  2. एक दूसरी वस्तु का प्रकार, जहाँ प्रत्येक उदाहरण में पहली वस्तु 'कई' होती है
  3. और, पहली वस्तु की प्रत्येक उप-वस्तु प्रत्येक संघ से दूसरी वस्तु के प्रकार के प्रति परिवर्तनीय है।

एक सरल उदाहरण हो सकता है:

  1. सबक के एक सेट से मिलकर एक प्रोग्रामिंग कोर्स
  2. सबक एक निर्धारित कार्य से बना है।
  3. एक कोर्स एक छात्र को सौंपा जा सकता है।
  4. हालांकि, एक बार एक पाठ्यक्रम को एक छात्र को सौंपा जाता है, प्रत्येक पाठ और / या असाइनमेंट को उस छात्र के लिए अनुकूलित किया जा सकता है, हटाने और परिवर्धन के साथ, उस बिंदु पर जहां मूल पाठ्यक्रम अपरिचित हो सकता है।

मेरे समाधान में, यह क्या परिणाम है:

एक छात्र को पाठ्यक्रम के असाइनमेंट पर, पाठ्यक्रम को मेमोरी में लोड किया जाता है। फिर प्रत्येक उप-ऑब्जेक्ट के लिए, उपयुक्त मेटाडेटा के साथ एक छात्र / उप-ऑब्जेक्ट संबंध ऑब्जेक्ट उत्पन्न होता है। अनिवार्य रूप से, मैं आवश्यक अनुकूलन योग्य वस्तुओं को उत्पन्न करने के लिए एक टेम्पलेट के रूप में मूल वस्तु का उपयोग कर रहा हूं।

इससे बड़ी मात्रा में डेटा प्राप्त होता है क्योंकि उप-ऑब्जेक्ट अधिक जटिल और क्रमांकित हो जाते हैं। मुझे आश्चर्य हो रहा है कि इस डेटा पैटर्न में हेरफेर करने के लिए आवश्यक तर्क / जटिलता की मात्रा को कम करने के लिए कुछ अनुकूलन या पैटर्न है।


2
क्या आप वाकई "डेटा की मात्रा कम करना चाहते हैं"? क्या आप इसके बजाय "गैर-तुच्छ कोड और तर्क की मात्रा को कम करने" के तरीकों की तलाश कर रहे हैं जो आवश्यक व्यवहार को लागू करने के लिए लिखे जाने की आवश्यकता है? (मुझे लगता है कि डेटा के चल रहे प्रबंधन के लिए एक डेटाबेस के समान संबंधपरक डेटा संरचना की आवश्यकता होती है।)
rwong

@rwong Yes, "reduc [ing] नॉन-ट्रिवियल कोड और लॉजिक की मात्रा" मेरा अंतिम लक्ष्य है। मेरे लिए, इसका मतलब है कि किसी तरह से डेटा जटिलता को कम करना, लेकिन यह एक आवश्यकता नहीं है। यह इतना सामान्य डेटा पैटर्न बन गया है कि मुझे आश्चर्य है कि अगर इसे प्रबंधित करने का कोई सरल तरीका है।
निकोलस पिकरिंग

1
सिद्धांत रूप में यह m: n संबंध का एक उन्नत संस्करण है। एक शीर्षक के बारे में क्या »कैसे जटिल वस्तु संबंधों का प्रबंधन करने के लिए«?
थॉमस जं।

1
डेटा की एक बड़ी मात्रा डेटा में जटिलता के एक विशाल स्तर के समान नहीं है। आप जो निर्माण कर रहे हैं उसे प्रबंधित करने में कठिनाई संभवतः वॉल्यूम के साथ जटिलता से अधिक बढ़ेगी।
वाल्टर मिटी

1
दिलचस्प। मैंने कई एप्लिकेशनों पर काम किया है, जिनमें यह पैटर्न है, लेकिन इससे पहले कभी नहीं देखा गया कि यह एक पैटर्न है। इस तरह के डेटा को प्रबंधित करने के सरल तरीके देखना भी पसंद करेंगे।
जूल्स

जवाबों:


6

मुझे आपकी आवश्यकता के आधार पर कुछ विकल्प दिखाई देते हैं: (1) यदि कई अद्वितीय उदाहरण हैं जो एक सामान्य एल्गोरिथ्म का अनुसरण करते हैं, (2) यदि कई समान वस्तुएं हैं या आप रन-टाइम पर ऑब्जेक्ट उत्पन्न करेंगे, और (3) यदि आप गतिशील रूप से ऑब्जेक्ट के व्यवहार को संशोधित करते हुए चलाना चाहते हैं। नोट: आप सभी पैटर्न मैं यहाँ उल्लेख कर सकते हैं, अगर जरूरत हो।

  1. यदि प्रत्येक "दूसरा ऑब्जेक्ट प्रकार" अद्वितीय है, लेकिन व्यवहार के समान पैटर्न का अनुसरण करता है, तो आप टेम्पलेट पैटर्न का उपयोग कर सकते हैं । ऐसा लगता है कि आप ऐसा कर रहे होंगे। लेकिन यह स्पष्ट करने के लिए, आपके अमूर्त, आधार वर्ग में सामान्य एल्गोरिथ्म क्रमादेशित है; इस एल्गोरिथ्म के कुछ चरणों को व्युत्पन्न वर्गों में लागू किया गया है।

  2. यदि आप कई ऑब्जेक्ट्स बनाएंगे या रन-टाइम पर ऑब्जेक्ट्स बनाना आपके लिए महत्वपूर्ण है, तो आप फ़ैक्टरी पैटर्न का उपयोग कर सकते हैं ।

  3. और यदि आप व्यवहारिक रूप से बदलाव की इच्छा रखते हैं, तो स्टैटेगी पैटर्न काम कर सकता है। उदाहरण के लिए, यदि एक नियमित पाठ्यक्रम में एक छात्र को विशेष जरूरतों के लिए या त्वरित कार्यक्रम में जाने का निर्णय लिया जाता है। यह एक वस्तु के "छात्र" की रचना करके काम करता है जो पाठ्यक्रम के आधार-वर्ग का प्रतिनिधित्व करेगा। पाठ्यक्रम छात्र के निर्माण में एक व्युत्पन्न पाठ्यक्रम को सौंपा जाएगा (जो अजीब लगता है) और बाद में किसी अन्य व्युत्पन्न पाठ्यक्रम को फिर से असाइन किया जा सकता है।

(बस FYI करें, यदि C ++ के साथ (3) स्ट्रैटेजी पैटर्न का उपयोग किया जाता है, तो आपको रचना के लिए Rvalues ​​करना होगा।)

अपनी वस्तुओं और दूसरी वस्तुओं को संग्रहीत करने के लिए, यह आइटरेटर पैटर्न (उनके माध्यम से चक्र, जोड़ने, हटाने, सॉर्ट करने आदि) पर विचार करने के लायक हो सकता है।

एक अच्छा संदर्भ है हेड फर्स्ट डिज़ाइन पैटर्न , जो मेरे द्वारा उल्लिखित पैटर्न और उनके कार्यान्वयन को कवर करता है। वे जावा में काम करते हैं।


0

मुझे डेटा-स्टोर या हठ की उपस्थिति के तहत विश्वास करना मुश्किल हो रहा है, कि आपको एक रन-टाइम में किसी भी बिंदु पर इस तरह की गहराई वाली वस्तुओं की आवश्यकता होगी। क्या यह CRUD GUI के लिए है? यदि ऐसा है, तो मैं शुरू से ही आपके दृष्टिकोण को बदलने का सुझाव दूंगा। अर्थात:

उपसंरचना दिखाने के लिए छात्र के लिए आवश्यक को पहचानें, और statefully डाटाबेस के लिए अपने मूल सूचकांक वापस स्टोर, और statelessly कि अद्यतन करते हैं, या देखने और बैकएंड डाटाबेस से जा रहा है।


मुझे यकीन नहीं है कि मैं आपके सुझाव को समझूंगा। मुझे एक खाली उप-विषय उत्पन्न करना चाहिए, फिर उपयोगकर्ता को दूसरे रूप में बाध्य करना चाहिए जो उन्हें उप-विषय को संशोधित करने की अनुमति देता है?
निकोलस पिकरिंग 19

मैं सुझाव दे रहा हूं कि स्वयं की वस्तुएं बहुत अधिक नहीं होती हैं, यदि आप जो कर रहे हैं वह उनकी सामग्री और बैक-एंड डेटाबेस के बीच एक स्टेटलेस लेनदेन है। यदि यह मामला है, तो उन्हें हटा दें और केवल उस डेटा के लिए लेनदेन का प्रदर्शन करें जो ग्राहक का सामना करता है।
जॉन पी। फेल्ट्ज

संपादित करें: इसका मतलब यह भी हो सकता है कि वस्तुओं को बनाने के लिए उस विशेष डेटा को कैद किया जाए- यदि आप उस संबंध में उनकी सुविधा के कारण ORM के पक्षपाती हैं।
जॉन पी। फेल्ट्ज

जब तक मैं गलत नहीं समझ रहा हूँ, मुझे नहीं लगता कि इस प्रक्रिया के बारे में कुछ भी स्टेटलेस किया जा सकता है। यह सब उपयोगकर्ता कार्रवाई के संदर्भ पर निर्भर करता है। जब कोई उपयोगकर्ता एक प्राथमिक ऑब्जेक्ट बनाता है, तो वे उम्मीद करते हैं कि अवक्षेपण तुरंत संशोधित करने के लिए उपलब्ध होगा।
निकोलस पिकरिंग

-1

प्रत्येक छात्र के लिए एक अनुकूलित पाठ्यक्रम उस बिंदु पर जहां मूल पाठ्यक्रम अपरिचित है, यह बताता है कि मूल पाठ्यक्रम केवल एक "डिफ़ॉल्ट" संदर्भ है। मैं जो कुछ भी करूँगा उसे एक वर्ग बनाऊंगा जिसे कस्टमरकोर्स (या उनकी एक सूची) कहा जाता है और एक छात्र की संपत्ति के रूप में वह (या उस की एक सूची) है। CustomCourse के पास "संदर्भात्मक" उपयोग के लिए मूल पाठ्यक्रम का संदर्भ हो सकता है लेकिन मुख्य कार्य और डेटा CustomCourse में ही होगा।


टिप्पणी करने के लिए नीचे की देखभाल?
frezq

मैं नीचे नहीं गया (मैं ओपी हूं), लेकिन ऐसा लगता है कि आप उस टेम्पलेट या रणनीति पैटर्न का वर्णन करने का प्रयास कर रहे हैं जो पहले से ही दूसरे उत्तर में वर्णित था।
निकोलस पिकरिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.