Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 降低设置验证的圈复杂度_C# - Fatal编程技术网

C# 降低设置验证的圈复杂度

C# 降低设置验证的圈复杂度,c#,C#,我有一个brownfield应用程序,它有一个复杂的方法。CC是14。if语句验证应用程序设置并生成适当的内联SQL 例如,此if语句检查设置。设置是自定义代码,是一个具有多个bool(非bool?)属性的DTO string conditions = " AND ("; List<string> conditionStrings = new List<string>(); if (settings.AlwaysIncl

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

例如,此if语句检查设置。设置是自定义代码,是一个具有多个
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);
        }
string conditions=“AND(”;
列表条件字符串=新列表();
如果(settings.AlwaysIncludeCommonResults&&settings.SelectedCommonLabs.Count>0)
{
string common=“(Table.Name in(”;
对于(int i=0;i
我不知道如何简化这个bool逻辑。Null coalesce?…我不知道它是否会使它变得更好。这个模式在同一种方法中会出现多次。因此我希望多次重复使用该答案,以减少总体CC并提高可读性。您有何建议

已更新

在决定删除第一次验证后,添加了进一步的方法逻辑。

我首先要稍微收缩代码:

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

但我同意这不是一个很好的代码开始。

这看起来和感觉都是错误的…如果没有结果返回,为什么代码要浪费时间构建复杂的SQL语句?@alex-同意。我应该在更高的级别上撕碎它。该方法仍然需要存在(记住,像这样的if语句还有很多)当查询有实际条件时。因此,任何改进这种逻辑的建议仍然很有用。我很想看看该方法的其他部分。也许还有其他地方,你不能执行检查,而不是试图修复它们。如果不完全看到,修复一个复杂的序列是不容易的。@Alex-updated.IMO,代码非常可怕。希望这里有一些东西可以挽救…我建议至少将代码移动到一堆存储过程中,您可以使用简单的参数来驱动,或者(更好)参数化的
SqlCommand
s这就是为什么我说内联SQL是邪恶的。不是因为技术本身不可读,而是因为开发人员倾向于使用该技术做的事情是邪恶的。同意101%也可能出现注入问题。最初的只是一个冗长的连接。转换该方法做得好!–P.Brian.Mackey 17分钟前
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);