2013-01-14 2 views
4

특정 개체 (해당 개체의 필드)에 대한 유효성 검사기를 디자인하고 있습니다. 이러한 객체는 하나의 큰 객체 - 컨테이너로 묶여 있습니다.자바 - 유효성 검사기, 클래스 계층 구조 설계

예 : 자동차 용 컨테이너. 휠, 엔진, 바디로 구성됩니다. 바퀴가 정확한 직경을 가지고 엔진의 용량이 정확하고 몸의 길이가 일정한 지 확인해야한다고 말합니다.

이론적으로 나는 컨테이너 (자동차)를 만들기 전에 모든 것을 검증해야한다고 생각합니다.

이것을 달성하는 가장 좋은 방법은 무엇입니까? validate() 메서드를 사용하여 추상 유효성 검사기 클래스를 만들고 모든 동봉 클래스에 구현합니까? 컨테이너는 무엇입니까? 유효성 검증 프로세스에서 컨테이너를 전혀 포함하지 않습니까? 도와 주셔서 감사합니다.

+2

유효하지 않은 컨테이너는 유효한 구성 요소로 만들어 질 수 있습니다. 일치하지 않으면 전체 컨테이너에 대해 심각한 유효성 검사 방법이 필요할 수 있습니다. – h22

답변

2

유효성 검사 로직을 유효성 검사 대상 클래스에 넣지 않는 것이 좋습니다.

이러한 클래스를 단순한 값 개체 인으로 유지하고 유효성 검사기의 병렬 계층 구조를 생성하는 것이 좋습니다. 각 개체의 유효성을 검사하는 데 대략 하나씩 유효합니다. 또는 모든 엔티티를 확인할 수있는 단일 유효성 검사기를 만들 수도 있습니다. 그러나이 솔루션은 확장 성이 떨어지며 새 엔티티를 추가해야 할 때 open-closed principle을 위반할 수 있습니다 (예 : 후면 엔티티도 처리하려는 경우) 자동차의 뷰 미러).

one entity : one validator 접근법을 선택한다고 가정하면 컨테이너의 유효성 검사기는 먼저 컨테이너 내부의 구성 요소의 유효성을 검사 한 다음 일치하는지 확인합니다.

Apache Commons Validator과 같은 유효성 검사기 프레임 워크를 사용하면 상용구 코드 작성을 방지 할 수 있습니다. 그러나 어떤 종류의 복잡한 검증이 필요한지 알지 못하기 때문에 사용자의 요구에 맞는 것인지 여부를 알지 못합니다.

또한, 나는 그것이 만들어지기 전에 모든 것을 검증해야한다고 생각하지 않는다. 나중에 생성하고 유효성 검사를 수행합니다. 유효성 검사 규칙을 위반하는 경우 삭제할 수 있습니다 (즉, 어디에서도 유지하지 않음).

+1

클래스 내부에 유효성 검사를하면 SRP가 중단됩니다. – PositiveGuy

1

validate 메서드를 사용하여 ValidatablePart 인터페이스를 만들고 모든 파트에서이 인터페이스를 구현하도록 한 다음 컨테이너가 컨테이너에 추가 될 때 또는 컨테이너의 빌드 또는 기타 방법을 호출 할 때 모든 포함 된 파트의 유효성을 검사하도록 할 수 있습니다 그것은 그것을 구성하기로되어 있습니다.

컨테이너 클래스는 Template Method Design Pattern을 따를 수 있습니다.

1

gd1 답변에 피기 백킹, 나는 동의합니다. 이러한 방법 중 하나는 각 값 개체에 대해 ValidatorAdapter를 갖는 것입니다. 그래서 그 결과는 다음과 같습니다

public class GreenCarValidator { 
    public GreenCarValidator(Car car) { 
     // save reference 
    } 

    @Override 
    public boolean isValid() { 
     return car.getColor().equals("green"); 
    } 
} 

public class RedCarValidator { 
    public RedCarValidator(Car car) { 
     // save reference 
    } 

    @Override 
    public boolean isValid() { 
     // you could compose more validators here for each property in the car object as needed 
     return car.getColor().equals("red"); 
    } 
} 

이제 객체, 런타임에 동적 및 구성의 단일 유형에 대한 유효성 검사기의 많은 유형을 가질 수 있습니다. gd1과 같은 클래스에 "valid()"메서드를두면 사용자가하지 않는 것이 좋습니다. 이러한 유연성을 잃을 것입니다.