शुद्ध POCO मॉडल होने का क्या लाभ है?


16

शुद्ध POCO मॉडल होने का मुख्य लाभ क्या है? मुझे लगता है कि मॉडल साफ और सरल होना चाहिए, लेकिन मैं मॉडल कक्षाओं के भीतर बाल वस्तुओं के रखरखाव को पसंद करना चाहता हूं। उदाहरण के लिए यदि मेरे पास एक ClassAऔर ClassBपरिभाषित है:

public class ClassA
{
    public string MyProp { get; set; }
    public IEnumerable<ClassB> Children { get; }

    public void AddChild(ClassB newChild) { /*... */ }
    public void RemoveChild(ClassB child) { /* ... */ }
}

public class ClassB
{
    public string SomeProp { get; set; }
} 

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

हर प्रकार की सहायता का स्वागत है, धन्यवाद।


मैं ऐड / रिमूव मेथड्स को हटा देता हूँ जब तक कि वे कुछ वैल्यू नहीं जोड़ते हैं, जैसे कि एक NullObject के NullObject पैटर्न ऑब्जेक्ट में Null ClassB तर्क का अनुवाद करना:AddChild(ClassB newChild) => Children.Add(newChild ?? new NullClassB())
ग्राहम

यदि आपने कभी सैकड़ों तरीकों के साथ ActiveRecord वर्गों के सिरदर्द से निपटा है, तो हो सकता है कि आप किसी भी समय आप जो चाहते हैं वह नहीं हो सकता है, मुझे लगता है कि अपील को समझना आसान होगा।
केसी

इस विशेष डिज़ाइन से बचने का मुख्य कारण यह है कि यह .net डिज़ाइन दिशानिर्देशों के विरुद्ध जाता है। यह पूरी तरह से मनमाना है, लेकिन लोगों को उम्मीद है कि संग्रह में इसमें उत्परिवर्तन के तरीके होंगे।
फ्रैंक हिलमैन

@ कैसी मैं सक्रिय रिकॉर्ड पैटर्न का उपयोग नहीं कर रहा हूं, ऐड विधि बस कुछ मामूली डेटा सत्यापन कर रहा है। हटाने की विधि वहाँ है क्योंकि संग्रह उजागर नहीं है, वे बस एक आंतरिक सूची से जोड़ते हैं और निकालते हैं। मैंने इसे एक अलग संग्रह प्रकार का उपयोग करने के लिए बदल दिया है, जो मुझे ऐड / रिमूव मेथड में बिल्ट का उपयोग करते हुए सत्यापन करने की अनुमति देता है।
जेसी

जवाबों:


44

आपके दो प्रश्न असंबंधित हैं।

शुद्ध POCO मॉडल होने का क्या लाभ है?

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

पीओसीओ पीओजेओ विचार से अधिक कुछ नहीं है। J को C में बदल दिया गया क्योंकि लोग आपको मजाकिया अंदाज में देखते हैं जब आप एक अवधारणा को समझाते हैं जिसमें जावा का नाम होता है यदि वे लोग C # का उपयोग कर रहे हैं। विचार भाषा पर निर्भर नहीं है। वे बस इसे प्लेन ओल्ड ऑब्जेक्ट कह सकते थे। लेकिन POO का उपयोग करने के बारे में कौन डींग मारना चाहता है?

मैं फाउलर को उत्पत्ति की व्याख्या करने दूंगा:

यह शब्द रेबेका पार्सन्स, जोश मैकेंजी और मैं सितंबर 2000 में एक सम्मेलन में एक वार्ता के लिए तैयार कर रहे थे। हमने सोचा कि लोग अपने सिस्टम में नियमित वस्तुओं का उपयोग करने के खिलाफ क्यों थे और यह निष्कर्ष निकाला कि यह सरल वस्तुओं में एक फैंसी नाम की कमी थी। इसलिए हमने उन्हें एक दिया, और यह बहुत अच्छी तरह से पकड़ा गया।

martinfowler.com: POJO

अपने अन्य प्रश्न के रूप में:

क्या जोड़ने और हटाने के तरीकों में कुछ गड़बड़ है?

मुझे Aसीधे तौर पर जानना पसंद नहीं है B। लेकिन यह डीआईपी वाली बात है न कि पीओजेओ की चीज।


मुझे Bसरलता के लिए सीधे निर्भरता थी , आदर्श रूप से ये दोनों इंटरफेस लागू करेंगे। लेकिन Aअभी भी की एक सूची है IInterfaceB। क्या AddChildविधि के साथ कुछ गलत है अगर बच्चों को इंटरफ़ेस संदर्भों के माध्यम से शिथिल किया जाता है?
जेसी

6
मैं सादगी की खातिर मूर्खतापूर्ण चीजों की पूरी मेजबानी कर सकता हूं। मुझे जो पसंद नहीं है वह ए के बारे में जानना है। ए बी का उपयोग नहीं करता है इसलिए बी के माध्यम से बात करने के लिए एक उचित स्वामित्व वाले इंटरफ़ेस को परिभाषित करने की आवश्यकता नहीं है। जहाँ तक मैं बता सकता हूँ कि A एक संग्रह है। तो A को B के साथ <T> के माध्यम से व्यवहार करना चाहिए, इसलिए उसे इसके बारे में कोई बात नहीं जाननी चाहिए।
कैंडिड_ऑरेंज

