유효성 검사 코드를 배치 할 수있는 옵션을 살펴 보겠습니다.
- 빌더의 세터 내부.
build()
방법 내부 .
- 생성 된 엔티티 내부 :
build()
엔티티가 작성 될 때 메소드 에서 호출됩니다 .
옵션 1을 사용하면 문제를 조기에 감지 할 수 있지만 전체 컨텍스트 만있는 입력의 유효성을 검사하여 build()
방법 의 유효성 검사 중 적어도 일부를 수행하는 복잡한 경우가있을 수 있습니다 . 따라서 옵션 1을 선택하면 한 부분에서 유효성 검사의 일부가 수행되고 다른 부분에서 다른 부분이 수행되는 코드가 일치하지 않게됩니다.
옵션 2 는 옵션 1보다 크게 나쁘지 않습니다. 일반적으로 빌더의 setter는 build()
, 특히 유창한 인터페이스에서 바로 호출되기 때문 입니다. 따라서 대부분의 경우 문제를 조기에 발견 할 수 있습니다. 그러나 빌더가 오브젝트를 작성하는 유일한 방법이 아닌 경우, 오브젝트를 작성하는 모든 위치에 있어야하기 때문에 유효성 검증 코드가 복제됩니다. 이 경우 가장 논리적 인 해결책은 유효성 검사를 생성 된 개체, 즉 그 내부에 최대한 가깝게하는 것입니다. 그리고 이것은 옵션 3 입니다.
SOLID 관점에서 빌더에 유효성 검증을하는 것도 SRP를 위반합니다. 빌더 클래스는 이미 오브젝트를 구성하기 위해 데이터를 집계해야합니다. 유효성 검사는 자체 내부 상태로 계약을 수립하는 것이며 다른 개체의 상태를 확인하는 것은 새로운 책임입니다.
따라서 제 관점에서 볼 때 디자인 관점에서 늦게 실패하는 것이 좋을뿐만 아니라 빌더 자체가 아닌 생성 된 엔티티 내부에서 실패하는 것이 좋습니다.
UPD : 이 의견 은 빌더 (옵션 1 또는 2) 내부의 유효성 검사가 의미가있을 때 한 가지 가능성을 상기시킵니다. 빌더가 작성중인 오브젝트에 대한 자체 계약이 있으면 의미가 있습니다. 예를 들어, 특정 컨텐츠 (예 : number ranges list)로 문자열을 구성하는 빌더가 있다고 가정하십시오 1-2,3-4,5-6
. 이 빌더에는와 같은 메소드가있을 수 있습니다 addRange(int min, int max)
. 결과 문자열은 이러한 숫자에 대해 전혀 알지 못하며 알 필요도 없습니다. 빌더 자체는 문자열의 형식 및 숫자의 제한 조건을 정의합니다. 따라서 메소드 addRange(int,int)
는 입력 숫자의 유효성을 검사하고 max가 min보다 작은 경우 예외를 발생시켜야합니다.
즉, 일반적인 규칙은 빌더 자체에서 정의한 계약 만 유효성 검증하는 것입니다.