【发布时间】:2010-07-21 13:11:29
【问题描述】:
我整合了许多有用的答案,并提出了我自己的answer below
例如,我正在编写一个 API Foo,它需要显式初始化和终止。 (应该与语言无关,但我在这里使用 C++)
class Foo
{
public:
static void InitLibrary(int someMagicInputRequiredAtRuntime);
static void TermLibrary(int someOtherInput);
};
显然,我们的库并不关心多线程、重入或诸如此类的问题。假设我们的 Init 函数应该只被调用一次,再次使用任何其他输入调用它都会造成严重破坏。
向来电者传达此信息的最佳方式是什么?我可以想到两种方法:
- 在
InitLibrary内部,我assert有一些静态变量,它会责怪我的调用者进行了两次初始化。 - 在
InitLibrary中,我检查了一些静态变量,如果我的库已经初始化,我会静默中止。
方法#1 显然是显式的,而方法#2 使它对用户更友好。我认为方法 #2 的缺点可能是我的调用者不会意识到 InitLibrary 不应被调用两次这一事实。
每种方法的优缺点是什么?有没有更聪明的方法来颠覆这一切?
编辑
我知道这里的例子很做作。正如@daemon 指出的那样,我应该初始化自己而不打扰调用者。然而实际上,有些地方我需要更多信息来正确初始化自己(注意使用我的变量名someMagicInputRequiredAtRuntime)。这不仅限于初始化/终止,而是存在困境的其他情况,我应该选择引用并引用“容错”还是糟糕地失败。
【问题讨论】:
-
这难道不完全取决于您希望对消费应用程序有多“严格”吗?
-
@Tobiasopenbrouw:也许哈哈。也许我应该标记“主观”:P
-
如果你知道应该调用多少次init(),并且可以很容易地设计库,所以它知道只执行init()一次并忽略后续调用,为什么要给用户带来负担?不要强迫用户知道比他们需要的更多。
标签: idioms api-design