Bir Java uygulamasının ayarlarını korumanın basit bir yolu, belirli bir değerle ilişkilendirilmiş her bir ayarın tanımlayıcısını içeren ".properties" uzantılı bir metin dosyası ile gösterilir (bu değer bir sayı, dize, tarih vb. Olabilir). . C # benzer bir yaklaşım kullanır, ancak metin dosyası "App.config" olarak adlandırılmalıdır. Her iki durumda da, kaynak kodunda ayarları okumak için belirli bir sınıfı başlatmalısınız: bu sınıf, belirtilen ayar tanımlayıcıyla ilişkilendirilmiş değeri (dizge olarak) döndüren bir yönteme sahiptir.
// 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"];
// ...
Her iki durumda da, yapılandırma dosyasından yüklenen dizeleri ayrıştırmalı ve dönüştürülen değerleri ilgili yazılan nesnelere atamalıyız (bu aşamada ayrıştırma hataları oluşabilir). Ayrıştırma adımından sonra, ayar değerlerinin belirli bir geçerlilik alanına ait olduğunu kontrol etmeliyiz: örneğin, bir sıranın maksimum boyutu pozitif bir değer olmalı, bazı değerler ilişkili olabilir (örnek: min <max ), ve bunun gibi.
Uygulamanın, ayarları en kısa sürede başlatması gerektiğini varsayalım: başka bir deyişle, uygulamanın ilk yaptığı işlem ayarları yüklemektir. Ayarlar için geçersiz olan değerler otomatik olarak varsayılan değerlerle değiştirilmelidir: bu, ilgili bir ayar grubuna gelirse, bu ayarların tümü varsayılan değerlerle ayarlanır.
Bu işlemleri gerçekleştirmenin en kolay yolu, önce tüm ayarları ayrıştıran, sonra yüklenen değerleri kontrol eden ve son olarak varsayılan değerleri ayarlayan bir yöntem oluşturmaktır. Ancak bu yaklaşımı kullanırsanız bakım zordur: uygulamayı geliştirirken ayar sayısı arttıkça kodu güncellemek giderek zorlaşır.
Bu sorunu çözmek için, Şablon Yöntemi modelini şu şekilde kullanmayı düşündüm .
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;
}
}
Sorun, bu şekilde, her bir ayar için tek bir değer için bile yeni bir sınıf yaratmamız gerektiğidir. Bu tür bir sorunun başka çözümleri var mı?
Özetle:
- Kolay bakım: örneğin, bir veya daha fazla parametrenin eklenmesi.
- Genişletilebilirlik: uygulamanın ilk sürümü tek bir yapılandırma dosyasını okuyabilir, ancak daha sonraki sürümler çok kullanıcılı bir kurulum imkanı sağlayabilir (admin temel bir yapılandırma ayarlar, kullanıcılar yalnızca belirli ayarları ayarlayabilir, vb.).
- Nesneye yönelik tasarım.