次のことをしているクラスをイメージする
class AClass
{
AClass() : mode(0) {}
void a()
{
if (mode != 0) throw ("Error mode should be 0");
// we pass the test, so now do something
...
mode = 1;
}
void b()
{
if (mode != 1) throw("Error mode should be 1");
// we pass the test, so now do something
...
}
int mode;
};
このクラスには多くのメソッド (簡単に 20 より多い) が含まれており、これらのメソッドのそれぞれについて、mode の値をチェックする必要がありますが、これは明らかに多くのコードの重複です。さらに、モード !=0 の場合にエラーをスローするメソッドと、モード != 1 の場合にエラーをスローするメソッドの 2 つのカテゴリを識別することができます。これらのメソッドを 2 つのカテゴリにグループ化することは可能でしょうか (カテゴリ A =モード != 0) の場合にエラーをスローするメソッドと、モード != 1) の場合にエラーをスローするメソッドのカテゴリ B?
編集:現在の回答を見ると、質問を定式化する方法がわかり、問題はおそらく十分に明確ではありません。私が避けたいのは、クラスの各メソッドで関数を呼び出さなければならないことです。メソッドの先頭にコードを書くか、このコードを関数に入れてこの関数を呼び出すかは問題ではありません。問題は、これを一緒に回避できるかどうかです。コンテキストに応じて、クラスのメソッドへの呼び出しが有効かどうかを自動的にチェックするのに役立つ手法があるかどうか。
AClass は、実際には私のプロジェクトのコンテキストでは API です。a()、b() などは、プログラマーが API を使用したい場合に呼び出すことができる関数ですが、これらのメソッドの一部は、正確な順序でしか呼び出すことができません。たとえば、コードで a() がモード = 1 に設定されていることがわかります。したがって、プログラマーは次のようにすることができます。
a(); // mode = 0 so it's good
b(); // mode = 1 so it's good
しかし、このコードは失敗する必要があります (もちろんコンパイルされますが、実行時に b() が呼び出されたコンテキストが間違っていたことを示すエラーをスローする必要があります。
b(); // mode 0 so it won't work
a(); // it will compile but throw an exception
これを行うために何らかのパターンが機能するかどうかを確認しようとしましたが、何も見つかりませんでした。私には不可能に思えますが、必要なコードを実際に書くことが唯一の選択肢だと思います。誰かが何かを提案できますか?どうもありがとうございました。