我正在考虑允许我返回计算结果和状态的模式:
我能想到的方法很少:
函数返回计算结果,状态通过out参数返回(并非所有语言都支持输出参数,这似乎是错误的,因为通常你不希望修改参数)。
函数返回包含两个值的对象/对(缺点是你必须创建人工类只是为了返回函数结果或使用没有语义含义的对 - 你知道哪个参数是由它的顺序)。 / p>
如果您的状态只是成功/失败,您可以返回计算值,并且在出现错误的情况下抛出异常(看起来像是最好的方法,但仅适用于成功/失败场景,不应滥用控制正常的程序流程。)
函数返回值,函数参数是onSuccess / onFailure过程的委托。
有一个(state-full)方法类,它有状态字段,返回计算结果的方法(我更喜欢无状态/不可变对象)。
请给我一些关于使用上述方法的优点,缺点和情况的先决条件,或者向我展示我可以使用的其他模式(最好提供关于何时使用它们的先决条件的提示)。
编辑: 现实世界的例子: 我正在开发java ee互联网应用程序,我有一个类解析请求参数将它们从字符串转换为一些业务逻辑对象。如果正在创建或编辑对象,则解析器正在检入db,然后将从db获取的新对象或对象返回到控制器。控制器根据从解析器读取的对象状态(新/编辑)执行操作。我知道这很糟糕,我想在这里改进代码设计。
答案 0 :(得分:1)
函数返回计算结果,状态通过out返回 参数(并非所有语言都支持参数,这似乎 错了,因为一般来说你不希望修改参数。)
如果语言支持多个输出值,那么语言显然是为了支持它们。不使用它们将是一种耻辱(除非在特定社区中有强烈的意见反对它们 - 这可能适用于尝试和做所有事情的语言)
函数返回包含两个值的对象/对(缺点是 你必须创建人工类只是为了返回功能结果或 使用没有语义含义的对 - 你知道哪个是参数 按照它的顺序)。
我不知道这个缺点。在我看来,一个名为“MyMethodResult”的记录或类本身应该有足够的语义。您也可以在异常中使用这样的类, if 当然只有异常情况。在我看来,创建某种数组/联合/对是不太可接受的:你不可避免地会在某处丢失信息。
如果您的状态只是成功/失败,您可以返回计算 值,并在出现错误的情况下抛出异常(看起来最好 方法,但仅适用于成功/失败情况,不应该 被滥用来控制正常的程序流程。)
没有!这是最糟糕的方法。例外情况应该用于特殊情况。如果没有,他们将暂停调试器,将同事放在错误的位置,损害性能,填充您的日志记录系统并进行单元测试。如果你创建一个方法来测试某些东西,那么测试应该返回一个状态,而不是例外:对于实现,返回负数是而不是例外。
当然,如果在解析过程中用完了文件中的字节,请确保抛出异常,但如果输入不正确并且您的方法名为checkFile,则不要抛出异常。
函数返回值,函数参数是委托 onSuccess / onFailure程序。
如果您要分享多个结果,我只会使用它们。它比类/记录方法更复杂,更难以维护。我已经使用这种方法返回多个结果,而我不知道结果是否被忽略,或者用户是否想要继续。在Java中,您将使用侦听器。这种操作可能更适用于功能语言。
有一个(state-full)方法类,它有状态字段,和 返回计算结果的方法(我更喜欢 无状态/不可变对象)。
是的,我更喜欢那些。有结果的产生者和结果本身。几乎没有必要将两者结合起来并创建一个有状态的对象。
最后,你想转到producer.produceFrom(x):结果在我看来。如果我正确计数,这可以是选项1或2a。是的,对于2a,这意味着要编写一些额外的代码。
答案 1 :(得分:1)
我倾向于使用out
参数或者使用“开放字段”结构,它只包含公共字段并指定其目的仅仅是携带这些字段的值。虽然有些人建议所有内容都应该“封装”,但我建议如果计算自然产生两个double
值,称为Moe和Larry系数,则指定该函数应返回“一个普通的旧数据结构名为double
和MoeCoefficient
的{{1}}类型字段将用于完全定义结构的行为。尽管结构必须在执行计算的方法之外被声明为数据类型,但将其内容公开为公共字段会清楚地表明结构中不包含与这些值相关联的语义 - 它们都是包含在返回它的方法中。
有些人会认为结构应该是不可变的,或者它应该在其构造函数中包含验证逻辑等。我建议相反。如果结构的目的是允许方法返回一组值,那么该方法应该负责确保它将正确的值放入结构中。此外,虽然将构造函数暴露为“便利成员”的结构没有任何问题,但只是让代码在单独的字段中返回结构填充可能比调用构造函数更快更清晰,特别是如果要存储的值在一个字段中取决于存储到另一个字段的值。
如果结构只是公开公开其字段,那么语义非常清楚:LarryCoefficient
包含写入MoeCoefficient
的最后一个值,而MoeCoefficient
包含写入的最后一个值LarryCoefficient
。这些值的含义完全取决于编写它们的代码。隐藏属性背后的字段会掩盖这种关系,并可能妨碍性能。