私は有用な回答の多くを統合し、以下の独自の回答を考え出しました
たとえば、Foo
明示的な初期化と終了が必要な API を作成しています。(言語に依存しないはずですが、ここでは C++ を使用しています)
class Foo
{
public:
static void InitLibrary(int someMagicInputRequiredAtRuntime);
static void TermLibrary(int someOtherInput);
};
どうやら、私たちのライブラリはマルチスレッドや再入可能性などを考慮していないようです。関数を 1 回だけ呼び出す必要があるとしましょうInit
。他の入力で再度呼び出すと、大混乱が生じます。
これを発信者に伝える最善の方法は何ですか? 次の 2 つの方法が考えられます。
- 内部
InitLibrary
ではassert
、呼び出し元を 2 回初期化したと非難するいくつかの静的変数があります。 - 内部
InitLibrary
で、いくつかの静的変数をチェックし、ライブラリがすでに初期化されている場合は黙って中止します。
方法 1 は明らかに明示的ですが、方法 2 の方がユーザーフレンドリーです。メソッド#2には、呼び出し元がInitLibrary
2回呼び出されるべきではないという事実に気付かないという欠点があると考えています。
各アプローチの長所/短所は何ですか? これらすべてを覆すより賢い方法はありますか?
編集
ここでの例は非常に不自然であることを知っています。@daemonが指摘したように、私は自分自身を初期化する必要があり、呼び出し元に迷惑をかけません。ただし、実際には、自分自身を適切に初期化するためにさらに情報が必要な場所があります ( my variable name の使用に注意してくださいsomeMagicInputRequiredAtRuntime
)。これは初期化/終了に限定されませんが、引用と引用の「耐障害性」を選択するか、ひどく失敗するかのジレンマが存在する他の例です。