2008-10-08 4 views
1

나는 많은 다른 가능성이 있기 때문에 결코 그렇게 잘 디자인하지 못했습니다. 그리고 그들은 모두 장단점이 있습니다. 어쨌든, 여기 내 문제가있다, 나는 많은 다른 느슨한 관련 클래스에 대한 유효성 검사가 필요하다. 그러나 이러한 클래스 중 일부는 유효성 검사를 수행하는 데 추가 정보가 필요합니다. 객체를 확인하는 데 사용할 수있는 validate 메소드를 갖고 싶습니다. 객체가 인터페이스로 유효성을 검사 할 수 있는지, 예를 들어 Validatable이라고 말하고 싶습니다. 다음은 내가 가질 수있는 두 가지 기본 솔루션입니다.Validate 인터페이스를위한 상속의 디자인

interface Validatable { 
    public void validate() throws ValidateException; 
} 
interface Object1Validatable { 
    public void validate(Object1Converse converse) throws ValidateException; 
} 
class Object1 implements Object1Validatable { 
    ... 
    public void validate() throws ValidateException { 
    throw new UnsupportedOperationException(); 
    } 
} 
class Object2 implements Validatable { 
    ... 
    public void validate() throws ValidateException { 
    ... 
    } 
} 

이 내가 validatable 구현 내가 유효성을 검사 할 validate()를 사용할 수있어 일반 전역 인터페이스 뭔가를함으로써 최초의 솔루션이지만, 오브젝트 1이이 그래서의 defunc 종류의 지원하지 않지만 Object2 그것을 지원합니다 그래서 많은 다른 수업이있을 수 있습니다.

다른 방법으로는 최상위 인터페이스없이 나를 버릴 수도 있습니다.

interface Object1Validatable { 
    public void validate(Object1Converse converse) throws ValidateException; 
} 
class Object1 implements Object1Validatable { 
    ... 
    public void validate(Object1Converse converse) throws ValidateException { 
    ... 
    } 
} 
interface Object2Validatable { 
    public void validate() throws ValidateException; 
} 
class Object2 implements Object2Validatable { 
    ... 
    public void validate() throws ValidateException { 
    ... 
    } 
} 

나는 내가 가지고있는 가장 큰 문제는 내가 종류의 나는 적어도 X 또는 Y 개체가 validatable 말할 수 있도록 최고 수준의 인터페이스를 가지고있는 아이디어의 붙어 있다고 생각합니다. 이것에 대해

답변

2

무엇 :

interface Validatable { 
    void validate(Validator v); 
} 

class Object1 implements Validatable{ 
    void validate(Validator v){ 
    v.foo 
    v.bar 
    } 
} 
class Object1Converse implements Validator{ 
//.... 
} 
class Object2 implements Validatable{ 
    void validate(Validator v){ 
    //do whatever you need and ingore validator ? 
    } 
} 

당신은 Object2는 불필요한 논쟁을 받으면 무슨 상관? 그것없이 제대로 작동 할 수 있다면 그냥 무시할 수 있습니까?

object2와 Object1Converse 사이에 불필요한 종속성이 도입 될 염려가 있다면 인터페이스를 분리하여 유효성 검사기로 사용하기 만하면됩니다.

이제는 자체 검증 할 수있는 개체와 외부 상태 정보가 필요한 개체가 이상한 소리를 확인하는 혼합 모델을 추가해야합니다.

설명해 주겠니?

+0

타입 검사와 아무런 문제없이 효과적으로 validate 메소드로 전달 될 수있는 것은 문제를 일으킬 수 있습니다. –

+0

미래의 개발자에게 아무 정보도 전달하지 않으므로 Object를 사용하지 않을 것이므로 형식을 validator 개체로 제한했습니다. 나는 여전히 다른 행동 (자기 자신과 외부 적으로 유효성을 검사 할 수있는)에 공통적 인 인터페이스를 적용하려고 할 때 잘못된 점이 있다고 생각한다. – Jean

+0

어쩌면 당신 말이 맞을 수도 있습니다. 아마도 Class (또는 Object 현재 상속 된 인터페이스)에 메서드를 추가하는 경우 일 수 있습니다. –

0

아마 여기 apache commons validator 프로젝트가 유용 할 것입니다. 직접적으로 또는 문제를 공격하는 방법에 대한 모델로 유용 할 것입니다. 그들은 유효성 검사를 수행하는 객체의 병렬 세트를 효과적으로 가지므로 객체에 인터페이스가 없으므로 객체/클래스에 대한 관련 유효성 검사기가 있는지 여부 만 있습니다.

+0

여기에있는 인터페이스로 인해 유효성이 검증되고 유효하지 않은 객체의 혼합 목록을 쉽게 탐색 할 수 있습니다 ... – Jean

+0

Unfortunatley는 유효성 검증 유형이 아니며 여기서 더 자세히 살펴볼 것입니다. 경편 한, 감사합니다. –

0

이것은 C#으로되어 있지만 동일한 아이디어가 다른 많은 언어에서도 구현 될 수 있습니다.

public class MyClass { 
    //Properties and methods here 
} 

public class MyClassValidator : IValidator<MyClass> { 
    IList<IValidatorError> IValidator.Validate(MyClass obj) { 
     //Perform some checks here 
    } 
} 

//... 

public void RegisterValidators() { 
    Validators.Add<MyClassValidator>(); 
} 

//... 

public void PerformSomeLogic() { 
    var myobj = new MyClass { }; 
    //Set some properties, call some methods, etc. 
    var v = Validators.Get<MyClass>(); 
    if(v.GetErrors(myobj).Count() > 0) 
     throw new Exception(); 
    SaveToDatabase(myobj); 
} 
0

"개체를 검증 할 수 있습니까?"문제에 대한 간단한 해결책은 세 번째 인터페이스를 추가하는 것입니다.

이 세 번째 인터페이스는 부모가 다른 인터페이스를 비공개로 체크 할 수 있다는 것을 의미하는 비어있는 인터페이스입니다 (검증 할 수있는 스푸핑에 대해 걱정하지 않는다고 가정 할 때). 그러면 유효성 검사와 반복적으로 검사합니다 인터페이스를 실제로 검증해야하는 경우

예 : 나는 그것을 나는 그냥 유효성 검사 (객체 O를)이 줄이 방법을 수행하는 다음 각 클래스는 객체의 종류에 전달,하지만 거기 될 결정할 수 있었다면

interface Validateable 
{ 
} 

interface EmptyValidateable inherits Validateable //Or is it implements? 
{ 
    void validate() throws ValidateException; 
} 

interface Objectvalidateable inherits Validateable 
{ 
    void validate(Object validateObj); 
}