質問
次のようなクラスがあります:-
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このインスタンスでは、このクラスにデータを入力するときにいくつかのビジネスルールを適用する必要があると思います。
アドバイスしてください、 ありがとう
解決
列挙は多くの場合、設計が正しくないというコードの匂いです。この場合、除外リスト機能を基本クラスにリファクタリングしてから、姓と名のフィルター用に個別の派生クラスを追加することで、さらに改善できます。姓のフィルターは汎用フィルターと何の違いもありませんが、名のフィルターも開始文字をチェックします。
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
{
}
他のヒント
そこにあるものを見ると、それぞれが独自のバージョンの ApplyFilter()
- FirstNameFilter
、 LastNameFilter
、 PhoneNumberFilter
など
コードを保存するには、フィルターを定義するために同様のロジックを再利用する必要がある場合に、作成した具体的な実装から単純に派生させることができます。たとえば、その文字を定義し、その ApplyFilter()
メソッドでリストを切り捨てる[abstract] StartCharacterFilter
がある場合、 FirstNameFilter
は単に ApplyFilter()
をオーバーライドし、基本実装を呼び出して、結果を独自のロジックに渡します。
これは不適切なファクタリングのようです。フィルターは明らかに列挙値と強く結びついており、タイプは必要な特定の基準を決定し、そのデータ値は単一のクラスに寄せ集められます。
より「純粋」です関連するデータのみが含まれる個別のフィルタークラスを作成します。その変更を行った場合、enumはおそらく削除できます。