2011-08-29 18 views
8

अक्सर मुझे कॉन्फ़िगर करने योग्य कार्यक्षमता वाले ऑब्जेक्ट्स को इंजीनियर करने की आवश्यकता मिलती है।जावा कॉन्फ़िगरेशन/पैरामीटर पासिंग डिज़ाइन

उदाहरण के लिए, मान लें कि मैं DateIterator बना रहा हूं। कॉन्फ़िगर करने योग्य विकल्प यह हो सकता है कि बंद अंतराल [start, end] या ओपन एंड अंतराल [start, end) को फिर से चालू करना है या नहीं।


  • (1), मेरी राय में, नमकहराम समाधान - केवल एक सही/गलत विन्यास विकल्प के लिए सीमित
new DateIterator(boolean openInterval); 
  • (2) typesafe enum तरीका है - आम तौर पर एक बिट भारी
new DateIterator(Interval.OPEN_END); 
  • (3) unconv entional प्रयास - अच्छा, लेकिन नहीं भी सीधे आगे
new DateIterator().openEnd(); 
  • (4) विरासत दृष्टिकोण - अक्सर से अधिक इंजीनियरिंग
new OpenEndedDateIterator(); 

इस में कुछ विकल्प जो मैं अवर पर विचार आता है करने के लिए

, पूर्णांक-आधारित कॉन्फ़िगरेशन new DateIterator(Interval.OPEN_END); या संपत्ति आधारित कॉन्फ़िगरेशन की तरह।

क्या कोई अन्य दृष्टिकोण है? आप किस दृष्टिकोण से पसंद करते हैं?

उत्तर

6

मैं कहेंगे बिल्डर पैटर्न यहाँ समझ में आता है:

DateIterator di = 
    DateIterator.builder() 
       .withStartDate(new Date()) 
       .withOpenEnd() 
       .build(); 

इस तरह अपने वास्तविक DateIterator, अपरिवर्तनीय हो सकता है, जबकि बिल्डर DateIterator.builder() द्वारा लौटाए गए विन्यास काम करता है।

1

जबकि वहाँ कोई अच्छा जवाब है, और यह काफी हद तक स्वाद की बात है, मैं अपवाद से अधिक इंजीनियरिंग से बचने के लिए के लिए बड़ी जगह के साथ अंगूठे का निम्नलिखित नियम का पालन करते हैं,: केवल विन्यास अगर आपके पास

  1. एक "पैरामीटर" है, एक निश्चित सेट ले रहा है, और व्यवहार बदलता है (जैसे आपके उदाहरण में), सबक्लास के साथ जाएं। हालांकि यह अधिक इंजीनियर हो सकता है, यदि आपकी कक्षा में कई विधियां "if (this.parameter == x) से शुरू होती हैं ... और यदि (this.parameter == y) .." यह कोड को अपठनीय बना देगा।
  2. यदि आपका पैरामीटर एक निश्चित सेट नहीं है, लेकिन एक स्ट्रिंग या नंबर है, और आपको इसे कक्षा में काम करने के लिए उचित रूप से काम करने की आवश्यकता है, तो यह अनिवार्य नहीं है कि मुझे समाधान संख्या (3) पसंद है, अपरंपरागत प्रयास:)
  3. यदि आपके पास एक निश्चित सेट (जैसे START_OPEN_ENDED और STOP_OPEN_ENDED) में एक से अधिक पैरामीटर हैं, तो सबक्लास बनाने के लिए प्रत्येक क्रमपरिवर्तन के लिए उप-वर्ग बनाना हो सकता है। उस मामले में encapsulation पर विचार करें। उदाहरण के लिए (मैं इसे इस विशिष्ट मामले में शायद नहीं करूँगा, लेकिन यह एक अच्छा उदाहरण है), एक एकल श्रेणी डेटकॉम्पेटर बनाएं, खुले अंत के लिए उप-वर्ग के साथ, और शुरुआत के लिए डेटकंपेटर को समाहित करें और अंत में एक के साथ, केवल एक DateIterator।

फिर, ये अंगूठे का नियम है जिसका उपयोग मैं अनिवार्य रूप से नहीं करता हूं, और अक्सर मैं खुद को वर्बैटिम का सम्मान नहीं करता हूं।