1

私は、ユーザーオブジェクトのシリアル化を含む単純なシステムに取り組んでいます。読み取り/書き込みが異なるように各タイプに作用する一連の特殊なテンプレートクラスがあります。

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つのタイプのシリアライザーがあります:intNoteNumberArray。ストア/フェッチ関数は型の追加の状態を必要とせず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
};
4

2 に答える 2

2

循環依存の問題は見当たりません。ItemSerializer<NoteNumberArray>の友達を作る依存の問題はありませんNoteNumberArray

ItemSerializer<NoteNumberArray>のその他のプライベートな部分を表示したくない場合は、アクセスの問題が発生しますNoteNumberArray

_blocks1つの可能性は、別のクラスにラップすることです。このクラスNoteNumberArraySerializerHelperにはItemSerializer<NoteNumberArray>、フレンドとして、すべてのメソッド(コンストラクターや、コンパイラーによって通常は作成されるその他のものを含む)がプライベートになっています。次に、パブリックアクセサー/ミューテーターメソッドをに与える必要がありますが_blocks、それらのメソッドを使用して何かを行うことNoteNumberArray以外は誰もできません。ItemSerializer<NoteNumberArray>

于 2013-02-07T17:21:25.063 に答える
0

_blocksでのみ使用される場合は、代わりにスペシャライゼーションItemSerializerのメンバーにします。ItemSerializer全体の目的を理解しなければ、そのようなものをNoteNumberArray直接保存することの利点を理解することはできません。

ちなみに、識別子の先頭を避けることで、予約名(大文字の後に大文字を付ける、グローバル名前空間の先頭_など)を誤って使用することを簡単に回避できます。__

于 2013-02-07T16:32:02.537 に答える