2012-05-21 20 views
3

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

E.G.这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); 
     } 

我不知道该怎么做才能简化这个布尔逻辑。空合并?...我不知道它会使这更好。这种模式在同一个方法中出现了几次。所以我希望多次重复使用这个答案来减少整体CC并提高可读性。你有什么建议?

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

+3

这看起来感觉不对......为什么代码浪费时间构建复杂的SQL语句,如果没有结果将被返回? – Alex

+0

@alex - 同意。我应该在更高的层面上把这个提高。该方法仍然需要存在(请记住,如果像这样的语句更多)查询具有实际条件时。所以任何改善这种逻辑的建议都是有帮助的。 –

+0

我很想看到其他方法..也许还有其他地方,你可以只是*不*执行检查,而不是试图修复它们。修复一个复杂的序列并不完全看它是不容易的。 – Alex

回答

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

但我同意这是不是很漂亮的代码开始。

+1

这就是为什么我说内联SQL是邪恶的。并不是因为技术本身是不可读的,因为开发者倾向于使用该技术的东西是邪恶的。 –

+0

约定101%也可能出现注射问题 – Alex

+0

原来只是一个漫长的缠绕加入。转换该方法的好工作! - P.Brian.Mackey 17分钟前 –