私は、ユーザーオブジェクトのシリアル化を含む単純なシステムに取り組んでいます。読み取り/書き込みが異なるように各タイプに作用する一連の特殊なテンプレートクラスがあります。
template<class T>
class ItemSerializer;
template<>
class ItemSerializer<int>
{
public:
static void store( int const& obj )
{
}
static void fetch( int& obj )
{
}
};
template<>
class ItemSerializer<NoteNumberArray>
{
public:
static void store( NoteNumberArray const& obj )
{
// NoteNumberArray::_blocks is used here.
}
static void fetch( NoteNumberArray& obj )
{
// NoteNumberArray::_blocks is used here.
}
};
タイプに応じて、状態がある場合とない場合があります。これは、割り当てられているシリアライザークラスに必要です。この例では、2つのタイプのシリアライザーがあります:int
とNoteNumberArray
。ストア/フェッチ関数は型の追加の状態を必要とせずint
、読み取り/書き込みの実装は非常に簡単です。
ただし、の場合NoteNumberArray
は状態が必要なので、コアタイプやSTLタイプを使用する代わりに独自のクラスを作成します。この状態は、最適化の目的で、の実装によってItemSerializer
のみ使用されます。このプライベート状態は、読み取り/書き込みメソッドの速度と効率を最適化するために使用されます。シリアライザークラスはステートフルではないため、代わりにこの状態をユーザーオブジェクトに配置します。
私はおそらくItemSerializer
の友達を作ることができNoteNumberArray
ますが、これは循環依存を引き起こし、必要ItemSerializer
以上のアクセスを提供しますNoteNumberArray
。
そのようなシステムの良い設計は何ですか?始めるのに役立つヒントを探しています。この例に関連するその他のスニペットは次のとおりです。
class Block
{
};
class NoteNumberArray
{
public:
// Public interface, none of which will use _blocks. Only ItemSerializer uses _blocks.
private:
std::vector<int> _array; // This should not be used directly by anyone, including ItemSerializer.
std::vector<Block> _blocks; // This is the private state only used by ItemSerializer
};