2009-10-22 9 views
0

J'ai une classe comme suit: -conception objet/classe Question

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 
} 

Notez que seulement s'il est marqué comme FilterFirstName il exigera la propriété StartCharacter.

Le code ci-dessus est-il correct ou dois-je séparer le filtre FirstName et le filtre LastName car ils nécessitent des propriétés différentes? Coz Je pense que dans ce cas, certaines règles métier doivent être appliquées lors de la saisie des données dans cette classe.

conseils S'il vous plaît, Merci

Répondre

2

énumérations sont souvent une odeur de code que votre conception est pas tout à fait raison. Dans ce cas, vous pouvez faire mieux en refactorisant la fonctionnalité de la liste d'exclusion dans une classe de base, puis en ajoutant des classes dérivées distinctes pour les filtres de prénom et de nom. Le filtre de nom ne ferait rien d'autre que le filtre générique, mais le filtre de premier nom vérifierait également le caractère de départ.

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

Donc, en termes de conception de base de données, je dois stocker chaque objet en tant que table individuelle alors? Comme firstnamefilter table et lastnamefilter table? – Joshscorp

+0

Non, j'irais avec une approche de type enum pour votre base de données. Ce serait bien dans ce contexte. –

1

En regardant ce que vous avez là, il semble que ce serait le plus logique d'avoir plusieurs classes qui héritent de IFilterCondition défini que chaque outil pleinement leur propre version de ApplyFilter()-FirstNameFilter, LastNameFilter, PhoneNumberFilter, etc.

Pour enregistrer du code, vous pouvez simplement dériver d'une implémentation concrète que vous créez si et quand vous avez besoin de réutiliser une logique similaire pour définir le filtre. Par exemple, vous pouvez avoir un [abstract] StartCharacterFilter qui définit ce caractère et tronque la liste dans sa méthode ApplyFilter() puis, FirstNameFilter remplacerait simplement ApplyFilter(), appelle l'implémentation de base et transmet le résultat à sa propre logique.

1

Cela ressemble à un affacturage incorrect. Le filtre est apparemment fortement couplé avec une valeur enum, et le type détermine quels critères spécifiques il a besoin, et les valeurs de données pour cela sont mélangées dans une seule classe.

Il est plus «pur» d'avoir des classes de filtre séparées avec seulement des données pertinentes contenues dans chacune d'elles. L'énumération peut probablement être supprimée si vous faites ce changement.

Questions connexes