2008-10-30 16 views
5

मैं जावा में काफी बड़ी परियोजना पर काम कर रहा हूं। मेरा सवाल है कि मेरे आवेदन के लिए गुणों के सेट को सर्वोत्तम रूप से कैसे व्यवस्थित किया जाए।गुणों के लिए सही दृष्टिकोण

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

दृष्टिकोण 2: गुणों को मुख्य श्रेणी द्वारा तत्काल किया जाना चाहिए और अन्य आवेदन कक्षाओं को सौंप दिया गया है। (नुकसान: आप अंत लगभग हर वर्ग के लिए गुण वस्तु के लिए एक सूचक गुजर और यह बहुत निरर्थक और बोझिल बनने के लिए लगता है, मैं नहीं यह पसंद है।)

कोई सुझाव?

उत्तर

7

मुझे कई गुणों के लिए वसंत निर्भरता इंजेक्शन का उपयोग करना पसंद है। आप अपने आवेदन का इलाज ब्लॉक जैसे ब्लॉक कर सकते हैं और गुणों को इंजेक्ट कर सकते हैं जो उन्हें चाहिए। यह encapsulation (प्रोत्साहित) संरक्षित करता है। फिर, आप अपने घटकों को एक साथ इकट्ठा करते हैं और "मुख्य वर्ग" बनाते हैं।

निर्भरता इंजेक्शन का एक अच्छा दुष्प्रभाव यह है कि आपका कोड अधिक आसानी से परीक्षण योग्य होना चाहिए।

+0

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

1

लगता है जैसे आपको कॉन्फ़िगरेशन प्रबंधक घटक की आवश्यकता है। यह किसी प्रकार की सेवा लोकेटर के माध्यम से मिलेगा, जो ConfigurationManagerClass.instance() जितना सरल हो सकता है। यह सभी मजेदार encapsulate होगा। या आप स्प्रिंग जैसे निर्भरता इंजेक्शन ढांचे का उपयोग कर सकते हैं।

इस बात पर निर्भर करता है कि आपके आर्किटेक्चर में घटक एक दूसरे को कैसे ढूंढते हैं। यदि आपके अन्य घटकों को संदर्भ के रूप में पारित किया जा रहा है, तो ऐसा करें। बस सुसंगत रहें।

0

मैं आमतौर पर एक सिंगलटन ऑब्जेक्ट के लिए जाता हूं जो एक आम प्रोजेक्ट में रहता है और इसमें नामस्थान पर कुंजी का एक हैशटेबल होता है, जिसके परिणामस्वरूप प्रत्येक के लिए एक गुण श्रेणी होती है।

निर्भरता इंजेक्शन भी ऐसा करने का एक अच्छा तरीका है।

2

वास्तव में, दृष्टिकोण 2 वास्तव में अच्छी तरह से काम करता है।

मैंने हाल ही की परियोजना पर सिंगलटन गुण वस्तु का उपयोग करने का प्रयास किया। फिर, जब सुविधाओं को जोड़ने का समय आया, तो मुझे सिंगलटन को संशोधित करने की आवश्यकता है, और मुझे हर जगह का पता लगाने के लिए खेद है जहां मैंने MySingleton.getInstance() का उपयोग किया था।

आपके विभिन्न रचनाकारों के माध्यम से वैश्विक सूचना वस्तु को पारित करने के दृष्टिकोण 2 को नियंत्रित करना आसान है।

एक स्पष्ट सेटर का उपयोग करने में भी मदद करता है।

class MyConfig extends Properties {...} 

class SomeClass { 
    MyConfig theConfig; 
    public void setConfi(MyConfig c) { 
     theConfig= c; 
    } 
    ... 
} 

यह अच्छी तरह से काम करता है, और आप खुश होंगे कि आपने कड़ाई से नियंत्रित किया है कि कौन से वर्गों को वास्तव में कॉन्फ़िगरेशन जानकारी की आवश्यकता है।

+0

मुझे लगता है कि MyConfig में इसे विस्तारित करने के बजाय गुण वस्तु होनी चाहिए। लेकिन यह किसी भी तरह से काम करेगा। – ScArcher2

+0

दृष्टिकोण 2 जाने का रास्ता है। और क्या मैं निर्भरता का प्रबंधन करने के लिए [Guice] (http://code.google.com/p/google-guice/) का उपयोग करने का सुझाव दे सकता हूं। – albertb

+0

मुझे नहीं लगता कि यह कैसे बेहतर है। यदि आप MyConfig (जैसा कि आपने सिंगलटन किया था) को बदल दिया है, तो आपके पास अभी भी संदर्भित सभी स्थानों में परिवर्तन करने के लिए एक ही रिफैक्टरिंग समस्या है (यह निश्चित रूप से परिवर्तन क्या है) पर निर्भर करता है। – Robin

2

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

0

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

बस याद रखें कि कोई भी वर्ग एक द्वीप नहीं है। एक पुन: प्रयोज्य वर्ग में सिंगलोन संदर्भ के मूल को मुक्त रखने के लिए क्लाइंट क्लास हो सकती है।

आप इंटरफेस का भी उपयोग कर सकते हैं, बस इसे अधिक न करने का प्रयास करें।

0

दृष्टिकोण 2 परिभाषित रूप से बेहतर है।

वैसे भी, आपको कॉन्फ़िगर ऑब्जेक्ट के माध्यम से अन्य क्लास खोज नहीं देना चाहिए। आपको ऑब्जेक्ट को कॉन्फ़िगर ऑब्जेक्ट में कॉन्फ़िगर किया गया कॉन्फ़िगर करना चाहिए।

कॉन्फ़िगरेशन इम्प्ल के साथ मदद के लिए apache commons configuration पर एक नज़र डालें।

तो मुख्य() में आप हो सकता था

MyObject mobj = new MyObject(); 
mobj.setLookupDelay(appConfig.getMyObjectLookupDelay); 
mobj.setTrackerName(appConfig.getMyObjectTrackerName); 
के बजाय

MyObject mobj = new MyObject(); 
mobj.setConfig(appConfig); 

जहां appConfig उस पर मूल्य आधार के सभी देखने करना अपाचे विन्यास पुस्तकालय के चारों ओर एक आवरण है कॉन्फ़िगरेशन फ़ाइल में मान का नाम।

इस तरह आपकी वस्तु बहुत आसानी से परीक्षण योग्य हो जाती है।

1

यदि आप कुछ जल्दी ढूंढ रहे हैं तो आप सिस्टम गुणों का उपयोग कर सकते हैं, वे सभी कक्षाओं के लिए उपलब्ध हैं। आप स्ट्रिंग मान स्टोर कर सकते हैं या यदि आपको 'सामान' की एक सूची स्टोर करने की आवश्यकता है तो आप System.Properties() विधि का उपयोग कर सकते हैं। यह एक 'गुण' ऑब्जेक्ट देता है जो हैशटेबल है। फिर आप टेबल में जो कुछ भी चाहते हैं उसे स्टोर कर सकते हैं। यह सुंदर नहीं है लेकिन यह वैश्विक गुणों का एक त्वरित तरीका है। वाईएमएमवी

0

थोड़ी देर के लिए जावा नहीं किया है, लेकिन क्या आप अपनी संपत्तियों को java.lang.System गुणों में नहीं डाल सकते? इस तरह आप हर जगह से मूल्यों तक पहुंच सकते हैं और "वैश्विक" संपत्ति वर्ग से बच सकते हैं।

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