3

我有一个棕地应用程序,它有一个复杂的方法。CC 是 14。if 语句验证应用程序设置并生成适当的内联 SQL。

EG 这个 if 语句检查设置。settings 是自定义代码,一个具有多个bool bool?)属性的 DTO。

        string conditions = " AND (";

        List<string> conditionStrings = new List<string>();

        if (settings.AlwaysIncludeCommonResults && settings.SelectedCommonLabs.Count > 0)
        {
            string common = " (Table.Name in (";
            for (int i = 0; i < settings.SelectedCommonLabs.Count; i++)
            {
                common += string.Format("'{0}'", settings.SelectedCommonLabs[i]);
                if (i < settings.SelectedCommonLabs.Count - 1)
                    common += ", ";
            }
            common += ")) ";
            conditionStrings.Add(common);
        }

        if (settings.AlwaysSelectLast24HoursResults)
        {
            string last24 = " (DateDiff(hh, Table.PerformedDtm, GetDate()) < 24) ";
            conditionStrings.Add(last24);
        }

我不知道该怎么做才能简化这个布尔逻辑。Null 合并?...我不知道这是否会变得更好。这种模式在相同的方法中出现了多次。所以我希望多次重复使用答案以减少整体CC并增加可读性。你有什么建议?

更新
在决定取消第一次验证后,添加了进一步的方法逻辑。

4

1 回答 1

1

我首先会缩小代码:

   string common = " (Table.Name in (";
            for (int i = 0; i < settings.SelectedCommonLabs.Count; i++)
            {
                common += string.Format("'{0}'", settings.SelectedCommonLabs[i]);
                if (i < settings.SelectedCommonLabs.Count - 1)
                    common += ", ";
            }
            common += ")) ";
            conditionStrings.Add(common);

可以缩小:

string common = " (Table.Name in (";
//if SelectedCommonLabs is a collection of strings, LINQ your way through it
common += string.Join(", ", settings.SelectedCommonLabs.ToList().Select(lab => string.Format("'{0}'",lab)));
common += ")) ";
conditionStrings.Add(common);

但我同意这不是很好的代码。

于 2012-05-21T14:43:56.860 回答