2016-08-01 17 views
3

주어진 개체에 대해 특정 유효성 검사를 수행해야하는 프로젝트의 디자인 단계에 있습니다. 유효성 검사는 5 개의 개별 그룹으로 그룹화 할 수 있습니다. 각 개별 유효성 검사기 범주에는 해당 구현에서 약간 다른 여러 버전이있을 수 있습니다.입력에 따라 다른 유효성 검사기

public interface Validator { 
boolean validate(Object o); 
} 

public abstract CostValidator implements Validator { 
//common logic related to cost validator 
} 

public class CostValidator1 extends CostValidator { 
boolean validate(Object o) { 
    //implementation 1 
} 

public class CostValidator2 extends CostValidator { 
boolean validator(Object o) { 
    //implementation 2 
} 

개체의 비즈니스 그룹에 따라 CostValidator1 또는 CostValidator2를 실행해야합니다. 구성에 기초로부터 처리 흐름은 검증 목록을 가져올 것이다

BusinessGroupA { 
validators = [CostValidator1, SomeOtherValidator2...] 
} 

BusinessGroupB { 
validators = [CostValidator2, AnotherValidator99...] 
} 

enter image description here

각 비즈니스 그룹

는, I는 구성 시스템 즉, 이러한 검증의 목록을 유지 관리 계획 포함 된 각 유효성 검사기에서 유효성 검사를 실행합니다.

이 접근법에 결함이 있습니까? 내가 설명한 사용 사례를 해결할 더 좋은 방법이 있습니까?

에게 는
+0

요구 사항이 주어진다면 더 나은 설계 방법이 있는지 알고 싶습니다. 내 프로젝트가 설계 단계에 있기 때문에 최대한 많은 대안을 탐구하고 싶습니다. – Rahul

+0

왜 검증 논리가 별도의 클래스 (들)로 만들어 지는지에 대한 특별한 이유가 있습니까? 왜 객체가 스스로를 검증 할 수 없습니까? 'if (! object1.isValid()) {...} ' –

+0

개체가 속한 비즈니스 그룹에 따라 CostValidator1 또는 CostValidator2 또는 비용 유효성 검사가 적용되지 않습니다. 마찬가지로 그룹 A에 속한 개체는 파이프 라인에 3 개의 유효성 검사기를 가질 수 있으며 B에 속한 개체는 5가 있습니다. 또한 향후 필요한 변경 사항에 따라 개체를 하나의 비즈니스 그룹에서 다른 그룹으로 이동할 수 있습니다. 이 개체는 다양한 구성 요소에 의해 작동되며 비즈니스 논리의 자체 측면을 구현합니다. 여기에 나열된 유효성 검사기는 이러한 논리 그룹 중 하나에 속합니다. 또한 객체 클래스의 코드베이스는보다 기능적인 접근법을 따른다. OO – Rahul

답변

1
나는 위의 솔루션이 개 개선을 추가하는 제안 할

:

1. 보증에 필요한 유효성 검사 규칙 관련 검증을 실행해야 각 사업 그룹이 가정

의 존재가 있어야한다 구성이 충분한 유효성 검사 규칙, 즉 유효성 검사 클래스를 지정하도록 보장하는 일부 메커니즘. 수십 개의 속성과 수백 개의 비즈니스 그룹이있는 경우 구성에 오류가 생기기 쉽습니다. 즉, 비용에 대한 유효성 검사기를 지정하지 않아야합니다. 내 제안은 비즈니스 개체의 수준에 어떤 속성에 유효성 검사기가 필요한지 지정하는 것입니다. 그런 다음 비즈니스 그룹 및 유효성 검사 요구 사항에 따라 개체에 유효성 검사기를 바인딩 할 개체 팩토리를 만듭니다.

나는이 방법을 따를 것입니다

:

  1. 는 검증의 각 유형, 예를 들면위한 인터페이스를 만들기를 ICostValidator 및 IWeightValidator입니다. 구성에서
  2. 는 비즈니스 오브젝트에 필요한 검증 인터페이스, 예컨대 : 목록을 유지

    requiredValidators = [ICostValidator, IWeightValidator]

  3. BusinessGroupA 또는 BusinessGroupB에서 유효성 검사를 실행할 때 항상 구성된 유효성 검사기가 모든 requiredInterfaces를 구현하는지 확인하십시오.

2. 분리는 특정 Business Object

는 비용과 무게 검증을 살펴보면에서 유효성 검사기는 지금은 비즈니스 오브젝트에 바인딩됩니다. 클래스 다이어그램의 나머지 부분을 알지는 못하지만, 비용, 가중치 등의 속성이 Item, QuotationLine, SalesOrderLine, ShippingLine 등과 같은 여러 비즈니스 객체에 나타날 것이라고 상상할 수 있습니다. 그런 다음 유효성 검사기를 사용하는 것이 좋습니다. 비즈니스 객체에 직접 의존하지 않으며 여러 비즈니스 객체에 쉽게 적용 할 수 있습니다.객체 팩토리에서 유효성 검사기와 기본 객체 간의 적절한 바인딩을 처리 할 수도 있습니다.

몇 가지 코드 예제를 알려주십시오.

+0

응답 해 주셔서 감사합니다! 1. 이것은 매우 유효한 지적이며 일부 유효성 검사기가 실수로 누락되지 않도록하기위한 몇 가지 메커니즘을 적용 할 생각입니다. 나는 이것을 디자인에 반영 할 것이다. 2. 당신 말이 맞아요. 현재 여러 비즈니스 객체에서 작동하는 유효성 검사기의 유스 케이스는 보이지 않지만 앞으로는 어떤 변경이 필요할 지 확신 할 수 없습니다. 답변에서 언급 한 첫 번째 요점을 달성하는 데 대한 자세한 내용을 제공 할 수 있습니까? – Rahul

+0

@Rahul 방금 내 응답을 업데이트했습니다 ... –

관련 문제