2
मैंने "सादे पुराने डेटा ऑब्जेक्ट" के लिए "PODO" भी देखा है, जो किसी भी प्रकार की भाषा के लिए नहीं है। PODO थोड़ा मूर्खतापूर्ण लगता है (थोथा लगता है जैसे कि आप एक टाटिटाइन पर सुनेंगे, मेरे लिए), POJO या POCO I से अधिक इसलिए कि मुझे लगता है, लेकिन POO की तुलना में काफी कम मूर्खतापूर्ण है।
केरान

2
मुझे आश्चर्य है कि अगर फाउलर की प्रस्तुति उन्हें POO कहती तो कितना अच्छा लगता?
ओलिवर

3

जोड़ें और निकालें के साथ आप Collection<T>सुविधाओं को लागू कर रहे हैं । अपने आप से पूछें कि आप या कुछ अन्य उत्परिवर्तित वर्ग के IEnumerable<T>बजाय क्यों उपयोग कर रहे हैं List<T>? जाहिरा तौर पर ऐसा नहीं है क्योंकि आपके संग्रह को आसानी से पढ़ा जाना चाहिए।

मेरे विचार से एकमात्र कारण यह है कि आप नियंत्रित करना चाहते हैं कि आप किन एक्सेस विधियों को प्रकाशित करना चाहते हैं। उस मामले में यह आपके खुद के संग्रह वर्ग बनाने के लिए अच्छा होगा, एक सूची संलग्न करें, अपने चुनिंदा तरीकों को लागू करें और निकालें और लागू करें IEnumerable<T>। फिर IEnumerable<T>अपने बच्चों के संग्रह के प्रकार के बजाय इसका उपयोग करें।

लेकिन यह मुझे लगता है List<ClassB>कि शायद आप अच्छी तरह से सेवा करेंगे।


0

इससे क्या AddChildजोड़ना और RemoveChildहटाना है? यदि यह डेटाबेस (या किसी भी प्रकार की दृढ़ता की दुकान) से है, तो आपको एक सक्रिय रिकॉर्ड मिला है। जरूरी नहीं कि हमेशा एक बुरी चीज हो, लेकिन यह निश्चित रूप से आपको फ्रेमवर्क, सम्मेलनों, निर्भरता, आदि के बारे में चिंता करने के करीब हो जाता है, जैसा कि @CandiedOrange उल्लेख है।

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

एकमात्र कारण यह थोड़ा जटिल हो जाता है, क्योंकि ऐसा लगता है कि आपको ठीक से प्रबंधित करने की आवश्यकता है कि क्लासबी कैसे जुड़ा और क्लासए से अलग हो गया। इसलिए आपको लागू करने के लिए थोड़ा व्यवहार करना होगा। आप इसे या तो कक्षा के भीतर लागू कर सकते हैं (जो पूरी तरह से "कानूनी" है; देखें /programming//a/725365/44586 ), या आपके पास कुछ अलग वर्ग हो सकते हैं जिनमें वह व्यवहार हो। वह करें जो आपकी व्यक्तिगत परिस्थितियों के लिए सबसे ज्यादा मायने रखता है।

किसी भी मामले में, POJO / POCO वास्तव में सिर्फ OOP है जैसा कि यह होना चाहिए था, अनियंत्रित और बिना लाइसेंस के। OOP सिद्धांतों का पालन करें और आप सुरक्षित रहेंगे।


वास्तव में AddChild केवल दोहराव, और अशक्तता के लिए जाँच कर रहा है, और या तो अनुमति नहीं दे रहा है। RemoveChild वहाँ है क्योंकि पिछले दरवाजे को रोकने के लिए संग्रह को एक IEnumerable के रूप में उजागर किया गया है। यह केवल संग्रह से मानक हटाने का प्रदर्शन करेगा।
जेसी

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

मुझे लगता है कि एक्टिव रिकॉर्ड सिर्फ एक बुरा पैटर्न है।
केसी

1
@ कैसी, आपको उस बारे में मुझसे कोई तर्क नहीं मिलेगा। लेकिन अगर कोई इसका इस्तेमाल करना चाहे तो मैं बहस नहीं करूंगा। मुख्य बिंदु यह था कि यदि जेसी ने सक्रिय रिकॉर्ड की तरह एक पैटर्न का उपयोग करने का इरादा किया, जो मॉडल परिभाषा के साथ दृढ़ता को एकीकृत करता है, तो उसे सभी समस्याएं होती हैं CandiedOrange हाइलाइट्स, और वास्तव में एक POCO के रूप में योग्य नहीं होगा, जो कि इसके लायक है। लेकिन वह वैसे भी नहीं कर रहा है।
जॉन एम गेंट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.