일반적으로 도메인 개체에는 기본 제공 형식으로 표시 될 수 있지만 유효한 값은 해당 형식으로 표시 될 수있는 값의 하위 집합 인 속성이 있습니다.
이 경우 내장 유형을 사용하여 값을 저장할 수 있지만 입력 시점에서 항상 값의 유효성을 검사해야합니다. 그렇지 않으면 유효하지 않은 값으로 작업 할 수 있습니다.
이를 해결하는 한 가지 방법은 값을 기본 제공 유형의 struct단일 private readonly백업 필드가 있고 생성자가 제공된 값의 유효성을 검증 하는 사용자 정의로 저장하는 것 입니다. 그런 다음이 struct유형 을 사용하여 항상 검증 된 값만 사용할 수 있습니다.
또한 기본 제공 유형에서 캐스트 연산자를 제공하여 값이 기본 유형으로 원활하게 들어오고 나갈 수 있습니다.
도메인 개체의 이름을 나타내야하는 상황을 예로 들어 설명합니다. 유효한 값은 길이가 1 ~ 255 자 사이의 문자열입니다. 다음 구조체를 사용하여이를 나타낼 수 있습니다.
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;
}
}
예 쇼는 투 string로 캐스팅 implicit이 아니라는 실패하지 않을 수 있지만 단으로 string같은 캐스팅 explicit이 같은 유효하지 않은 값을 던질 것이다, 그러나 물론이 두 수 중 수 implicit또는 explicit.
또한 from from cast를 통해서만이 구조체를 초기화 할 수 string있지만 IsValid static메소드를 사용하여 이러한 cast가 미리 실패하는지 테스트 할 수 있습니다 .
이것은 간단한 유형으로 표현 될 수있는 도메인 값의 유효성 검사를 시행하기에 좋은 패턴 인 것 같지만 자주 사용되거나 제안되는 것을 보지 못하고 그 이유에 관심이 있습니다.
제 질문은이 패턴을 사용할 때의 장단점과 그 이유는 무엇입니까?
이것이 나쁜 패턴이라고 생각한다면, 왜 그리고 당신이 느끼는 것이 최선의 대안인지 이해하고 싶습니다.
NB 나는 원래 Stack Overflow에 대해이 질문을 했지만 기본적으로 의견 기반 (철의 자체 주관적)으로 유지되었습니다. 더 많은 성공을 누릴 수 있기를 바랍니다.
위의 내용은 부분적으로 보류되기 전에받은 답변에 대한 응답으로 몇 가지 생각 아래에있는 원본입니다.
- 대답에 의해 만들어진 주요 포인트 중 하나는 특히 많은 유형이 필요한 경우 위 패턴에 필요한 보일러 플레이트 코드의 양에 관한 것입니다. 그러나 패턴을 방어 할 때 템플릿을 사용하여 대부분 자동화 할 수 있으며 실제로 나에게 그렇게 나쁘지는 않지만 내 의견입니다.
- 개념적 관점에서 C #과 같은 강력한 형식의 언어로 작업 할 때 강력한 형식의 원칙을 복합 값에만 적용하는 것이 아니라 복합 인스턴스에만 적용 할 수있는 값으로 확장하는 것이 아니라 내장 타입?