我正在构建一个 SDK,它提供一些 GET 功能,例如:
GetCustomerById 或 GetProductById 等
在某些用例中,如果未找到 id,这些函数应返回 null,而在其他用例中,应抛出异常,因为这将是意外行为。
我的想法是以某种方式设计我的获取函数,以便我的 SDK 的用户可以自己决定函数的行为方式。
我的想法是:
GetCustomerById and GetCustomerByIdOrThrow
。 Throw-Function 将抛出 SDK 公开的异常,就像第一种方法一样。GetCustomerById and GetCustomerById<ExceptionToThrow>
最后一种方法是我最喜欢的。我的 SDK 的用户甚至可以灵活地定义自己的异常,该异常应该在未找到时抛出。
您觉得我的三个想法怎么样?还有其他想法吗?为什么要使用其中一种而不是另一种?
我认为这三个都可以,但就我个人而言,我不会选择第三个,因为它限制了您可以对异常执行的操作(例如提供用户定义的错误消息,尽管可以使用它来解决)
Func<TException>
工厂)。
我个人会采用两种方法,但还有另外两种值得考虑的变化:
int.TryParse
,看起来像:
bool TryGetCustomerById(IdType id, out Customer customer)
我发现另一种方法很有用,但可以说它比 SDK 更适合“内部”使用 - 对于不同的情况使用不同的动词,例如
Find
用于非抛出版本(它与 可空引用类型很好地配对,所以返回类型是 Customer?
) 和 Get
用于抛出一个。所以签名可以是这样的:
Customer GetCustomerById(IdType id); // throws
Customer? FindCustomerById(IdType id) // does not throw
但这需要客户了解约定。