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 回答