জাভা অ্যাপ্লিকেশনটির সেটিংস রাখার একটি সহজ উপায় ".properties" এক্সটেনশন সহ একটি নির্দিষ্ট মানের সাথে সংযুক্ত প্রতিটি সেটিংয়ের শনাক্তকারী সমন্বিত একটি পাঠ্য ফাইল দ্বারা উপস্থাপিত হয় (এই মানটি একটি সংখ্যা, স্ট্রিং, তারিখ ইত্যাদি হতে পারে)) । সি # তে একটি অনুরূপ পন্থা ব্যবহার করে তবে পাঠ্য ফাইলটির নাম অবশ্যই "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;
}
}
সমস্যাটি হ'ল এইভাবে আমাদের প্রতিটি সেটিংয়ের জন্য এমনকি একটি একক মানের জন্য একটি নতুন শ্রেণি তৈরি করা দরকার। এই ধরণের সমস্যার কী অন্যান্য সমাধান আছে?
সংক্ষেপে:
- সহজ রক্ষণাবেক্ষণ: উদাহরণস্বরূপ, এক বা একাধিক পরামিতিগুলির সংযোজন।
- এক্সটেনসিবিলিটি: অ্যাপ্লিকেশনটির প্রথম সংস্করণটি একটি একক কনফিগারেশন ফাইলটি পড়তে পারে তবে পরবর্তী সংস্করণগুলি বহু-ব্যবহারকারী সেটআপের সম্ভাবনা দিতে পারে (অ্যাডমিন একটি বেসিক কনফিগারেশন সেটআপ করে, ব্যবহারকারীরা কেবল কিছু নির্দিষ্ট সেটিংস সেট করতে পারেন ইত্যাদি)।
- অবজেক্ট ওরিয়েন্টেড ডিজাইন।