更优雅的处理这种逻辑的方式

时间:2012-08-14 08:59:59

标签: c# .net if-statement logic

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;
}

上面的代码运作良好,但我想知道是否有更优雅的方式来编写上述代码。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:3)

我不认为弄乱布尔表达式有很多优点,除了我comment中提到的简单修改。如果你最终得到丑陋的代码,那么你的设计就不那么好了。

在这种情况下,您可以通过以下方式重构责任:

  • 创建过滤器对象列表
  • 在这些对象中实现逻辑

像这样的Pseudocode:

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..