我有一个 Employee 类。我希望能够在保存之前对其进行 Validate() 以确保所有字段都已填充有效值。 该类的用户可以在调用 Save() 之前调用 Validate(),或者他们可以直接调用 Save(),然后 Save() 将调用 Validate(),如果验证失败,则可能会抛出异常。
现在,我的(主要)问题是这样的;
如果我的 Validate() 函数返回一个简单的 bool 值,那么我该如何告诉该类的用户出了什么问题,即“电子邮件未填写”、“ID 不唯一”等。为此,我只需要错误字符串传递给人类用户,但如果我想要一个错误代码列表,原理是相同的(除了使位图的使用更合乎逻辑)。
- 我可以在我的验证函数中使用 Out 参数,但我知道这是不受欢迎的。
- 我可以从我的函数返回一个字符串数组,然后测试它是否为空(意味着没有错误),而不是返回一个 bool 值 - 但这看起来很乱而且不正确。
- 我可以创建一个 Struct 只是为了从此方法返回,包括一个 bool 和一个带有错误消息的字符串数组,但看起来很笨重。
- 我可以返回错误代码的位图而不是 bool 值并查找它,但这似乎太过分了。
- 我可以在保存错误的对象上创建一个公共(public)属性“ValidationErrors”。但是,这将依赖于我在读取它之前调用 Validate() 或从 Property() 显式调用 Validate,这有点浪费。
我的特定程序是用 C# 编写的,但这看起来像是一个相当通用的“最佳实践”问题,我确信我应该知道答案。非常感谢收到任何建议。
最佳答案
I could create a Struct just to return from this method, including a bool and a string array with error messages, but just seems clunky.
为什么看起来很笨重?创建一个合适的类型来封装信息是完美的。不过,我不一定会使用字符串来编码此类信息。枚举可能更合适。
另一种方法是对返回类型进行子类化,并为每种情况提供一个额外的子类——如果这合适的话。如果可能会发出不止一个故障信号,则可以使用数组。但我也会将其封装在自己的类型中。
一般模式可能是这样的:
class ValidationInfo {
public bool Valid { get; private set; }
public IEnumerable<Failure> Failures { get; private set; }
}
关于c# - 从 Validate 函数返回额外信息的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1043579/