우편 번호가 사용되는 모든 곳에서 유효성 검사 논리를 적용하여 DRY 원칙을 위반하게됩니다.
반면, 여러 국가 및 다른 우편 번호 시스템을 다룰 때, 해당 국가를 모르면 우편 번호를 확인할 수 없습니다. 따라서 ZipCode
수업은 국가를 저장해야합니다.
그러나 국가를 Address
우편 번호의 일부와 우편 번호의 일부 (확인 용) 로 별도로 저장 합니까?
- 그렇게하면 DRY도 위반하는 것입니다. DRY 위반이라고 부르지 않더라도 (각 인스턴스가 다른 목적을 제공하기 때문에) 두 국가 값이 다를 때 (논리적으로 절대로해서는 안되는 버그에 대한 문을 여는 것 외에도) 추가 메모리를 불필요하게 차지합니다. 있다).
- 또는 두 데이터 포인트를 항상 동일하게 유지하기 위해 두 데이터 포인트를 동기화해야하므로,이 데이터를 실제로 단일 포인트에 저장해야하므로 목적을 달성 할 수 없습니다.
- 그렇지 않으면
ZipCode
수업이 아니라 Address
수업이 다시 포함됩니다 string ZipCode
.
예를 들어, 우편 번호가 포함 된 문자열 대신 우편 번호에 대해 비즈니스 분석가에게 문의 할 수 있습니다.
장점은 도메인 모델을 설명 할 때 이에 대해 이야기 할 수 있다는 것입니다.
정보에 특정 변수 유형이있는 경우 비즈니스 분석가와 대화 할 때마다 해당 유형을 언급해야한다는 기본 주장을 이해하지 못합니다.
왜? 왜 단순히 "우편 번호"에 대해 이야기하고 특정 유형을 완전히 생략 할 수 없습니까? 부동산 유형이 대화와 본질적인 관계가있는 비즈니스 분석가 (기술이 아님)와 어떤 종류의 토론을하고 있습니까?
내가 온 곳의 우편 번호는 항상 숫자입니다. 선택의 여지가 있으므로 int
또는로 저장할 수 있습니다 string
. 우리는 데이터에 대한 수학 연산에 대한 기대가 없기 때문에 문자열을 사용하는 경향이 있지만 비즈니스 분석가가 문자열이 필요하다고 말한 적이 없습니다 . 그 결정은 개발자에게 맡겨져 있습니다 (또는 기술 분석가는 아니지만 내 경험으로는 별다른 문제를 직접 다루지는 않지만).
비즈니스 분석가는 응용 프로그램이 예상 한 작업을 수행하는 한 데이터 유형에 신경 쓰지 않습니다.
검증은 인간이 기대하는 것에 의존하기 때문에 다루기 까다로운 짐승입니다.
우선, 나는 원시적 강박 관념을 피해야하는 이유를 보여주기위한 방법으로 검증 논증에 동의하지 않습니다. 왜냐하면 보편적 인 진실로 데이터가 항상 항상 검증되어야한다는 데 동의하지 않기 때문입니다.
예를 들어, 이것이 좀 더 복잡한 조회라면? 간단한 형식 검사가 아닌 검증에서 외부 API에 연결하여 응답을 기다리는 경우 어떻게해야합니까? ZipCode
인스턴스화 하는 모든 객체에 대해 애플리케이션이이 외부 API를 강제로 호출하도록 하시겠습니까?
어쩌면 그것은 엄격한 비즈니스 요구 사항 일 수도 있고 당연히 정당 할 수도 있습니다. 그러나 이것은 보편적 인 진실이 아닙니다. 이것이 솔루션보다 더 많은 부담이되는 사용 사례가 많이있을 것입니다.
두 번째 예로 양식에 주소를 입력 할 때 국가 앞에 우편 번호를 입력하는 것이 일반적입니다. UI에서 즉각적인 유효성 검사 피드백을받는 것이 좋지만 문제의 실제 원인이 (예를 들어) 내 국가는 기본적으로 선택된 국가가 아니므로 잘못된 국가에 대한 유효성 검사가 수행되었습니다.
잘못된 오류 메시지이므로 사용자의주의를 산만하게하고 불필요한 혼란을 초래합니다.
영원한 검증이 보편적 인 진실이 아닌 것과 마찬가지로 나의 예도 아닙니다. 그것은의 문맥 . 일부 응용 프로그램 도메인은 무엇보다도 데이터 유효성 검사가 필요합니다. 다른 도메인은 실제 우선 순위와 충돌하는 번거 로움 (예 : 사용자 경험 또는 결함이있는 데이터를 초기에 저장하여 수정하지 않도록 수정하는 대신 우선 순위 목록)에 우선 순위를 두지 않습니다. 저장)
생년월일 : 생각보다 크고 오늘 날짜보다 작은 지 확인하십시오.
급여 : 0보다 크거나 같은지 확인하십시오.
이러한 유효성 검사의 문제점은 불완전하거나 중복되거나 훨씬 더 큰 문제를 나타냅니다 .
날짜가 생각보다 큰지 확인하는 것은 중복입니다. 마인드는 말 그대로 그것이 가능한 가장 작은 날짜임을 의미합니다. 게다가, 당신은 관련 선을 어디에서 그리나요? 예방 DateTime.MinDate
하지만 허용 하는 요점은 무엇입니까 DateTime.MinDate.AddSeconds(1)
? 다른 많은 값과 비교할 때 특히 잘못되지 않은 특정 값을 선택합니다.
내 생일은 1978 년 1 월 2 일입니다 (그렇지는 않지만 가정합니다). 그러나 응용 프로그램의 데이터가 잘못되었다고 가정하면 내 생일은 다음과 같습니다.
- 1978 년 1 월 1 일
- 1722 년 1 월 1 일
- 2355 년 1 월 1 일
이 모든 날짜가 잘못되었습니다. 그들 중 어느 것도 다른 것보다 "더 옳은"것은 없습니다. 그러나 유효성 검사 규칙은 이 세 가지 예 중 하나만 잡습니다 .
또한이 데이터를 사용하는 방법의 컨텍스트를 완전히 생략했습니다. 예를 들어 생일 알림 봇에서 사용하는 경우 잘못된 날짜를 입력하면 특별한 나쁜 결과가 없으므로 유효성 검사가 의미가 없다고 말하고 싶습니다.
반면, 이것이 정부 데이터이고 누군가의 신원을 인증하기 위해 생년월일이 필요한 경우 (그렇지 않으면 누군가의 사회 보장 거부와 같은 나쁜 결과를 초래할 수 있음), 데이터의 정확성이 가장 중요하며 귀하는 완전 해야합니다. 데이터를 확인하십시오. 현재 제안 된 검증이 충분하지 않습니다.
급여의 경우, 음수가 될 수 없다는 몇 가지 상식이 있습니다. 그러나 비 의미적인 데이터가 입력 될 것이라고 현실적으로 예상한다면이 비 의미적인 데이터의 출처를 조사하는 것이 좋습니다. 중요한 데이터를 입력 할 수없는 경우 올바른 데이터 를 입력 할 수 없습니다 .
대신 급여가 응용 프로그램에서 계산되고 어떻게 든 음수 (정확한) 숫자로 끝나는 것이 가능하다면 Math.Max(myValue, 0)
유효성 검사에 실패하지 않고 음수를 0으로 바꾸는 것이 더 나은 방법입니다 . 논리가 결과가 음수라고 결정한 경우 유효성 검사에 실패하면 계산을 다시 수행해야한다는 의미이므로 두 번째로 다른 숫자가 나올 것이라고 생각할 이유가 없습니다.
그리고 다른 숫자가 나오면 계산이 일관성이 없으므로 신뢰할 수 없음을 의심하게됩니다.
이것은 유효성 검사가 유용하지 않다는 것은 아닙니다. 그러나 무의미한 유효성 검사는 실제로 문제를 해결하지는 못하고 사람들에게 잘못된 보안 감각을 제공하기 위해 노력해야하기 때문에 좋지 않습니다.