2009-10-26 12 views
10

हाइबरनेट का उपयोग करके एक चुनौती यह है कि मैंग किए गए वर्गों में डिफ़ॉल्ट कन्स्ट्रक्टर होना चाहिए। समस्या यह है कि कोई स्पष्ट बिंदु नहीं है जहां वर्ग प्रारंभ किया गया है और इनवेंचर्स की जांच की जा सकती है।हाइबरनेट मैप किए गए कक्षाओं में इनविरिएंट की जांच करें

यदि किसी वर्ग में वेरिएंट हैं जो एक से अधिक संपत्ति पर निर्भर करते हैं तो कक्षा डिज़ाइन जटिल हो जाता है। के काल्पनिक हरी क्षेत्र डिजाइन के साथ शुरू करते हैं:

public class A { 
    private int x; 
    private int y; 

    public A(int x, int y) { 
     this.x = x; 
     this.y = y; 
     checkInvariants(this.x, this.y); 
    } 

    private void checkInvariants(int x, int y) { 
     if (x + y « 0) throw new IllegalArgumentException(); 
    } 
} 

इस आधार कार्यान्वयन कि हाइबरनेट आवश्यकताओं को पूरा नहीं करता है। परिवर्तक में invariant की जांच की जाती है। (CheckInvariants की सामग्री() विधि कोई प्रभाव नहीं पड़ेगा यह केवल उदहारण देते हैं कि वर्ग अपरिवर्तनशीलताओं अधिक है कि एक संपत्ति पर निर्भर रह सकते प्रस्तुत है।)

वर्ग में इस्तेमाल किया जा सकता है:

new A(0, 0); 
new A(-1, 0); //invalid 
करने के लिए

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

public class H { 
    int x; 
    int y; 

    public H(int x, int y) { 
     this.x = x; 
     this.y = y; 
     checkInvariants(this.x, this.y); 
    } 

    H(){} 

    private void checkInvariants(int x, int y) { 
     if (x + y « 0) throw new IllegalArgumentException(); 
    } 
} 

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

एक दूसरा वैकल्पिक हल उपयोगकर्ता कोड में जांच अपरिवर्तनशीलताओं के लिए है:

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

  • बहुत जटिल नहीं
  • अपने उपयोगकर्ताओं को
  • के बारे में स्पष्ट जानकारी के बिना हाइबरनेट ढांचे के लिए एक निर्भरता के बिना:

    इस समस्या जो है करने के लिए एक बेहतर समाधान है?

मुझे लगता है कि कुछ बाधाओं को व्यावहारिक समाधान प्राप्त करने के लिए कम किया जाना चाहिए। केवल कठोर बाधा यह है कि हाइबरनेट ढांचे के लिए कोई निर्भरता नहीं है। (डोमेन ऑब्जेक्ट्स के बाहर विशिष्ट कोड हाइबरनेट ठीक है)।

(जिज्ञासा से बाहर: क्या एक ओआरएम ढांचा है जो "कन्स्ट्रक्टर इंजेक्शन" का समर्थन करता है?)

+0

इस प्रकार का नियम डेटाबेस में चेक बाधा द्वारा लागू किया जाना चाहिए, जो नियमों का उल्लंघन करने वाले उदाहरणों को लोड करने से बचें। – araqnid

+0

सवाल उत्पादक नहीं है। आप निरंतर बाधा प्रवर्तन के 'मनमानी दर्शन' को लागू करने की कोशिश कर रहे हैं, जो कि परिवर्तनीय डेटा पर है - परिभाषा के अनुसार - एक परमाणु अद्यतन में अद्यतन नहीं किया जा सकता है। आप एक वैध व्यापार या डिजाइन समस्या को हल करने की कोशिश नहीं कर रहे हैं, बस एक ट्रॉली में बीएस को धक्का दे रहे हैं। –

+1

@ थॉमस डब्ल्यू हर किसी के पास अब और उसके बाद एक बुरा दिन है। चीयर्स! (शायद यह मदद कर सकता है कि क्या आपको पता चलता है कि एक आविष्कार क्या है।) –

उत्तर

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