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

时间:2012-01-11 14:50:02

标签: c++ const

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

  • 您可能正在使用非常规的第三方库。
  • 并非所有SELECT语句实际上都是只读的。例如,SELECT GET_LOCK肯定会修改数据库端的状态。
  • 我没有见过很多可以正确使用mutable的C ++程序员。我当然没有太多经验。未来的维护者可能会导致比可变解决方案更多的问题。你最了解你的团队,所以你是否想要走这条路是由你决定的。

我认为对数据库具有单个可变句柄的const对象可能是最优雅的解决方案。确定const对象应该合理地做什么,并使所有这些函数成为const。您的类的用户只需要知道哪些函数是const,哪些不是。头文件将为他们提供。他们不应该知道为什么特定的函数是const还是非const。我确实同意,但是一堆可变成员开始看起来像个hackish。

在我的情况下,我基本上不得不放弃const正确性。一个const对象会被戴上手铐,以至于无法做任何有用的事情。根据我多年的经验,我怀疑这是实践中经常发生的事情。逻辑const正确性是一个很好的理想(,如果你从头开始构建,你肯定应该从那里开始),但是当涉及真实的,运输代码时,没有const是可行的方法。 / p>