1
private bool SearchFilter(object sender)
{
    CommDGDataSource item = sender as CommDGDataSource;
    if (FilterPropertyList.IsErrorFilter)
    {
        if (!item.Error)
            return false;
    }
    if (FilterPropertyList.IsDestinationFilter)
    {
        if (!(item.Destination == FilterPropertyList.Destination))
            return false;
    }
    if (FilterPropertyList.IsSourceFilter)
    {
        if (!(item.Source == FilterPropertyList.Source))
            return false;
    }

    return true;
}

上記のコードはうまく機能しますが、上記のコードをよりエレガントに記述する方法があるかどうか疑問に思っていました。

4

2 に答える 2

4

以下のように小さな変更を加えることで、もう少し読みやすくすることができます

private bool SearchFilter(object sender)
{
    CommDGDataSource item = sender as CommDGDataSource;

    if (FilterPropertyList.IsErrorFilter && !item.Error)
        return false;

    if (FilterPropertyList.IsDestinationFilter && item.Destination != FilterPropertyList.Destination)
        return false;

    if (FilterPropertyList.IsSourceFilter && item.Source != FilterPropertyList.Source)
        return false;

    return true;
}
于 2012-08-14T09:13:34.780 に答える
3

私のコメントで述べたような単純な変更を除いて、ブール式をいじることにはあまりメリットがないと思います。醜いコードになってしまうと、それほど素晴らしいとは言えないデザインになります。

この場合、おそらく次の方法で責任をリファクタリングできます。

  • フィルターオブジェクトのリストの作成
  • それらのオブジェクトにロジックを実装する

この擬似コードのようなもの:

foreach (var filter in filters)
    if !filter.Filter(item) return false;
return true;
public interface IFilter
{
    bool Filter(CommDGDataSource item);
}

public class ErrorFilter : IFilter
{
    public bool Filter(CommDGDataSource item)
    {
        return item.Error;
    }
}

public class DestinationFilter : IFilter
{
    public string Destination { get; set; }

    public bool Filter(CommDGDataSource item)
    {
        return item.Destination == Destination;
    }
}

//etc..
于 2012-08-14T09:24:20.293 に答える