जावा एप्लिकेशन की सेटिंग्स को रखने का एक सरल तरीका एक विशिष्ट मान के साथ जुड़े प्रत्येक सेटिंग के पहचानकर्ता वाले ".properties" एक्सटेंशन के साथ एक पाठ फ़ाइल द्वारा दर्शाया गया है (यह मान एक संख्या, स्ट्रिंग, दिनांक, आदि हो सकता है।) । C # एक समान दृष्टिकोण का उपयोग करता है, लेकिन पाठ फ़ाइल का नाम "App.config" होना चाहिए। दोनों ही मामलों में, स्रोत कोड में आपको सेटिंग पढ़ने के लिए एक विशिष्ट वर्ग को इनिशियलाइज़ करना होगा: इस क्लास में एक विधि है जो निर्दिष्ट सेटिंग आइडेंटिफ़ायर से जुड़े मान (स्ट्रिंग के रूप में) लौटाती है।
// Java example
Properties config = new Properties();
config.load(...);
String valueStr = config.getProperty("listening-port");
// ...
// C# example
NameValueCollection setting = ConfigurationManager.AppSettings;
string valueStr = setting["listening-port"];
// ...
दोनों ही मामलों में हमें कॉन्फ़िगरेशन फ़ाइल से लोड किए गए तारों को पार्स करना चाहिए और संबंधित टाइप किए गए ऑब्जेक्ट में कनवर्ट किए गए मान निर्दिष्ट करना चाहिए (इस चरण के दौरान पार्सिंग त्रुटियां हो सकती हैं)। पार्सिंग चरण के बाद, हमें यह देखना होगा कि सेटिंग मान वैधता के एक विशिष्ट डोमेन से संबंधित हैं: उदाहरण के लिए, कतार का अधिकतम आकार एक सकारात्मक मान होना चाहिए, कुछ मान संबंधित हो सकते हैं (उदाहरण: न्यूनतम <अधिकतम ), और इसी तरह।
मान लीजिए कि एप्लिकेशन को शुरू होते ही सेटिंग्स को लोड करना चाहिए: दूसरे शब्दों में, एप्लिकेशन द्वारा किया गया पहला ऑपरेशन सेटिंग्स को लोड करना है। सेटिंग्स के लिए किसी भी अमान्य मानों को डिफ़ॉल्ट मानों के साथ स्वचालित रूप से प्रतिस्थापित किया जाना चाहिए: यदि यह संबंधित सेटिंग्स के समूह के साथ होता है, तो उन सेटिंग्स को डिफ़ॉल्ट मानों के साथ सेट किया जाता है।
इन ऑपरेशनों को करने का सबसे आसान तरीका एक ऐसी विधि बनाना है जो पहले सभी सेटिंग्स को पार्स करता है, फिर लोड किए गए मानों की जांच करता है और अंत में किसी भी डिफ़ॉल्ट मान को सेट करता है। हालाँकि यदि आप इस दृष्टिकोण का उपयोग करते हैं तो रखरखाव मुश्किल है: जैसे-जैसे एप्लिकेशन को विकसित करते समय सेटिंग्स की संख्या बढ़ती है, कोड को अपडेट करना तेजी से मुश्किल हो जाता है।
इस समस्या को हल करने के लिए, मैंने निम्नानुसार टेम्पलेट विधि पैटर्न का उपयोग करने के बारे में सोचा था ।
public abstract class Setting
{
protected abstract bool TryParseValues();
protected abstract bool CheckValues();
public abstract void SetDefaultValues();
/// <summary>
/// Template Method
/// </summary>
public bool TrySetValuesOrDefault()
{
if (!TryParseValues() || !CheckValues())
{
// parsing error or domain error
SetDefaultValues();
return false;
}
return true;
}
}
public class RangeSetting : Setting
{
private string minStr, maxStr;
private byte min, max;
public RangeSetting(string minStr, maxStr)
{
this.minStr = minStr;
this.maxStr = maxStr;
}
protected override bool TryParseValues()
{
return (byte.TryParse(minStr, out min)
&& byte.TryParse(maxStr, out max));
}
protected override bool CheckValues()
{
return (0 < min && min < max);
}
public override void SetDefaultValues()
{
min = 5;
max = 10;
}
}
समस्या यह है कि इस तरह से हमें प्रत्येक सेटिंग के लिए, यहां तक कि एक मूल्य के लिए एक नया वर्ग बनाने की आवश्यकता है। क्या इस तरह की समस्या के अन्य समाधान हैं?
संक्षेप में:
- आसान रखरखाव: उदाहरण के लिए, एक या अधिक मापदंडों का जोड़।
- एक्स्टेंसिबिलिटी: एप्लिकेशन का पहला संस्करण एकल कॉन्फ़िगरेशन फ़ाइल पढ़ सकता है, लेकिन बाद के संस्करण बहु-उपयोगकर्ता सेटअप की संभावना दे सकते हैं (व्यवस्थापक एक बुनियादी कॉन्फ़िगरेशन सेट करता है, उपयोगकर्ता केवल कुछ सेटिंग्स सेट कर सकते हैं, आदि)।
- वस्तु उन्मुख डिजाइन।