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

Need design advice for exclusive access to private class state

本文关键字:状态 人类 访问      更新时间:2023-10-16

我正在开发一个涉及序列化用户对象的简单系统。我有一系列专门的模板类,它们对每种类型的读/写都有不同的作用:

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,state是必需的,所以我创建了自己的类,而不是使用核心类型或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
};

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

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

一种可能性是将_blocks封装到另一个类NoteNumberArraySerializerHelper中,该类将ItemSerializer<NoteNumberArray>作为友元,并且所有方法(包括构造函数和其他通常由编译器为您编写的东西)都是私有的。然后,您必须为_blocksNoteNumberArray提供公共访问器/赋值器方法,但除了ItemSerializer<NoteNumberArray>之外,没有人可以使用这些方法执行任何操作。

如果_blocks仅由ItemSerializer使用,则将其作为ItemSerializer专业化的成员。如果不了解整个目的,我就看不出直接将这样的东西存储在NoteNumberArray中有什么好处。

顺便说一句,通过避免在标识符上使用前导_,您可以很容易地避免意外使用保留名称(例如_后面跟着大写或全局命名空间中的前导_)。