数据库或文件系统访问的const语义

Jos*_*ley 7 c++ const

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

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

应该用什么const方法表示这些对象?我可以想到几种可能性:

  • "strict"const - 不修改任何内存状态的方法是const.但是,这似乎打破了封装,因为它需要调用者知道哪些方法修改了连接状态,哪些方法没有.
  • "logical"const - 不修改对象逻辑状态的方法是const.但是,这可能需要将很多状态和缓存变量标记为mutable.虽然我意识到这mutable是设计的目的,但使用它时,这感觉就像是一个黑客.另外,鉴于const意味着"我保证不会修改它",当方法可能以奇怪和奇妙的方式修改连接状态时(只要它们保持封装),将它应用为缓存结果似乎是正确的.他们想要的,如果连接失败则抛出异常,等等.
  • 没有const - 鉴于前面的问题,const对于更复杂的对象没有多大意义吗?

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

Mic*_*fik 2

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

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

我认为具有数据库单个可变句柄的 const 对象可能是最优雅的解决方案。确定 const 对象应该能够合理地执行哪些操作,并将所有这些函数设置为 const。你的类的用户只需要知道哪些函数是const,哪些不是。头文件将为他们提供这一点。他们不需要知道为什么特定函数是 const 或非常量。我确实同意,一堆可变成员开始看起来很黑客。

就我而言,我基本上不得不放弃常量正确性。一个 const 对象会被束缚住,无法做任何有用的事情。根据我多年的经验,我怀疑这就是实践中经常发生的情况。逻辑 const 正确性是一个很好的理想(如果您从头开始构建,那么您绝对应该从那里开始),但是当涉及到真正的交付代码时,没有 const 是可行的方法。