0lu*_*sz0 5 coding-style return-value
我正在考虑允许我返回计算结果和状态的模式:
我可以考虑的方法有以下几种:
函数返回计算结果,状态通过输出参数返回(并非所有语言都支持输出参数,这似乎是错误的,因为通常您不期望参数被修改)。
函数返回包含两个值的对象/对(缺点是您必须创建人工类才能返回函数结果或使用没有语义意义的对 - 您可以根据顺序知道哪个参数是哪个)。
如果您的状态只是成功/失败,您可以返回计算值,并且在出现错误时抛出异常(看起来是最好的方法,但仅适用于成功/失败场景,不应被滥用于控制正常程序流程)。
函数返回值,函数参数是 onSuccess/onFailure 过程的委托。
有一个(状态完整)方法类,它具有状态字段和返回计算结果的方法(我更喜欢拥有无状态/不可变对象)。
请给我一些关于使用上述方法的优点、缺点和情况前提条件的提示,或者向我展示我可以使用的其他模式(最好提示何时使用它们的前提条件)。
编辑:现实世界的例子:我正在开发java ee互联网应用程序,我有一个类解析请求参数,将它们从字符串转换为一些业务逻辑对象。解析器正在数据库中检查是否正在创建或编辑对象,然后将新对象或从数据库获取的对象返回到控制器。控制器根据从解析器读取的对象状态(新/编辑)采取行动。我知道这很糟糕,我想改进这里的代码设计。
函数返回计算结果,状态通过输出参数返回(并非所有语言都支持输出参数,这似乎是错误的,因为通常您不期望参数被修改)。
如果该语言支持多个输出值,那么该语言显然是为了支持它们而设计的。不使用它们将是一种耻辱(除非在特定社区中有强烈反对它们的意见 - 对于尝试做所有事情的语言来说可能就是这种情况)
函数返回由两个值组成的对象/对(缺点是您必须创建人工类才能返回函数结果或使用没有语义含义的对 - 您可以按顺序知道哪个参数是哪个)。
我不知道这个缺点。在我看来,被调用的记录或类MyMethodResult本身应该具有足够的语义。当然,如果您处于特殊情况,您也可以在异常中始终使用这样的类。在我看来,创建某种数组/联合/对不太可接受:您将不可避免地在某个地方丢失信息。
如果您的状态只是成功/失败,您可以返回计算值,并且在出现错误时抛出异常(看起来是最好的方法,但仅适用于成功/失败场景,并且不应被滥用于控制正常程序流程)。
不!这是最糟糕的做法。异常应该用于特殊情况。如果不这样做,它们将停止调试器,让同事陷入困境,损害性能,并填满您的日志系统。如果您创建一个方法来测试某些内容,那么测试应该返回一个状态,而不是异常:对于实现来说,返回负值并不异常。
当然,如果在解析过程中用完了文件中的字节,当然会抛出异常,但如果输入不正确并且调用了您的方法,则不要抛出异常checkFile。
函数返回值,函数参数是 onSuccess/onFailure 过程的委托。
如果您有多个结果要分享,我只会使用这些。它比类/记录方法更复杂,并且更难以维护。我使用这种方法返回多个结果,但我不知道结果是否被忽略,或者用户是否想继续。在 Java 中,您将使用侦听器。这种操作对于函数式语言来说可能更容易被接受。
有一个(全状态)方法类,它具有状态字段和返回计算结果的方法(我更喜欢拥有无状态/不可变对象)。
是的,我也更喜欢那些。有结果的产生者和结果本身。几乎不需要将两者结合起来创建一个有状态对象。
producer.produceFrom(x): Result最后,我认为你想去。如果我没数错的话,这是选项 1 或 2a。是的,对于 2a,这意味着编写一些额外的代码。