2012-06-26 31 views
6

मेरे पास बहुत सारे सदस्यों के साथ एक बहुत बड़ी कक्षा ए है, और मेरे पास एक बड़ी कक्षा बी है जिसे ऑब्जेक्ट होने पर बनाया जा सकता है। एक ऑब्जेक्ट बनाया जा सकता है जब एक बी ऑब्जेक्ट होता है। मुझे उन दोनों की आवश्यकता है, क्योंकि ए एक प्रकार का व्यूमोडेल है, जिसमें सत्यापन है और बी एक ग्राफिकल विवरण है, जिसे आसानी से प्लॉट किया जा सकता है।कनवर्टर कक्षा कैसे लिखें? मैपिंग नियमों को कुशलतापूर्वक कैसे लिखें?

इस रूपांतरण को कैसे करें?

यहाँ एक उदाहरण है, वर्णन करने के लिए मुझे क्या करना चाहते हैं:

class A 
{ 
    string s; 
    string t; 
    string u; 
    string v; 

    enum a; 
    enum b; 
    enum c; 
    enum d; 
    enum e; 

    Dictionary<enum, string> dict; 
} 


class B 
{ 
    string someString; // is essentially A.a + A.b + A.c + A.s with some rules. 
    int someValue; // is essentially dict.TryGetValue(enum.Entry); 
    string anotherString; 
    // ... and lots of others 
} 

बेशक यह कुछ मानचित्रण, करते हैं, और एक बी वस्तु का निर्माण करने के लिए सरल है और यह बहुत ही लिखने के लिए कठिन नहीं है सादे बी => इमारत एक के नियमों inverting द्वारा एक मानचित्रण => बी

तो सवाल कर रहे हैं:

  • क्या यह हासिल करने के लिए कोई ज्ञात पैटर्न हैं?
  • क्या ऐसी चीजों को करने का एक डिफ़ॉल्ट सी # तरीका है?

ऐसा कुछ सादा लिखना ठीक नहीं लगता है, यह कोड की सैकड़ों पंक्तियों में समाप्त होता है।

मैं भागों के लिए कनवर्टर कक्षाओं के कुछ प्रकार, SomeStringConverter, SomeValueConverter तरह के बारे में सोचा, ...

  • मैं सार नियमों के साथ एक साथ की जरूरत सदस्यों मानचित्रण करने के लिए कर सकते हैं कैसे।
  • मैं उन नियमों कैसे लिख सकते हैं कर एक => बी और का सबसे आसान संभव तरीका है करने के लिए बी => ए

संपादित करें: पैटर्न यहाँ के रूप में "सर्वोत्तम प्रथाओं" और नहीं होती है के रूप में "GOF डिजाइन पैटर्न"

बी कक्षा में SomeString पर "चयनकर्ता" किसी तरह का है, यह विकल्प ड्राइंग का चयन करता है, यह हमेशा 25 वर्ण लंबा है और कक्षा एक में enums उन अक्षरों को चुनते हैं, लेकिन नहीं है 1 ज्यादातर मामलों में 1। आ = "भरा", अब = "SingleCoordinate", एसी = "DrawHints" तरह SomeString =

"Y**D***RR****---***---***" 

कुछ में परिणाम होगा यानी संयोजन एक ऐसी पाने के लिए महत्वपूर्ण है:

उदाहरण के लिए कहते हैं कि चलो स्ट्रिंग, लेकिन संयोजन से आप एक ऑब्जेक्ट में सेट किए जाने वाले enums प्राप्त कर सकते हैं।

EDIT2:

मैं विशेष रूप से दोनों तरीकों के लिए मेरे मानचित्रण नियमों का उपयोग करने के तरीके में दिलचस्पी रखता हूँ, अर्थात A.a = "भरा" a.b = "SingleCoordinate" ए के साथ combinded के साथ संयुक्तc = "DrawHints" का परिणाम (आंशिक स्ट्रिंग) "Y**D***RR" होगा, और उस आंशिक स्ट्रिंग का भी अर्थ है कि एए को "भर दिया गया" और इसी तरह सेट करना होगा।

