2009-10-22 7 views
0

나는 클래스가 있습니다.객체/클래스 디자인 질문

위의 내용이 맞습니까? 아니면 다른 속성이 필요하기 때문에 이름 필터와 성 필터를 구분해야합니까? Coz 제 생각에는이 클래스에 데이터를 입력 할 때 일부 비즈니스 규칙을 적용해야합니다.

하십시오 조언, 감사

답변

2

열거은 종종 당신의 디자인은 꽤 괜찮없는 코드 냄새입니다. 이 경우 제외 목록 기능을 기본 클래스로 리팩터링 한 다음 성과 이름 필터에 별도의 파생 클래스를 추가하여 더 효과적으로 수행 할 수 있습니다. 성 필터는 제네릭 필터와 다른 것은 수행하지 않지만 이름 필터는 시작 문자를 검사합니다. FirstNameFilter, LastNameFilter, PhoneNumberFilter 등 - 당신이 거기에있어이 각각 완전히 ApplyFilter()의 자신의 버전을 구현하는 것이 정의 IFilterCondition에서 상속 여러 클래스를 가질 수있는 가장 나을 것 같다 무엇을 찾고

interface IFilterCondition 
{ 
    List<Name> ApplyFilter(List<Name> namesToFilter); 
} 

abstract class FilterName : IFilterCondition 
{ 
    public List<Name> ExcludeList { get; set; } 

    public virtual List<Name> ApplyFilter(List<Name> namesToFilter) 
    { 
     // Check Exclude List 
     return namesToFilter; 
    } 
} 

class FilterFirstName : FilterName 
{ 
    public char StartCharacter{ get; set; } 

    public override List<Name> ApplyFilter(List<Name> namesToFilter) 
    { 
     namesToFilter = base.ApplyFilter(namesToFilter); 

     // Check Start Character 
     return namesToFilter; 
    } 
} 

class FilterLastName : FilterName 
{ 
} 
+0

그래서 데이터베이스 디자인 측면에서 각 개체를 개별 테이블로 저장해야합니까? firstnamefilter 테이블 및 lastnamefilter 테이블과 마찬가지로? – Joshscorp

+0

아니요, 저는 데이터베이스에 enum 유형 접근 방식을 사용합니다. 그 맥락에서 괜찮을 것입니다. –

1

코드를 저장하려면 유사한 논리를 다시 정의하여 필터를 정의해야하는 경우 작성한 구체적인 구현에서 간단히 파생시킬 수 있습니다. 예를 들어, 해당 문자를 정의한 StartCharacterFilter을 가지고 있고 ApplyFilter() 메서드에서 목록을 자르면 은 ApplyFilter()을 단순히 재정의하고 기본 구현을 호출하고 결과를 자체 논리로 전달합니다.

1

이것은 부적절한 인수 분해처럼 보입니다. 필터는 분명히 enum 값과 강하게 결합되어 있으며 유형에 따라 필요한 특정 기준이 결정되고 해당 데이터 값이 단일 클래스로 뒤죽박죽으로 전달됩니다.

각각 내에 포함 된 관련 데이터 만 사용하여 별도의 필터 클래스를 갖는 것이 "순수"합니다. 변경 사항을 적용하면 열거 형을 제거 할 수 있습니다.