【发布时间】:2018-07-28 03:50:36
【问题描述】:
我现在使用 3ds max SDK 已经工作了很长时间,它几乎在所有部分都没有使用 const。所以即使是Bitmap 的Width() 或Height() getter 也不会被标记为const。这在小项目中已经是一个真正的烦恼,但由于我一直在做一个更大的项目,它变得越来越可怕。
例如,出于性能原因,我在多个类实例中将单个 Bitmap 实例作为 shared_ptr<Bitmap> 成员。当然,在某些情况下,我想尽一切办法避免单个实例可能会更改所有实例的属性,因此所有原始指针获取器(SDK 必需)都提供const Bitmap*。不幸的是,现在我什至无法询问 const Bitmap* 的宽度 - 因为 Width() 是非常量的。
我在问自己处理这个问题的最佳方法是什么。我看到三个选项:
- 完全忘记 const,让一切都变成非 const。我曾经在较小的项目中这样做,但就像我说的那样,使用更复杂的技术会变得更加危险。
- 在每一个需要的地方创建一个就地
const_cast。很多地方都会出现这种情况,而且读起来很糟糕。 - 为 3ds max 类编写包装器,它们至少为可能高度安全的方法提供
const方法。这会将所有const_cast封装在一个地方,也适用于其他项目。
我已被警告(而且我知道)这可能是基于意见的。但是这个烦人的问题我已经处理了很长时间了,我很想找到解决办法,所以需要别人的经验。
【问题讨论】:
-
包装
API时要考虑的一个问题是增加了维护负担。如果他们的API更改,您必须在包装器中反映这些更改。 -
我不会想太多而选择 1; const 正确性有点像 git 中的干净历史(变基而不是合并):理论上很好,人们在其中投入了大量时间,但最终在它的有用性上被高估了。许多其他主流语言没有它,但它们做得很好。
-
@Galik 我非常不同意你的说法,API 包装器倾向于减少维护负担,因为这种方法能够将 API 更改引起的修改封装在包装器本身内部,通常无需使用包装。这通常可以通过仅更改包装器而不是更改整个代码库来逃脱。
-
@user2328447 • 你已经发现—— 痛苦地—— const 正确性的病毒性质。我会将 const 正确的代理包装器编写为无 const 库/SDK 的防火墙。
-
出于这个原因,我有效地分叉了一个库。从这些方面来说这很可怕,但在其他方面正是我所需要的。