サブリソースを使用するリソースの開閉機構を作成する場合、エラー時のサブリソースの解放を処理するための 2 つのパターンがあります。
1
RESULT Open() {
RESULT result;
result = OpenSubResourceA();
if (result == SUCCESS)
result = OpenSubResourceB();
/* Do not handle error case, the convention is that the caller
* will call Close whatever the return code of Open is */
return result;
}
2
RESULT Open() {
RESULT result;
result = OpenSubResourceA();
if (result == SUCCESS)
result = OpenSubResourceB();
if (result != SUCCESS)
ReleaseSubResourceA();
/* Release A if opening B failed since the convention is
* that the caller calls Close only if Open succeeds */
return result;
}
もちろん、2 つ以上のサブリソースで一般化できます。
好きなやり方は何ですか?なぜ ?
編集
ご意見ありがとうございます。メイン リソースが Open/Close 呼び出し以外の中間状態であってはならないという考えは、#2 が実際に最善の解決策であると確信させました。