什么是返回布尔值和字符串值的最佳做法
我创建了一个方法,对运行时在Javascript文本中由另一个类动态生成的XML Hierarchy执行一些validation。
我的方法当前返回True或False,这对使用我的类的任何人都有帮助,但我还想返回更多信息,因为可能有几个原因可能会抛出一个False消息。
起初我想将返回类型从bool更改为具有String键和布尔值的某些Generic Collection类型我不知道这是否是最好的方法。
在这种情况下,最佳实践是什么?
像上课一样
public class ValidationResponse { public bool Successful { get; set; } public string Information { get; set; } }
并返回ValidationResponse的对象
.NET数据类型的TryParse
方法(例如Int32.TryParse )中使用的一种模式在C世界中非常常见,它返回一个布尔值来表示成功或失败。 用户还必须通过引用方法传入值以接收解析后的值。
根据您的情况,您的方法签名可能如下所示:
bool DoSomething (out string anInformativeMessage)
但是我个人认为最好的方法是返回Dhinesh在他的回答中描述的Result
类,因为它更灵活,而且本质上是OO。 我正在为完整性添加这种方法;)
-
创建您自己的结果类,您的方法返回该结果类,其中包含您需要的所有信息。 有了这个,你可以在将来更容易地扩展它(如dhinesh的回答。)
-
另一种选择是使用
Tuple
对象来存储string
和bool
:Tuple
将是你的返回类型。 (仅适用于.NET 4.0及更高版本)
如其他答案中所建议的那样将Result类创建为新的返回类型存在破坏现有代码的问题。
如果您希望/需要避免这种情况,您可以引入一个新的string LastError
属性,该属性包含上次调用方法的错误消息,并保持方法签名不变。 你会喜欢它
bool success = myObject.MyMethod(); if(!success) Console.Error.WriteLine(myObject.LastError);
这种方法不适合multithreading环境。
如果预期 XML层次结构将validation – 那么我会说这是一个应该使用exception的典型示例。 然后该方法返回void并抛出失败,如下所示:
void validateXMLHierarchy();
并使用
try { validateXMLHierarchy(); } catch (XmlValidationException ex) { Console.Error.WriteLine(ex.Message); }
我不知道最佳实践,但如果您只有以下两种情况:
- 返回true,没有额外信息
- 返回false,附加额外信息
然后你可以将它简化为只返回一个字符串。 如果没有错误,则返回一个空字符串,该字符串相当于零错误代码。
string errorMsg = myObject.MyMethod(); if (errorMsg != String.Empty) { Console.Error.WriteLine(errorMsg); }