【问题标题】:Best practice for fetching a collection of items from an object?从对象中获取项目集合的最佳实践?
【发布时间】:2009-08-03 00:23:29
【问题描述】:

我专门处理 C++,但这真的与语言无关。

只是为问题提供一些背景信息...我有一个基于树/图的结构,其中每个节点都包含多个项目的集合。

我有一个类,它封装了一些通用集合(列表、地图、向量、LinkedList 等等)。我希望能够以最有效的方式从该集合中获取所有项目,而无需客户端能够编辑私有集合。

这是我所拥有的一个简化示例:

class MyClass
{
public:
    // Basic constructors and such
    void AddItem(int item) { _myItems->push_back(item); }

private:
    list<int>* _myItems;
};

很明显,获取指向 _myItems 的指针的 getter 不起作用,因为这将允许客户端编辑 _myItems。

尝试 1:
我可以创建一个新列表并返回一个指向该列表的指针......但是我不喜欢这个想法,因为现在创建和删除的责任在于不同的对象。

尝试 2:
我认为最好创建一些 CopyTo 方法,例如:

void CopyItemsToList(list<int>* inList) { // copy the items to client list }

这样,客户端负责内存管理,并且很容易扩展它以允许更多数据结构。我对这种方法的担忧是成本......列表可能非常大,复制项目的成本可能会变得很大

尝试 3:
不要在类中保留指向列表的指针,只需使用值类型并返回它(让复制构造函数处理它)。但是,这似乎性能成本将与#2 相同......

无论如何,还有其他方法可以解决这个问题吗?让我知道你们的想法...谢谢。

【问题讨论】:

    标签: c++ oop


    【解决方案1】:

    Iterator pattern 通常被认为是公开集合中的元素列表与集合的实际内部表示无关的适当方法。您可以创建迭代器,使其返回只读 (const) 引用,或者根据请求即时复制项目,而不是复制整个列表。

    【讨论】:

    • const_terator 然后,因此客户端不能修改元素本身,如果这是要求的话。
    • 正确;更新的答案对此更加明确。
    • 嗯。考虑到大部分数据是围绕一个已经可以迭代的列表构建的,听起来工作量很大。
    • 我的回答是基于此:“我有一个封装了一些通用集合(列表、地图、向量、LinkedList 等)的类。”从这个措辞看来,封装的数据可能会发生变化,并且提供与内部表示无关的外部表示要灵活得多,这样如果内部表示发生变化,使用包装类的东西就不会发生变化。
    • 我想它会是这样的......我只是想让我的项目尽可能简单:(
    【解决方案2】:

    您可以返回对列表的 const 引用而不是指针(或只是指向 const 的指针)。客户仍然可以对其进行 const 转换,但这将是他们自己的问题。

    const list<int>& GetList() const { return *_myItems; }
    

    【讨论】:

    • 这会在类之外公开实现细节。从而将类的任何用户紧密绑定到您的实现细节。糟糕....
    • 使用私有实现模式并将 getter 代码移出标头。但是,是的,迭代器才是真正的方法。
    【解决方案3】:

    只需返回列表的副本:

    list<int> GetList() { return *_myItems; }
    

    不要过早优化。这是万恶之源。

    【讨论】:

      猜你喜欢
      • 2018-10-18
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 2012-09-15
      • 2010-09-06
      • 2018-09-12
      • 2012-12-18
      • 1970-01-01
      相关资源
      最近更新 更多