Coding style 返回计算结果和状态。最佳做法

Coding style 返回计算结果和状态。最佳做法,coding-style,return-value,Coding Style,Return Value,我在考虑允许我返回计算结果和状态的模式: 我可以考虑的方法很少: 函数返回计算结果,状态通过out参数返回(并非所有语言都支持out参数,这似乎是错误的,因为通常您不希望修改参数) 函数返回由两个值组成的对象/对(缺点是,您必须创建人工类才能返回函数结果,或者使用没有语义意义的对-您知道哪个参数是哪个参数,按照它的顺序) 如果您的状态是success/failure,则可以返回计算值,并在出现错误时抛出异常(看起来是最好的方法,但仅适用于成功/失败场景,不应滥用它来控制正常的程序流) 函数返回

我在考虑允许我返回计算结果和状态的模式:

我可以考虑的方法很少:

  • 函数返回计算结果,状态通过out参数返回(并非所有语言都支持out参数,这似乎是错误的,因为通常您不希望修改参数)

  • 函数返回由两个值组成的对象/对(缺点是,您必须创建人工类才能返回函数结果,或者使用没有语义意义的对-您知道哪个参数是哪个参数,按照它的顺序)

  • 如果您的状态是success/failure,则可以返回计算值,并在出现错误时抛出异常(看起来是最好的方法,但仅适用于成功/失败场景,不应滥用它来控制正常的程序流)

  • 函数返回值,函数参数是onSuccess/onFailure过程的委托

  • 有一个(state-full)方法类,它有status字段和返回计算结果的方法(我更喜欢使用无状态/不可变对象)

请给我一些使用上述方法的优点、缺点和情况的先决条件的提示,或者给我展示我可以使用的其他模式(最好是在使用它们的先决条件上的提示)


编辑: 现实世界的例子: 我正在开发JavaEE互联网应用程序,我有一个类来解析请求参数,将它们从字符串转换为一些业务逻辑对象。解析器正在检查数据库中是否正在创建或编辑对象,然后将新对象或从数据库中提取的对象返回控制器。控制器正在根据从冲突解决程序读取的对象状态(新建/编辑)采取操作。我知道这很糟糕,我想在这里改进代码设计

函数返回计算结果,状态通过out返回 参数(并非所有语言都支持out参数,这似乎 错误,因为通常您不希望修改参数)

如果该语言支持多个输出值,那么该语言显然是为了支持它们而设计的。如果不使用它们,那将是一种耻辱(除非在那个特定的社区中有强烈的反对意见——这可能是尝试做任何事情的语言的情况)

函数返回包含两个值的对象/对(缺点是 您必须创建人工类才能返回函数结果或 使用无语义的pair-您知道哪个参数是 这是我的命令)

我不知道这有什么坏处。在我看来,名为“MyMethodResult”的记录或类本身应该具有足够的语义。当然,如果您处于异常情况下,您也可以在异常情况下使用此类类。在我看来,创建某种数组/联合/对是不太可取的:您将不可避免地在某个地方丢失信息

如果您的状态只是成功/失败,您可以返回计算 值,并在出现错误时抛出异常(看起来是最好的 方法,但仅适用于成功/失败场景,不应 被滥用以控制正常程序流)

不!这是最糟糕的方法。例外情况应适用于特殊情况。否则,他们将停止调试器,让同事们陷入困境,损害性能,填充日志系统,干扰单元测试。如果您创建了一个方法来测试某些东西,那么测试应该返回一个状态,而不是异常:对于实现来说,返回一个负数并不是异常

当然,如果在解析过程中文件的字节数用完了,当然可以抛出异常,但如果输入不正确,并且方法名为checkFile,则不要抛出异常

函数返回值,函数参数被委托给 成功/失败程序

我只会在你有多个结果要分享时使用这些。它比类/记录方法复杂得多,而且更难维护。我使用这种方法返回了多个结果,但我不知道结果是否被忽略,或者用户是否希望继续。在Java中,您将使用侦听器。函数语言可能更接受这种操作

有一个(state full)方法类,它具有status字段,并且 方法返回计算结果(我更喜欢 无状态/不可变对象)

是的,我喜欢那些。有结果的生产者,也有结果本身。几乎不需要将两者结合起来并创建有状态对象


在我看来,最终,你要去生产者那里。produceFrom(x):结果。这是选项1或2a,如果我计数正确的话。是的,对于2a,这意味着要编写一些额外的代码。

我倾向于要么使用
out
参数,要么使用一个“openfield”结构,它只包含公共字段,并指定其目的只是携带这些字段的值。虽然有些人建议一切都应该“封装”,但我建议如果一个计算自然产生两个称为Moe和Larry系数的
double
值,指定函数应该返回“一个普通的旧数据结构,其字段类型为
double
,称为
moecofficient
larrycofficient
“将用于完全定义结构的行为。尽管必须在执行计算的方法之外将结构声明为数据类型,但将其内容公开为公共字段可以清楚地表明,与这些值关联的语义都不包含在结构中——它们都包含在返回它的方法中

有些人会认为结构应该是不可变的,或者说它应该是不可变的