質問

次のようなクラスがあります:-

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はおそらく削除できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top