+0

पर एक अज्ञानी है, बस कक्षाओं में से एक दूसरे के उत्तराधिकारी है। –

+0

सोचें कि सबसे अच्छा तरीका नहीं है, क्योंकि किसी के पास इनपुट के लिए सत्यापन है और दूसरा, संरचना में पूरी तरह अलग होने के बावजूद, साजिश के लिए आसान है, लेकिन सामग्री समान है, लेकिन मैप की गई है। लेकिन स्पष्ट रूप से, मैंने पहले ही कुछ पीओएनओ कक्षा को डेटा और दो कनवर्टर्स रखने का विचार किया है, जिसके परिणामस्वरूप ए और बी और ए => पोनो और बी => पोनो के लिए कनवर्टर है। शायद यह जाने का रास्ता है। –

+0

यह पॉको है, क्योंकि यह सब के बाद .NET है :) – EkoostikMartin

उत्तर

0

क्या मैं इस समस्या को हल करने के लिए किया है:

  1. (इस मुद्दे पर बड़े मुसीबत का इशारा की मदद से) एक BiMap लिखा।

  2. सम्मिलित किया गया यह (जो स्ट्रिंग कि कि मानचित्रण द्वारा परिभाषित कर रहे हैं के सूचकांकों को निर्दिष्ट कुंजी, "मान" में जिसके परिणामस्वरूप कुंजी, एक साथ एक BitArray साथ में सभी मान संयोजन में मानचित्रण।

  3. इसमें से एक है, जिसके परिणामस्वरूप समग्र स्ट्रिंग गणना करने के लिए, मानचित्रण बस में आंशिक स्ट्रिंग दे देंगे के रूप में कुछ कोड लिखा था।

  4. एक-से-एक मैपिंग तुच्छ थे।

इस तरह से मैं मैपिंग का उपयोग दोनों तरीकों से कर सकता था। एक स्ट्रिंग को देखते हुए, मेरे पास अभी भी काफी महंगा खोज है (क्योंकि मुझे बिटकएरे को मास्क के रूप में उपयोग करने वाली संग्रहीत स्ट्रिंग की गणना करना है)

फिलहाल यह बहुत अच्छा काम करता प्रतीत होता है, लेकिन मैं अभी तक समाप्त नहीं हुआ हूं।

आपके सभी अच्छे विचारों और दृष्टिकोणों के लिए धन्यवाद! शायद ऑटोमैपर कर सकता है, लेकिन इस समय मेरे पास पढ़ने और नई तकनीक को आजमाने के लिए अधिक समय नहीं है।

यदि कोई ऑटोमैपर, पर ऐसा करने के तरीके पर कुछ प्रासंगिक उदाहरण प्रदान कर सकता है, तो मैं इसे एक उत्तर के रूप में स्वीकार करूंगा (जैसा कि मुझे पहले से ही ऑटोमैपर पसंद है)।

उदाहरण जैसे उदाहरण कहते हैं: 5 मानों के साथ 3 मान एक निश्चित लंबाई स्ट्रिंग 5 मानों के साथ 3 एनम (ऊपर के विपरीत) के साथ एक निश्चित लंबाई स्ट्रिंग।

A.a && B.o && C.y ==> "**A**********************" 
A.a && B.p && C.y ==> "**B**********************" 
A.b && B.o && C.y ==> "*****X*******************" 
A.b && B.o && C.z ==> "*****W*******************" 

ऐसी बातों को प्राप्त Automapper सकता है:

एक उदाहरण के रूप

?

3

क्या यह प्राप्त करने के लिए कोई ज्ञात पैटर्न हैं?

यह पैटर्न के आधार पर आपका क्या मतलब है इस पर निर्भर करता है। Decorator या Adapter पैटर्न दिमाग में आते हैं, लेकिन न तो विभिन्न प्रकार के थोक मानचित्रण के लिए इसका मतलब है।

क्या ऐसी चीजों को करने का एक डिफ़ॉल्ट सी # तरीका है?

नहीं, ऐसा नहीं है। लेकिन Automapper जैसी लाइब्रेरी सुनिश्चित करें कि जीवन आसान हो।

+0

+1, यह मूल रूप से कुछ है जो मैं लिख रहा था। असल में, आप अपनी कक्षा को विशेषताओं के समूह के साथ चिह्नित करने की सोच रहे हैं ताकि अन्य वर्ग प्रतिबिंब के साथ इसका निरीक्षण कर सकें और उस मेटाडेटा पर कार्य कर सकें। – Tejs

+0

मैंने अपना प्रश्न संपादित किया है, कृपया एक नोट लें। –

+0

@MareInfinitus - यह पूरी तरह से स्पष्ट नहीं है कि आप क्या करने की कोशिश कर रहे हैं, लेकिन automapper आपके लिए स्ट्रिंग का विश्लेषण नहीं करेगा। एक कस्टम पार्सर आपके लिए सबसे अच्छा विकल्प दिखता है। – Oded

0

फैक्टरी + संभवतः फसाड

आप से एक बी यह तर्क है कि आप ऐसा करने के जटिल तर्क की जरूरत है एक एक से एक बी या एक एक इमारत का समन्वय करना चाहते हैं।

बी से बी बनाने के लिए, या तो बी (फैक्ट्री) पर एक स्थिर विधि के रूप में कार्यान्वित करें, या बी से विरासत में एक नया वर्ग सी बनाएं, और ए को अपने कन्स्ट्रक्टर (फेकाडे) के लिए तर्क के रूप में लेता है।

फैक्टरी: http://en.wikipedia.org/wiki/Factory_method_pattern (अपनी स्थिति के लिए नहीं एक सटीक मिलान)

फसाड: (नहीं एक सटीक मिलान या तो)

+0

जैसा कि आपने पहले ही कहा है, क्या वे डिज़ाइन पैटर्न उस समस्या पर कोई सटीक मिलान नहीं हैं। शायद सी # के लिए कोई भी सर्वोत्तम मूल्यवान हैं। –

+0

मुझे लगता है कि फैक्ट्री अच्छी तरह मेल खाती है। यह सिर्फ इतना है कि आमतौर पर फैक्ट्री का उपयोग अधिक जटिल निर्माण के लिए किया जाता है, और इसलिए अधिकांश विवरण और उदाहरण इसे प्रतिस्थापित करेंगे। मेरे दिमाग में किसी भी प्रणाली जहां ए और ए बी को किसी विधि में पास किया जाता है, फिर वांछित के रूप में कॉन्फ़िगर किया जाता है, "फैक्ट्री" के रूप में अर्हता प्राप्त करेगा, भले ही इंस्टेंस का निर्माण कहीं और किया जा सके। फिर भी मुझे लगता है कि ज्यादातर लोग फैक्ट्री के बारे में "स्मार्ट कन्स्ट्रक्टर" के रूप में सोचेंगे, और इसलिए उम्मीद है कि कारखाने के अंदर उदाहरण बनाए गए हैं। –

+0

फैक्ट्री समग्र समस्या का केवल एक छोटा सा हिस्सा हल करती है, विशेष रूप से मैपिंग नियमों का पुन: उपयोग करने की कोई संभावना नहीं है। –

0

एक जोड़े को विचार:

ए) एक इंटरफ़ेस में बी बदलें जो एक उपकरण यह आपको बी को फिर से ए के गुणों के बिना बी के गुणों को "मानचित्र" करने की अनुमति देगा। ऐसे मामलों में जहां बी में ऐसी संपत्ति है जहां ए को नहीं माना जाता है (या एक संपत्ति जो ए के कई को जोड़ती है), आप एक्सेस संशोधक को निजी * पर सेट कर सकते हैं - जिसका अर्थ है कि संपत्ति केवल इंटरफ़ेस के माध्यम से दिखाई देगी (ताकि नहीं ए के भ्रमित या अव्यवस्था कार्यान्वयन)।

