代码之家  ›  专栏  ›  技术社区  ›  Sven Hecht

当你的方法失败了,但成功了…你会返回失败还是成功?[关闭]

  •  3
  • Sven Hecht  · 技术社区  · 7 年前

    你在设计一种方法。它是有目的的,这就是为什么你要首先设计它。一个调用者使用了你的方法,但是方法失败了,但是,你看,最终的目的仍然实现了方法的存在——多亏了你无法控制的外部环境或者某种魔法,你选择了。您会将这种情况作为失败或成功报告给呼叫者吗?

    让我们选择一个简单的例子。你写的是 DeleteFile 功能。它采用文件路径并删除文件。有人调用这个函数,提供一个路径。函数查找文件,但它不存在。这不是权限问题或其他问题,文件确实丢失了。也许是另一个进程在一微秒前删除了它,也许它根本就不存在。函数无法执行其任务,因此必须报告失败…但是用户调用这个函数的唯一原因是确保文件不存在,而且,瞧,它不存在,所以它是成功的。

    我期望回答“只是在您的返回值中更加详细”,并且我很乐意返回一个详细的结果作为补充信息,但是您将返回什么(以及为什么)作为函数、成功或失败的主要成功标志?如果有附加的标志,这是错误的,但“你不存在”还是“有人感谢”标志是正确的?

    我问的是一般情况,包括当方法没有参数或者由于其他原因不可能以错误的方式调用它时。

    6 回复  |  直到 7 年前
        1
  •  13
  •   Mike Daniels    16 年前

    当新程序员正在学习如何编写函数时, 先决条件 和 后置条件 经常被介绍。前提条件是必须满足的假设,才能使您的方法正常工作。后置条件是您的方法在执行后对系统状态的保证。

    我认为打电话给 deleteFile 方法是文件当前存在。如果不满足前提条件,则该方法应 失败 即使是以一种偶然、迂回的方式实现了后条件。

    现在,如果调用了方法 deleteFileIfExists 这是另一回事。您没有对该方法施加如此严格的前提条件。

        2
  •  7
  •   sergeb    16 年前

    遵循最小惊喜原则,并抛出异常。

    我是这样想的:如果我正在写代码,并且在代码中包含了一个错误,它向deletefile函数传递了一个不正确的路径,一个如此不正确的路径,以至于它永远不可能存在,我会期望deletefile抛出,以表明我做错了什么。

    如果需要,可以创建一个接受名为throwonfilenotexist的参数或其他参数的重载,如果设置为false,它将不会在这种情况下抛出。但我认为这是罕见的异常情况。

        3
  •  4
  •   Rich    16 年前

    这就是例外的原因。

    引发新文件不texistException

        4
  •  3
  •   Duncan    16 年前

    如果你开始失败,并且成功地做到了,你做了什么?

    我认为由客户决定该怎么做。如果要求函数删除不存在的文件,则引发异常。然后,客户机可以捕获该异常并决定文件是否不存在或是否已成功删除,最终结果相同,并且可以正常进行。

    或者,如果文件丢失是一种预期的可能性,也就是说不是异常的,那么您可以返回一个故障状态,调用方可以随意忽略该状态:),这同样会将决定留给客户机。

    在任何一种情况下,如果您遵循一个函数应该做一件事情并且做得很好的原则,那么客户机可以为手头的任务以任何适当的方式将函数调用串在一起,并且成功或失败将变得更加细化。

    如果函数没有成功完成,则不应该返回SUCCESS。不管最终结果是否一致。这样疯狂的谎言。

        5
  •  1
  •   Dhaust    16 年前

    您的示例是三元布尔值的完美示例: True/False/FileNotFound .

    enum Bool 
    { 
        True, 
        False, 
        FileNotFound 
    };
    

    更新
    别开玩笑了。如果方法不能执行它的函数,那么它应该有一个适合这种情况的返回代码(或者抛出异常)。如果最终结果是相同的,那么对于方法来说并不重要;尽管对于该方法的调用方来说可能是相同的。

    我更喜欢避免抛出异常并维护返回代码。对于代码无法处理的情况,存在imho异常类型。您的示例方法足够小,只返回false就足够好了。由调用代码决定原因。

    像deletefile这样的简单方法失败的原因有很多。文件不存在,您没有安全权限,文件被锁定,文件系统被延迟等。每个文件都应该有自己特定的返回失败代码。

    然后由调用代码决定“哦,文件不存在,没关系”。或者,“你说我没有权利是什么意思?!?中止!!”

    要点是:除非方法可以实际执行,否则不要返回true。

        6
  •  0
  •   Shadowfirebird    16 年前

    函数应该抛出一个异常(或返回一个失败值,无论什么)。这个 用户 不过,应该会看到成功。

    噢,调用函数的程序员应该知道真相。但是,用户界面向用户呈现的内容更取决于总体功能,我想是目标用户。

    以您的“删除文件”为例——在正常情况下,我希望您的应用程序只是从列表中删除该文件或其他文件,然后继续——让用户看到该文件已被删除;他们可能不关心它是如何发生的。

    (正常情况下),因为 一些 应用程序,这可能很重要。)

    推荐文章