是否应将无状态仅含方法的类转为命名空间中的自由函数?
问题描述
我最初定义了如下类A:
class A { public: void run(int x); private: void run_helper1(); void run_helper2(); void run_helper3(); int a_; double b_; bool c_; };
后来我意识到该类无需维护状态,仅需使用其中的函数。请问将该类改为命名空间中的自由函数是否合理?若如此,我将失去public与private的访问控制,所有辅助函数都会变为公开,这似乎是不佳的设计。
解决方案
把无状态的类改成命名空间下的自由函数是完全合理的选择,这更贴合C++中“用命名空间组织无状态功能”的设计理念。针对你担心的辅助函数暴露问题,有几种实用的解决办法:
用匿名命名空间封装辅助函数:在实现文件(
.cpp)里把所有辅助函数放到匿名命名空间中,这样它们的作用域被限制在当前编译单元内,外部代码根本访问不到。头文件里只对外暴露run函数的声明就行,示例如下:
头文件(a.h):namespace A { void run(int x); }实现文件(
a.cpp):namespace { void run_helper1() { /* 具体实现 */ } void run_helper2() { /* 具体实现 */ } void run_helper3() { /* 具体实现 */ } } namespace A { void run(int x) { // 在run内部调用辅助函数 run_helper1(); run_helper2(); run_helper3(); } }嵌套“细节”命名空间:如果辅助函数需要在多个编译单元之间共享,但又不想对外公开,可以创建一个嵌套的
A::detail命名空间,把辅助函数的声明放在这个命名空间下,同时在头文件里加注释说明这是内部实现细节,外部代码不要直接调用。不过这种方式依赖编程约定,外部代码还是能通过全名访问,安全性不如匿名命名空间。保留类但改用静态成员函数:要是不想切换到命名空间,也可以把类里的所有成员函数改成静态函数,同时删掉那些不需要的成员变量。这样依然能利用类的访问控制隐藏辅助函数,外部调用时直接用
A::run(x)就行,不用实例化对象。这种方式适合需要保留原有调用习惯的场景。
总的来说,匿名命名空间是处理这类无状态辅助函数封装的最优方案,既能清晰组织功能,又能确保内部实现不被外部干扰。
内容的提问来源于stack exchange,提问作者jlev
相关产品推荐
相关产品推荐