बी) एक छद्म एडाप्टर/रैपर पैटर्न का उपयोग करें। बी, प्रकार ए के एक कन्स्ट्रक्टर पैरामीटर को देखते हुए, ए के गुणों को वापस देख सकता है, जहां बी अलग है, यह अपने तर्क को कार्यान्वित कर सकता है।

दो जटिल वस्तुओं के बीच मैपिंग कुछ जटिल सोच की आवश्यकता है। हमेशा विशेष मामले, दुष्प्रभाव और विकल्प होंगे जो पेशेवरों और विपक्षों के विचार और संतुलन की आवश्यकता रखते हैं। (उदाहरण के लिए, एक स्ट्रिंग और एक int के बीच कनवर्ट करना सभी प्रकार के प्रश्नों को प्रस्तुत करता है - हजारों सेपरेटर के साथ क्या करना है, विभिन्न संस्कृतियों को कैसे संभालना है, आदि) अपनी विशिष्ट परिस्थितियों को पढ़ने से, मुझे एक आसान या त्वरित तरीका नहीं दिख रहा है मैपिंग को संभालें - आपके पास शामिल सभी कारकों के आधार पर एक विधि होगी, शायद यहां पोस्ट करने के लिए बहुत सारे लोग।

संपादित करें: * मुझे ध्यान रखना चाहिए कि मैंने कई वीबी परियोजनाओं में यही किया है। मुझे लगता है कि यह सी # में कानूनी है, लेकिन मैंने कोशिश नहीं की है।

