私有类函数与未命名名称空间中的函数
我发现自己我倾向于没有私有类函数。如果可能的话,所有的私人类功能的候选人,而是我放入未命名的名称空间,并传递所有必要的信息作为函数参数。我没有一个合理的解释,为什么我这样做,但至少对我来说看起来更自然。因此我需要在头文件中公开更少的内部细节。私有类函数与未命名名称空间中的函数
您的意见是什么 - 这是正确的做法吗?
在我通常工作的半大型项目中(超过200万行代码),如果可以的话,我会禁止私人课程功能。原因是私有类的功能是私有的,但它在头文件中是可见的。这意味着,如果我改变签名(或评论),无论如何,我有时会得到一个完整的重新编译,这个编译需要几分钟的时间(或者几个小时,取决于项目)。
只是说不,并隐藏什么是私人的cpp文件。
如果我要开始新的大型c + +项目,我会强制PIMPL成语:http://c2.com/cgi/wiki?PimplIdiom移动更多的私人细节到cpp文件。
这不是100%的规则。匿名命名空间有一个巨大的缺点,就是无法为其中的函数编写UT。相比之下,完全重新编译可以是微不足道的代价。 就我个人而言,我只是禁止匿名命名空间,并强制实现私有类功能的UT覆盖范围,至少对于不那么稳定的项目来说。 – sankalpn 2016-10-28 19:14:29
我认为这是一个很好的做法。它通常具有隐藏辅助结构和数据类型的好处,这减少了重建的频率和大小。如果事实证明它们在其他地方很有用,它还使得这些功能更容易分解到另一个模块中。
它基本上归结为这个函数是否真的作为类的一部分有意义的问题。如果你唯一的意图是保持课程的细节不在头上,我会考虑使用pimpl习语。
我以前做过这件事,而且它总是很糟糕的结局。您不能将类对象传递给函数,因为它们需要访问私有成员,大概是通过引用(或者最终导致了错综复杂的参数列表),因此您无法调用公共类方法。出于同样的原因,你不能调用虚函数。我坚信(根据经验),这是一个糟糕的想法。底线:这听起来像是一种可能在实现“模块”对类有特殊访问权的地方工作的想法,但在C++中并不是这样。
你说得对,有时参数列表足够大。这绝对是这种方法的缺点。另一方面,我试图远离使用任何虚函数,所以我很少会需要调用虚函数。无论如何感谢您的答案! – drumsta 2010-08-12 21:20:39
@kriau为什么远离使用虚拟功能?你还没有删除你对头文件的依赖。这让我觉得你可能在这里寻找的是PIMPL的成语。 – 2010-08-12 21:23:08
Pimpl的+1(尽管它不是原始答案的一部分) – 2010-08-13 06:53:11
我认为这是一个非常棘手的问题(+1)。我认为还是有一些有效的答案可以打开...... – Wolf 2014-09-02 09:38:46