我有一堆遵循这种模式的验证代码:
bool IsBroken()
{
var isBroken = Check(..., "error-1")
| Check(..., "error-2")
...
| Check(..., "error-n");
if (...)
{
isBroken |= Check(..., "error-1")
| Check(..., "error-2")
...
| Check(..., "error-n");
}
else
{
isBroken |= Check(..., "error-1")
| Check(..., "error-2")
...
| Check(..., "error-n");
}
// ...
// Could have more if-else or even nested if-else
return isBroken;
}
bool Check(bool condition, string message)
{
if (condition)
{
errors.Add(message);
}
return condition;
}目标是执行所有检查,而不管结果如何。然而,这段代码的问题是它对分支覆盖不友好。
一个简单的解决方法是用函数体替换Check(bool, string),但这会产生另一个较小的问题,那就是代码混乱。我正在试图找出一个能让我两全其美的解决方案。有什么想法吗?!
发布于 2020-11-18 02:38:44
如果有如此多的重复验证( If -check),并且它们非常短,那么您可以创建一个需要执行的检查字典。将此字典传递给该方法,迭代字典中的项,如果发生验证错误,则添加错误消息。
示例代码:
class A
{
Dictionary<Func<A, bool>, string> dictOfChecks = new Dictionary<Func<A, bool>, string>()
{
//Example of checks , Error Message
{ (arg) => arg.ToString().Length < 3, "Length is smaller than 3" },
{ (arg) => arg.ToString().Length < 2, "Length is smaller than 2" },
};
public bool IsBroken()
{
//there you can enter multiple call of GetErrors to check whether there are some
var errors = GetErrors(dictOfChecks);
return errors.Length == 0;
}
public string[] GetErrors(Dictionary<Func<A, bool>, string> dict)
{
var errors = new List<string>();
foreach (KeyValuePair<Func<A, bool>, string> kvp in dict)
{
if (kvp.Key.Invoke(this))
errors.Add(kvp.Value);
}
return errors.ToArray();
}
}发布于 2020-11-18 04:59:53
想出了一个好的解决方案:
_ = condition && Append("error");
bool Append(string error)
{
errors.Add(error);
return true;
}而这也可以写成if (condition) Append("error")。在我们的例子中,块语句必须写成:
if (condition)
{
...
}https://stackoverflow.com/questions/64880984
复制相似问题