如何从方法传递消息和数据

时间:2011-04-07 20:27:13

标签: oop error-handling

我是一名大多数自学成才的程序员,我从未真正理解的一个方面是如何返回数据(松散使用的术语)和方法中的状态消息。

例如,假设我有一个采用搜索词并返回查询结果的方法。如果调用者返回一个空数据集,它将如何知道它是否为空,因为没有匹配项或为空,因为与数据库的连接存在错误。

我使用了使用out或ref参数的API,但似乎不太理想。也许这是例外的全部要点。如果它无法连接到数据库,该方法将抛出异常,因此调用者将知道它是否收到没有结果而没有异常,然后根本就没有结果。我是否会创建自己的对象,其中包含数据和状态消息?

也许我正在思考这个问题,或者错过了OOP的一些基本观点。

我希望了解从方法返回状态或错误消息和数据的最佳方法。

我不确定这是属于程序员还是StackOverflow,因为它可能被认为是主观的,如果Stack是错误的地方,那就很抱歉。

3 个答案:

答案 0 :(得分:2)

这是例外情况的一部分。

在他的书Clean Code中,作者谈到了如何引起混淆,开始没有参与,或者返回那些本来是无效方法的价值。

通过阅读来理解代码变得更加困难。

例如people.Find(“John”)应返回Johns列表,或单个John或抛出异常。

这里需要注意的是异常可能很昂贵,因此您不希望将它们用于控制流程。

因此,对于搜索,如果没有结果无关紧要,那么只返回null(或空列表。)

答案 1 :(得分:1)

我个人更喜欢使用out来返回方法中的状态和值 该方法应返回状态enum,结果作为输出参数。

ResultTypeEnum MyMethod(in param1, blah param2, out MyType returnValue);

如果您需要返回多个参数,我建议您创建一个包含所有结果的结构或类:

struct MyType {
   int blah;
   Myblah hello;
}

这样您就没有多个out参数,也不会因为参数混乱而重载您的方法。

抛出异常应该留作最后的手段。只有在方法中存在需要立即引起注意的严重错误时,才应该抛出异常。如果您只想返回方法的状态,则应使用枚举。

答案 2 :(得分:0)

您不希望对“正常程序流”使用例外。现在谈到用户输入时,我通常认为错误很正常,但问题是无法连接到数据库是否“正常”。 - 我也发现自己想知道“查找”功能是否应该像连接数据库一样。

我建议您单独调用数据库连接。也许你传递给find方法的DatabaseConnection对象,或者具有find方法的类也有一个isConnected方法,所以调用者可以检查这种方式。