+0

में केवल एक वर्ष में मुझे लगता है कि मैं बाहरी डीटीओ के लिए जाऊंगा, जिसका उपयोग दोनों द्वारा किया जाएगा उन वस्तुओं का, और मानचित्रण किया जाता है <==> डीटीओ <==> बी इस समय सबसे प्राकृतिक लगता है। "काफी सरल" कुछ हासिल करने के लिए बस बहुत सारे काम। –

+0

यदि यह इतना आसान था, तो शायद आपको ऐसा करने के लिए भुगतान नहीं किया जाएगा। (हालांकि, हो सकता है कि आप वैसे भी भुगतान नहीं कर रहे हैं!) – JDB

+0

इसे लिखने के तरीके में यह आसान नहीं है और सबकुछ किया जाता है। मानचित्रण भाग अभी भी है;) –

4

मुझे लगता है कि ए जैसे डेटा मॉडल और बी व्यू मॉडल का अधिक है। मुझे नहीं लगता कि इस तरह के उदाहरण — के लिए आम तौर पर स्वीकृत "पैटर्न" है क्योंकि मुख्य रूप से इस तरह की जोड़ी के पीछे कारण व्यापक रूप से भिन्न होते हैं और सर्वोत्तम पैटर्न इच्छित उपयोग पर भारी निर्भर होता है।

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

सब का नतीजा यह वर्ग बी — जो उपयोगी हो जाता है अगर आप एक के लिए एक सच्चे उपयोग के मामले की कक्षा एक की अज्ञानता को बनाए रखना है ViewModel स्थिति। यदि आप यह निर्धारित करते हैं कि कक्षा ए आपकी ज़रूरतों में ट्रूअर व्यूमोडेल है, तो उपरोक्त को उलट दें ताकि कक्षा बी कक्षा ए

+0

धन्यवाद! हां, वास्तव में डेटामैडल के पास है, जबकि दूसरा * एक प्रकार का व्यूमोडेल है (एमवीवीएम के भाव में नहीं, लेकिन इसे सीधे प्लॉट किया जा सकता है)। मैंने अब एक समाधान लागू किया है, शायद सबसे अच्छा नहीं, लेकिन जो काम करता है और नए मैपिंग को लागू करने के लिए बहुत अधिक नहीं है और इसे बनाए रखना आसान है (ए या बी में मैपिंग होने पर अत्यधिक ओवरहेड होगा, जिसमें दो अलग-अलग जगह होंगी बदलने के लिए)। धन्यवाद! +1 –

+0

निश्चित बात। खुशी है कि यह समझ में आया। :) –

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