gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:39:17 38 4
gpt4 key购买 nike

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

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

对于这样的对象,const 方法应该表示什么?我可以想到几种可能性:

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

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

最佳答案

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

  • 您可能使用的是常量不正确的第 3 方库。
  • 并非所有SELECT 语句实际上都是只读的。例如,SELECT GET_LOCK 肯定会修改数据库端的状态。
  • 我没见过很多能正确使用mutable 的C++ 程序员。我当然没有太多经验。 future 的维护者可能会导致比 mutable 解决的问题更多的问题。您最了解您的团队,因此是否要走那条路完全取决于您。

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

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

关于c++ - 数据库或文件系统访问的 const 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8821258/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com