Genellikle etki alanı nesneleri yerleşik bir türle temsil edilebilecek, ancak geçerli değerleri bu türle temsil edilebilecek değerlerin bir alt kümesi olan özelliklere sahiptir.
Bu durumlarda, değer yerleşik tip kullanılarak saklanabilir, ancak değerlerin her zaman giriş noktasında doğrulandığından emin olmak gerekir, aksi takdirde geçersiz bir değerle çalışabiliriz.
Bunu çözmenin bir yolu, değeri yerleşik türün structtek bir private readonlydestek alanına sahip olan ve yapıcısı sağlanan değeri doğrulayan bir özel olarak depolamaktır . Daha sonra bu structtürü kullanarak her zaman yalnızca onaylanmış değerleri kullandığımızdan emin olabiliriz .
Ayrıca, temeldeki yerleşik türden gelen ve bu türe döküm operatörleri sağlayabiliriz, böylece değerler altta yatan tür olarak sorunsuz bir şekilde girebilir ve çıkabilir.
Örnek olarak, bir etki alanı nesnesinin adını temsil etmemiz gereken bir durum ele alalım ve geçerli değerler, uzunluğu 1 ile 255 karakter arasında olan herhangi bir dizedir. Bunu aşağıdaki yapıyı kullanarak temsil edebiliriz:
public struct ValidatedName : IEquatable<ValidatedName>
{
private readonly string _value;
private ValidatedName(string name)
{
_value = name;
}
public static bool IsValid(string name)
{
return !String.IsNullOrEmpty(name) && name.Length <= 255;
}
public bool Equals(ValidatedName other)
{
return _value == other._value;
}
public override bool Equals(object obj)
{
if (obj is ValidatedName)
{
return Equals((ValidatedName)obj);
}
return false;
}
public static implicit operator string(ValidatedName x)
{
return x.ToString();
}
public static explicit operator ValidatedName(string x)
{
if (IsValid(x))
{
return new ValidatedName(x);
}
throw new InvalidCastException();
}
public static bool operator ==(ValidatedName x, ValidatedName y)
{
return x.Equals(y);
}
public static bool operator !=(ValidatedName x, ValidatedName y)
{
return !x.Equals(y);
}
public override int GetHashCode()
{
return _value.GetHashCode();
}
public override string ToString()
{
return _value;
}
}
Örnek gösterir to stringolarak dökme implicitolarak bu başarısız asla ama dan- stringolarak dökme explicitolarak bu geçersiz değerler için fırlatır, tabii bunlar her ikisi de ya olabilir implicitveya explicit.
Ayrıca, bu yapıyı yalnızca bir döküm yoluyla stringbaşlatabileceğini, ancak böyle bir dökümün IsValid staticyöntemi kullanarak önceden başarısız olup olmayacağını test edebileceğini unutmayın .
Bu, basit türlerle temsil edilebilen alan değerlerinin doğrulanmasını zorunlu kılmak için iyi bir model gibi görünebilir, ancak sık sık kullanıldığını veya önerildiğini görmüyorum ve nedeniyle ilgileniyorum.
Benim sorum şu: Bu modeli kullanmanın avantajları ve dezavantajları olarak neler görüyorsunuz ve neden?
Bunun kötü bir kalıp olduğunu düşünüyorsanız, neden ve ne hissettiğinizin en iyi alternatif olduğunu anlamak istiyorum.
NB Başlangıçta Stack Overflow üzerine bu soruyu sordum ama öncelikle görüş tabanlı (kendi başına ironik olarak öznel) olarak beklemeye alındı - umarım burada daha fazla başarı elde edebilirsiniz.
Yukarıda orijinal metin, birkaç düşünce daha altında, kısmen orada beklemeden önce alınan cevaplara yanıt olarak:
- Cevaplar tarafından yapılan en önemli noktalardan biri, özellikle bu tür birçok tip gerektiğinde, yukarıdaki model için gerekli olan kazan plakası kodunun miktarı idi. Ancak, kalıbın savunmasında, bu şablonlar kullanılarak büyük ölçüde otomatik hale getirilebilir ve aslında bana göre çok da kötü görünmüyor, ama bu sadece benim düşüncem.
- Kavramsal bir bakış açısından, C # gibi güçlü yazılan bir dille çalışırken, güçlü yazılan prensibi bileşik değerlere uygulamak yerine garip görünmüyor. yerleşik tip?