私は、貧しい人のシングルトンの一種として機能する静的属性のみからなるクラスを持っています。その目的は、アプリケーションのさまざまなポイントから統計を収集することです。私たちの単体テストでは、運用コード内の違いを取得するために使用できるシャドウコピーを作成しました。クラス内の静的属性の数の取得
例:
struct Production {
static ComplexClass value1;
static ComplexClass value2;
};
struct ProductionShadow {
static ComplexClass::ValueType value1;
static ComplexClass::ValueType value2;
};
すべてのメンバーは、シャドウクラスは、生産クラスから継承することはできませんし、生産クラスの属性は、副作用に複雑なオブジェクトであり、私は唯一の影が単純な値を保持したい静的であるため、比較のため。
シャドウクラスをいくらか保守しやすくするために、誰かがプロダクションクラスに属性を追加するたびにシャドウクラスも更新されることを確認する静的アサーションを追加したかったのです。
は属性が、これは簡単に次のようにして達成されている可能性が静的がなかったら:
別に私は有効にする必要がありますように私はむしろないと思いますこれは、非静的クラスを作るからenum { NumberOfProductionAttributes = sizeof(Production)/sizeof(ComplexClass),
NumberOfShadowAttributes = sizeof(ProductionShadow)/sizeof(ComplexClass::ValueType) };
STATIC_ASSERT(NumberOfProductionAttributes == NumberOfShadowAttributes);
プロダクションクラスを適切なシングルトンに変換するには、現在の実装でこのチェックを行うことができますか?
実行時には、プロダクションクラスでシャドー内のすべての値を検証するメソッドがあります。新しい属性が追加されたときにメソッドを更新する必要があるため、検証された属性の数を数え、その量が属性の総数と異なる場合はアサートしたいと考えています。
例
bool ProductionShadow::verify() {
std::size_t numberOfVerified = 0;
#define VERIFY(x) do { \
++numberOfVerified; \
// Verification code goes here \
} while (0)
VERIFY(value1);
VERIFY(value2);
ASSERT(numberOfVerified == NumberOfShadowAttributes);
// Return result
}
私はポータブルなものを好むにもかかわらず、受け入れ可能な解決策であるかもしれないことを使用することができますGCCの拡張機能がある場合。
2つのグローバルインスタンスを持つ単一のクラスを持たない理由はありますか? – Pete
2つのクラスでタイプが異なります。これは、制作者がシャドーコピーで複製したくない副作用を伴う複雑なクラスを保持するためです。影は比較のために使用される値だけを保持しているはずです。私は問題の説明を更新します。 –
静的でないメンバーを持つ2つの別々のクラスを作成し、それらの静的インスタンスを2つのクラスに入れることができます。次に、非静的メンバーを持つ元のクラスに対してサイズチェックを実行できます。 – jogojapan