我已经整合了许多有用的答案,并在下面提出了我自己的答案
例如,我正在编写一个Foo
需要显式初始化和终止的 API。(应该与语言无关,但我在这里使用 C++)
class Foo
{
public:
static void InitLibrary(int someMagicInputRequiredAtRuntime);
static void TermLibrary(int someOtherInput);
};
显然,我们的库并不关心多线程、重入或诸如此类的东西。假设我们的Init
函数应该只被调用一次,再次使用任何其他输入调用它都会造成严重破坏。
将此信息传达给我的来电者的最佳方式是什么?我可以想到两种方法:
- 在里面
InitLibrary
,我assert
有一些静态变量会责怪我的调用者初始化两次。 - 在里面
InitLibrary
,我检查了一些静态变量,如果我的库已经初始化,我会默默地中止。
方法#1 显然是显式的,而方法#2 使它对用户更友好。我认为方法#2 的缺点可能是我的调用者不会意识到InitLibrary
不应调用两次的事实。
每种方法的优缺点是什么?有没有更聪明的方法来颠覆这一切?
编辑
我知道这里的例子很做作。正如@daemon 指出的那样,我应该初始化自己而不打扰调用者。然而实际上,有些地方我需要更多信息来正确初始化自己(注意使用我的变量名someMagicInputRequiredAtRuntime
)。这不仅限于初始化/终止,而是存在困境的其他情况,无论我应该选择引用并引用“容错”还是糟糕地失败。