2009-10-22 4 views
0

У меня есть класс следующим образом: -Объект/Класс Дизайн Вопрос

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

class FilterName : IFilterCondition 
{ 
    public NameFilterEnum NameFilterEnum{ get; set; } 

    public List<Name> ExcludeList { get; set; } 

    public char StartCharacter{ get; set; } 

    #region IFilterCondition Members 

    public List<Name> ApplyFilter(List<Name> namesToFilter) 
    { 
     switch (NameFilterEnum) 
     { 
      case NameFilterEnum.FilterFirstName: 
       // Check Exclude List 
       // Check Start Character 
       break; 
      case NameFilterEnum.FilterLastName: 
       // Check Exclude List only 
       break; 
      default: 
       break; 
     } 
     return namesToFilter; 
    } 

    #endregion 
} 

enum NameFilterEnum 
{ 
    None, 
    FilterFirstName, 
    FilterLastName 
} 

Обратите внимание, что только если он помечен как FilterFirstName то потребуется свойство StartCharacter.

Правильно ли это или следует отделить фильтр FirstName и фильтр LastName, поскольку они требуют разных свойств? Coz Я думаю, что в этом случае некоторые бизнес-правила необходимо применять при вводе данных в этот класс.

Пожалуйста, советы, Благодаря

ответ

2

Перечисления часто код запах, что ваш дизайн не совсем верно. В этом случае вы могли бы добиться большего, переработав функциональность списка исключений в базовый класс, а затем добавив отдельные производные классы для фильтров первого и последнего имени. Фильтр последнего имени не будет отличаться от общего фильтра, но фильтр первого имени также будет проверять начальный символ.

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

Глядя на то, что у тебя там, кажется, что это сделало бы больше смысла иметь несколько классов, которые наследуют от IFilterCondition определено, что каждый полностью реализовать свою собственную версию ApplyFilter() - FirstNameFilter, LastNameFilter, PhoneNumberFilter, и т.д. .

Чтобы сохранить код, вы можете просто проиллюстрировать конкретную реализацию, которую вы создаете, если и когда вам нужно повторно использовать аналогичную логику для определения фильтра. Например, у вас может быть [аннотация] StartCharacterFilter, которая определяет этот символ и усекает список в его методе ApplyFilter(), тогда FirstNameFilter просто переопределит ApplyFilter(), вызовет базовую реализацию и передаст результат в свою собственную логику.

1

Это похоже на неправильный факторинг. По-видимому, фильтр тесно связан с значением перечисления, и тип определяет, какие конкретные критерии ему нужны, а значения данных для них смешаны в один класс.

Это более «чистый», чтобы иметь отдельные классы фильтров, содержащие только соответствующие данные, содержащиеся в каждом. Перечисление, возможно, будет удалено, если вы сделаете это изменение.

Смежные вопросы