我在尝试返回结合函数调用错误集的结果时遇到了困难。
我从以下方法开始
List<String> errors;
bool result = Obj.GetResult(out errors, int id);
第二步是引入新类
public class OperationResult
{
public bool Result {get;set;}
public List<string> Errors {get;set;}
}
但随后脏代码开始出现在 GetResult 方法中。
例如
public OperationResult GetResult(int id)
{
if (id == 0)
{
return new OperationResult { Result = false, Errors = {"Error"}};
}
if (id < 400)
{
var result = new OperationResult { Result = false, Errors = {"Error"}};
if (id >200)
result.Errors.Add("Error");
return result;
}
}
然后我开始担心不允许结果用户编辑他们得到的结果。
我已经从只能读取数据的 OpearationResult 类中提取了接口(interface)。
现在我想添加结果生成器类...
在这一点上,我开始认为我做错了什么。尝试重新发明自行车,或者只是凭空制造问题。
请给我一个建议,如何处理所有这些东西。 我也很好奇这在函数式编程语言中是如何处理的。 (我的意思是不变性)
最佳答案
这可能是开始抛出异常的时候了。 在他的书中Clean Code , Robert Martin 谈到了当你做这样的事情时代码的困惑和缺乏可读性:
CustomResult result = myUser.CanLogOn();
因为从阅读代码中可以看出,CanLogOn 应该简单地返回一个 bool 值,指示用户是否被允许登录,但现在它得到一个包含错误代码等的自定义结果对象。这将导致您进一步污染您的用类似的东西编写代码
if(result.Result)
LogOn();
代替
if(myUser.CanLogOn())
LogOn();
甚至更好
myUser.LogOn()
让它决定是否可以。
这是一个简化的示例,因为我假设除了数据库异常之外,CanLogOn() 方法中不会出现很多可能的错误。
虽然您不应该为正常流程使用异常,但它们的存在部分是为了防止这种输出值模式和返回错误代码,并且需要知道返回代码 200 和 402 之间的区别和-134。
这将使您的代码更清晰、更易于阅读,并且可能会提示您检查您是否真的需要所有这些异常,如果需要,此方法是否是抛出它们的最佳位置。
关于c# - 如何使用函数的错误列表返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5790100/