Exception 失败的方法

Exception 失败的方法,exception,api-design,Exception,Api Design,我有一个方法(或者函数,或者过程,对于这个问题来说无关紧要)void DoStuff()。这取决于一些数据,并且有副作用。而且,该操作仅在特定状态下有效;在某些其他状态下,无法执行此操作 现在,虽然我正在将其开发为一个API,但我正在考虑该API将实际用于何处。执行此操作有两种典型情况: 用户代码应该检查状态是否有效,如果无效,则实现自己的自定义逻辑。如果此代码最终试图在无效状态下实现此操作,则表示这是程序员错误,应该报告并调查 在这种情况下,客户机实际上不需要执行任何自定义逻辑,甚至不需要知道

我有一个方法(或者函数,或者过程,对于这个问题来说无关紧要)
void DoStuff()
。这取决于一些数据,并且有副作用。而且,该操作仅在特定状态下有效;在某些其他状态下,无法执行此操作

现在,虽然我正在将其开发为一个API,但我正在考虑该API将实际用于何处。执行此操作有两种典型情况:

  • 用户代码应该检查状态是否有效,如果无效,则实现自己的自定义逻辑。如果此代码最终试图在无效状态下实现此操作,则表示这是程序员错误,应该报告并调查

  • 在这种情况下,客户机实际上不需要执行任何自定义逻辑,甚至不需要知道操作是否成功

  • 为了使我的API在这两种情况下都有用,我想公开此方法的两种变体:一种是将引发异常的
    DoStuff()
    ,或者,比方说,使用给定语言的功能尽可能大声地报告错误以表示逻辑错误。另一个是,
    TryDoStuff()
    ,它根本不会做任何错误报告,并且会自动失败

    因此,我有两个问题:

  • 创建两个API端点而不是一个端点听起来是个好主意吗?我认为这是一种方便,尽管一般来说,更多的API端点意味着需要支持更多的代码和更复杂的API

  • 什么是合适的命名约定?
    TryDoStuff()
    有效吗


  • (这种语言与任何特定的语言无关。我使用C#语法作为示例,但这个问题与C#无关,甚至与OOP无关,所以请不要添加这些标记)。

    这可以通过多种方式解决:

    • 返回操作结果,失败时抛出
    • 失败时返回操作结果或默认值
    • 失败时返回操作结果或错误指示器
    • 返回一个复杂的结果对象,其状态之一可以表示失败
    现在,这些设计并不是相互排斥的;就像.NET中的
    Parse
    /
    TryParse
    方法经常成对出现一样,您可能希望为每个方法提供一个“受保护的”和一个明显失败的变体。更准确地说,以下三种处理方法似乎是可行的:

    • 如上所述,为每种方法提供两种变体
    • 提供几个可以访问方法的API对象,一个是“受保护的”,另一个是失败的
    • 提供控制所有方法的一般行为的全局API模式设置
    现在,特别是选项2和3并不一定意味着要维护的代码量要翻一番。在外部,您可以让所有API对象实现相同的公共接口。在内部,选项2和3(实际上也是选项1)都允许您只编写一次关键的内部方法,并根据实际调用的公共方法或当前的API模式,以不同的方式处理问题

    选择哪种设计(或设计组合)在很大程度上取决于各种环境因素:

    • API的用户习惯于什么;目标环境中有哪些约定
    • API应该传达什么样的隐喻?例如,使用API“感觉”应该像使用“设备”一样,还是像在轻量级服务模块上调用函数一样

    您能否添加一个具体的例子,说明您对dostuff有什么样的操作想法?我不确定,但这可能是一个更适合程序员的问题,虽然确实存在一个语言不可知的角度,但不应忽视的是,也可能存在特定于语言/框架的约定。例如,
    Try…()
    方法对.NET开发人员意味着某种固定的操作模式,而在其他平台上可能不以相同的名称为人所知。
    public void DoStuff(bool throwOnFailure=true)