需要专门访问私人类州的设计建议

时间:2013-02-07 16:08:02

标签: c++ design-patterns

我有一个我正在研究的简单系统,涉及序列化用户对象。我有一系列专门的模板类,可以对每种类型进行不同的读/写操作:

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.
    }
};

根据类型的不同,它可能具有或不具有状态,这对于分配它的序列化程序类是必需的。在此示例中,我有两种类型的序列化程序:intNoteNumberArray。存储/获取函数不需要int类型的任何其他状态,读/写实现非常简单。

但是,对于NoteNumberArray,状态是必要的,所以我创建自己的类而不是使用核心类型或STL类型。出于优化目的,此状态仅由ItemSerializer 的实现使用。该私有状态将用于优化读/写方法的速度和效率。由于序列化程序类不是有状态的,我将此状态放在用户对象中。

我可能会ItemSerializer成为NoteNumberArray的朋友,但这会导致循环依赖,并且ItemSerializer可以访问NoteNumberArray以外的所有内容。< / p>

这种系统的优秀设计是什么?只是寻找一些提示来帮助我开始。以下是此示例的其他一些相关摘录:

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
};

2 个答案:

答案 0 :(得分:2)

我没有看到循环依赖问题,没有依赖问题使ItemSerializer<NoteNumberArray>成为NoteNumberArray的朋友。

如果您不希望ItemSerializer<NoteNumberArray>能够看到NoteNumberArray的其他隐私部分,我确实会看到访问权限问题。

一种可能性是将_blocks包装到另一个类NoteNumberArraySerializerHelper中,其中ItemSerializer<NoteNumberArray>作为朋友和所有方法(包括构造函数和其他通常由您为其编写的内容)编译器)私有。然后你必须为_blocks NoteNumberArray提供公共访问者/ mutator方法,但除ItemSerializer<NoteNumberArray>之外的任何人都不能使用这些方法做任何事情。

答案 1 :(得分:0)

如果_blocks仅由ItemSerializer使用,则只需将其设为ItemSerializer专精的成员即可。在不理解整个目的的情况下,我看不出直接在NoteNumberArray中存储这样的东西的优势。

作为旁注,通过避免在您的标识符上引导_,您可以轻松避免意外使用保留名称(例如全局命名空间中的_后跟大写或前导_