私有类函数与未命名的命名空间中的函数

dru*_*sta 43 c++ coding-style api-design namespaces static-members

我发现自己不会有私人课程.如果可能的话,所有候选私有类函数,而不是我放入未命名的命名空间,并将所有必要的信息作为函数参数传递.我没有一个合理的解释,为什么我这样做,但至少它对我来说更自然.因此,我需要在头文件中公开更少的内部细节.

你有什么看法 - 这是正确的做法吗?

Jus*_*mer 18

在我经常工作的半大型项目中(超过200万行代码),如果可以的话,我会禁止私有类功能.原因是私有类函数是私有的,但它在头文件中可见.这意味着如果我以任何方式改变签名(或评论),我有时会得到一个完整的重新编译奖励,这需要几分钟(或几小时,具体取决于项目).

只是对此说不,并隐藏cpp文件中的私有内容.

如果我在一个大型的c ++项目上重新开始,我会强制执行PIMPL成语:http://c2.com/cgi/wiki ?PimplIdiom 将更多私有细节移动到cpp文件中.

  • 这不是100%的规则。匿名名称空间有一个很大的缺点,就是无法为其中的功能编写UT。与之相比,完全重新编译的价格可以忽略不计。就我个人而言,我将禁止匿名名称空间,并对私有类函数(至少对于不稳定的项目)实施UT覆盖。 (2认同)
  • 我不确定Google是否也是如此。“ UT”表示单元测试吗? (2认同)
  • @sankalpn 你正在为私有函数编写单元测试吗?我认为不建议这样做。单元测试应该测试类的公共接口。如果您发现该类足够复杂以至于您想要测试私有函数,那么您应该尝试将这些私有函数提取到一个新的帮助器类中。然后,您可以测试帮助程序类的公共接口,并让原始类将一些责任委托给帮助程序类。如果你做得好,你经常会发现辅助类可以在代码库的其他部分重用。 (2认同)

小智 11

我过去做过这件事,而且总是很糟糕.您不能将类对象传递给函数,因为它们需要访问私有成员,可能是通过引用(或者您最终使用复杂的参数列表),因此您无法调用公共类方法.而且出于同样的原因,你无法调用虚函数.我坚信(根据经验)这是一个坏主意.

底线:这听起来像是在实现"模块"具有对类的一些特殊访问权限的情况下可能有用的想法,但在C++中并非如此.

  • 像任何技术一样,它很容易过度.尽管如此,我已经看到了大量具有私有方法的类,它们实际上只是辅助函数.将这些移出标题有很多好处,并且不会受到您所描述的陷阱的影响. (4认同)
  • @kriau为什么要远离虚拟功能的使用?而且你还没有删除你对标题的依赖.让我感到震惊的是,你在这里寻找的是PIMPL习语. (2认同)
  • 您不一定需要访问类的私有成员。如果需要访问,请使用私有方法。否则,为什么不必要地将该方法耦合到对象的内部状态? (2认同)

Jer*_*fin 5

它基本上归结为一个问题,即所讨论的函数是否真的有意义作为课程的一部分.如果您的唯一目的是将标题的详细信息保留在标题之外,我会考虑使用pimpl习语.