Cara sederhana untuk menjaga pengaturan aplikasi Java diwakili oleh file teks dengan ekstensi ".properties" yang berisi pengidentifikasi setiap pengaturan yang terkait dengan nilai tertentu (nilai ini mungkin berupa angka, string, tanggal, dll.) . C # menggunakan pendekatan yang serupa, tetapi file teks harus dinamai "App.config". Dalam kedua kasus, dalam kode sumber Anda harus menginisialisasi kelas tertentu untuk pengaturan membaca: kelas ini memiliki metode yang mengembalikan nilai (sebagai string) yang terkait dengan pengidentifikasi pengaturan yang ditentukan.
// 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"];
// ...
Dalam kedua kasus kita harus mengurai string yang dimuat dari file konfigurasi dan menetapkan nilai yang dikonversi ke objek yang diketik terkait (kesalahan penguraian dapat terjadi selama fase ini). Setelah langkah penguraian, kita harus memeriksa bahwa nilai pengaturan milik domain validitas tertentu: misalnya, ukuran maksimum antrian harus menjadi nilai positif, beberapa nilai mungkin terkait (misalnya: min <maks ), dan seterusnya.
Misalkan aplikasi harus memuat pengaturan segera setelah dimulai: dengan kata lain, operasi pertama yang dilakukan oleh aplikasi adalah memuat pengaturan. Setiap nilai yang tidak valid untuk pengaturan harus diganti secara otomatis dengan nilai default: jika ini terjadi pada sekelompok pengaturan terkait, semua pengaturan tersebut diatur dengan nilai default.
Cara termudah untuk melakukan operasi ini adalah dengan membuat metode yang mem-parsing semua pengaturan, kemudian memeriksa nilai yang dimuat dan akhirnya menetapkan nilai default apa pun. Namun pemeliharaan sulit jika Anda menggunakan pendekatan ini: karena jumlah pengaturan meningkat saat mengembangkan aplikasi, semakin sulit untuk memperbarui kode.
Untuk mengatasi masalah ini, saya berpikir untuk menggunakan pola Metode Templat , sebagai berikut.
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;
}
}
Masalahnya adalah bahwa dengan cara ini kita perlu membuat kelas baru untuk setiap pengaturan, bahkan untuk nilai tunggal. Apakah ada solusi lain untuk masalah seperti ini?
Singkatnya:
- Perawatan yang mudah: misalnya, penambahan satu atau lebih parameter.
- Extensibility: versi pertama aplikasi dapat membaca file konfigurasi tunggal, tetapi versi yang lebih baru dapat memberikan kemungkinan pengaturan multi-pengguna (admin mengatur konfigurasi dasar, pengguna hanya dapat mengatur pengaturan tertentu, dll.).
- Desain berorientasi objek.