从Validate函数返回额外信息的最佳实践

Fra*_*ans 8 c#

我有一个班级员工.我希望能够在保存之前验证它()以确保所有字段都填充了有效值.类的用户可以在调用Save()之前调用Validate(),或者他们可以直接调用Save(),然后Save()将调用Validate(),如果验证失败,可能会抛出异常.

现在,我的(主要)问题是这个;
如果我的Validate()函数返回一个简单的bool,那么如何告诉用户该类的错误,即"未填写电子邮件","ID不唯一"等.出于此目的,我只想要错误字符串传递给人类用户,但如果我想要一个错误代码列表(除了使位图的使用更符合逻辑),原则是相同的.

  • 我可以在Validate函数中使用Out参数,但我知道这是不赞成的.
  • 我可以从我的函数返回一个字符串数组,而不是返回一个bool,只测试它是否为空(意味着没有错误) - 但这看起来很麻烦而且不对.
  • 我可以创建一个Struct只是为了从这个方法返回,包括一个bool和一个带有错误消息的字符串数组,但只是看起来很笨拙.
  • 我可以返回错误代码的位图而不是bool并查找它,但这似乎相当过分.
  • 我可以在对象上创建一个公共属性"ValidationErrors"来保存错误.但是,这将依赖于我在读取它之前调用Validate()或从Property()显式调用Validate,这有点浪费.

我的具体程序是在C#中,但这看起来像是一个相当通用的"最佳实践"问题,我相信我应该知道答案.任何建议都感激不尽.

Kon*_*lph 6

我可以创建一个Struct只是为了从这个方法返回,包括一个bool和一个带有错误消息的字符串数组,但只是看起来很笨拙.

它为什么看起来很笨重?创建适当的类型来封装信息是完美的.但是,我不一定会使用字符串来编码这些信息.枚举可能更适合.

另一种方法是对返回类型进行子类化,并为每种情况提供额外的子类 - 如果这是合适的话.如果可能发出多个故障信号,则表示阵列正常.但我也会把它封装在一个自己的类型中.

一般模式可能如下所示:

class ValidationInfo {
    public bool Valid { get; private set; }
    public IEnumerable<Failure> Failures { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)


Man*_*nne 5

我可能会选择bitmap-option.只是

[Flags]
public enum ValidationError {
    None = 0,
    SomeError = 1,
    OtherError = 2,
    ThirdError = 4
}
Run Code Online (Sandbox Code Playgroud)

...而在调用代码中,只需:

ValidationError errCode = employee.Validate();
if(errCode != ValidationError.None) {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

对我来说似乎很好,很紧凑.