【问题标题】:const semantics for database or filesystem access用于数据库或文件系统访问的 const 语义
【发布时间】:2012-02-07 22:13:44
【问题描述】:

在处理内存数据结构时,我经常使用const 并保持我的代码正确,但我不确定const 应该如何应用于更复杂的对象,例如:

  • 表示与远程系统的连接的对象
  • 由数据库支持的对象(可以按需从数据库中加载部分)
  • 由磁盘目录树支持的对象(可以访问由单独的对象层次结构控制的目录树)

const 方法对于此类对象应该表示什么?我能想到几种可能性:

  • "strict" const - 不修改任何内存状态的方法是 const。但是,这似乎会破坏封装,因为它需要调用者知道哪些方法会修改连接状态,哪些不会。
  • "logical" const - 不修改对象逻辑状态的方法是 const。但是,这可能需要将大量状态和缓存变量标记为mutable。虽然我意识到这就是 mutable 的设计目的,但使用它感觉就像是一种 hack。此外,鉴于 const 的意思是“我保证不会修改它”,当方法可能以奇怪而奇妙的方式(只要它们保持封装)修改连接状态时应用它似乎不正确,缓存结果为随心所欲,在连接失败时抛出异常等。
  • 没有 const - 鉴于前面的问题,const 对更复杂的对象没有太大意义吗?

哪种方法最有用?哪个最常见?

【问题讨论】:

  • 这似乎与我不久前提出的一个问题有关:stackoverflow.com/questions/5208184/…
  • 主观,但我想说如果你有一个数据库连接对象,我会让const 引用连接的参数:重新连接、关闭等应该是变异操作。另一方面,执行查询可能是const。因此对对象的 const 引用可以执行查询但不能关闭连接。 (当然连接总是可以从另一端关闭。)

标签: c++ constants


【解决方案1】:

这是一个难题。我现在实际上正在做同样的事情。我有一个由 MySQL 数据库支持的大型内存数据结构。我从“尽可能使用 const”的方法开始,但事实证明这在实践中并不常见:

  • 您可能正在使用不正确的第 3 方库。
  • 并非所有SELECT 语句实际上都是只读的。例如,SELECT GET_LOCK 肯定会修改 db 端的状态。
  • 我还没有遇到很多能正确使用mutable的C++程序员。我当然没有太多经验。未来的维护者可能会导致比 mutable 解决的问题更多的问题。你最了解你的团队,所以你是否愿意走这条路取决于你。

我认为具有单个可变数据库句柄的 const 对象可能是最优雅的解决方案。决定一个 const 对象应该能够合理地做什么,并使所有这些函数成为 const。您的类的用户只需要知道哪些函数是 const 哪些不是。头文件会给他们。他们不需要知道为什么特定函数是 const 或 non-const。我确实同意,尽管一堆可变成员开始看起来很骇人听闻。

就我而言,我基本上不得不放弃 const 正确性。一个 const 对象会被戴上手铐,以至于它无法做任何有用的事情。根据我多年的经验,我怀疑这在实践中通常会发生。逻辑 const 正确性是一个很好的理想(如果你从头开始构建,你绝对应该从那里开始),但是当涉及到真正的、可交付的代码时,没有 const 是要走的路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多