【问题标题】:Naming convention for Object Ownership in Methods方法中对象所有权的命名约定
【发布时间】:2011-07-27 11:41:37
【问题描述】:

有没有办法在方法的签名中编码,无论对象所有权是否改变?在获取或返回指针的 Getter() 和 Setter() 中,您永远不知道对象所有权是否发生变化。

你怎么看:

// Uses pConfiguration or creates its own copy - the ownership is un-touched
void ContainerClass:SetConfiguration( const Configuration* pConfiguration ) {}
// Takes the ownership of pConfiguration (and deletes it in the destructor)
void ContainerClass:PutConfiguration( Configuration* pConfiguration ) {}
// Returns a 'reference' and keeps the ownership (you must not delete it)
const Configuration* ContainerClass::GetConfiguration() {}
// Returns a _new_ object and transfers the ownership to you
Configuration* ContainerClass::TakeConfiguration() {}

Set() vs. Put() 和 Get() vs. Take() 也是一种编码方式,或者您会使用类型(const vs. non-const) - 还是您从上下文?

最好的问候,

查理

【问题讨论】:

  • 你检查过智能指针吗?它将避免这些类型的问题。
  • 嗯......它解决了删除问题......但它仍然没有说明对象所有权。我必须考虑 - 如果它解决了我所有的问题:)

标签: c++ oop naming-conventions


【解决方案1】:

在接口中标识所有权未更改的最佳方法是不使用指针。更喜欢指针的引用:

// Does not take ownership
void ContainerClass::SetConfiguration( const Configuration& config ) {}

// Does not release ownership
const Configuration& ContainerClass::getConfiguration() const {}

当您需要实际转移内存所有权时,最好按名称记录它。如果您真的想在签名中明确说明,请使用旧的std::auto_ptr

void ContainerClass::SetConfiguration( std::auto_ptr<Configuration> cfg );
std::auto_ptr<Configuration> ContainerClass::CopyConfiguration() const;

std::auto_ptr 具有 copy 实际上意味着 转让所有权 的奇怪属性。

【讨论】:

    【解决方案2】:
    1. 编写好的文档和 cmets(可以使用 doxygen)
    2. 在 Qt 中,函数经常使用所有权方法,例如 itemAttakeAtaddXXX 总是转移所有权,这反映在文档中。所以你可以使用get()/take()set()/put()。无论如何,好的文档总是有帮助的,即使你的函数名称是不言自明的。

    【讨论】:

    • 是的,好的文档没什么好讨论的。但是在签名中有一个命名约定,你会在你的代码中拥有这些信息——而不是在另一个标题中。
    • 你不能在同一个句子中说 Qtgood documentation。 Qt 的文档非常缺乏,函数签名也没有(记录的)约定。 QBoxLayout::addWidget 是否转让其论点的所有权?猜一下。阅读文档。阅读源代码。请注意,此时您会咕哝“wtf!?”。并停止使用 Qt 作为良好文档的示例。如果文档让你阅读源代码,那是非常错误的。
    【解决方案3】:

    大多数时候,当使用指针时,没有“所有权”开始 与,所以它没有改变的问题。但设计是关键;这 类的作用应该明确它与对象的关系 指向。比所有权或其他更高的层次。然后 反过来,关系决定了它将对对象做什么。

    对于所有权相关的特殊情况,std::auto_ptr 是表达转移的标准方式。绝对的转会, 尽管;如果参数的类型为std::auto_ptr,则调用者 一旦他被调用该函数,他甚至无法访问该对象。 (我有 发现这在线程场景中非常有效。这确实有道理 在任何给定时间由特定线程拥有的对象,以及 没有其他线程可以访问它,std::auto_ptr 表达了这一点 非常清晰有效。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 2023-03-20
      • 2012-03-17
      • 1970-01-01
      • 2013-03-31
      相关资源
      最近更新 更多