我有一个具有复杂方法的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
决定拆除第一次验证后,添加了进一步的方法逻辑。
这看起来感觉不对......为什么代码浪费时间构建复杂的SQL语句,如果没有结果将被返回? – Alex
@alex - 同意。我应该在更高的层面上把这个提高。该方法仍然需要存在(请记住,如果像这样的语句更多)查询具有实际条件时。所以任何改善这种逻辑的建议都是有帮助的。 –
我很想看到其他方法..也许还有其他地方,你可以只是*不*执行检查,而不是试图修复它们。修复一个复杂的序列并不完全看它是不容易的。 – Alex