在现实世界的项目中有意义吗?
是的,例如在 boost 中它被广泛使用。以boost::shared_ptr 为例。当我看到 namespace detail 时,我立即知道我没有过多查看该代码段,除非有错误消息告诉我这样做(即使那样,这很可能是我的错)。
强制性设计的真实世界启发示例
我猜你知道如何驾驶汽车。有很多接口:方向盘、油门/刹车/离合器踏板、显示器等等。你有兴趣使用这些界面,毕竟,这就是你使用汽车的方式:
namespace the_company{
struct wheel{
void turnLeft(deg);
void turnRight(deg) { turnLeft(-deg); }
};
struct pedal{
void tap();
void press_completely_till_something_happens();
//!< might deadlock if using break and car isn't moving
};
struct display{
so_many_colors lookat();
};
}
为了这个示例,我们将把它们组合成一辆车,但是将它们分成不同的命名空间不仅对 OOP 是实用的。
namespace the_company{
struct car{
public:
wheel & getWheel();
pedal & getBreakPedal();
...
};
}
我们对car 有什么期望?我们可以期待我们可以使用汽车的车轮或踏板,它会起作用:
car myCar;
myCar.getGasPedal().press_completely_till_something_happens();
// OH GOD; WHAT HAVE I DONE!?
myCar.getWheel().turnLeft(360);
myCar.getBreakPedal().press_completely_till_something_happens();
// Shew. That was close.
我们完全可以使用car。顺便说一句,我们没有将wheel 放入car,因为我们公司可能会生产其他使用轮子的东西,例如船、卡车、人造飞机、阀门和其他非车辆的东西,以及display可能会被更多不同的东西使用(电话、显示器、电视,等等)。
然而,为了真正让汽车运转,它必须有一个引擎。由于引擎是一些相当复杂的机器,我们将它们隐藏在hood:
namespace the_company{
namespace hood{
struct engine{
// heavily optimized code
// not so nice interface anymore
// maybe not even documentated
...
};
}
}
engine 是一头野兽,它具有可扩展性,适用于任何车辆或重型机械,而且贵公司在优化方面投入了大量精力。现在,每当车主的引擎出现问题时,他都可以简单地查看hood 并检查问题所在。
但它隐藏在某些东西后面的事实已经从一开始就告诉用户他应该知道他将要做什么。如果他不理解金属/代码,他应该向他的服务维护/支持寻求帮助。
此外,engine 可能会改变甚至被完全删除,因为我们公司发明了fusion_engine,它可以带来更好的利润。
这就是namespace detail 对我的意义:复杂的细节,可能会改变,甚至可能只对原始维护者有意义。但这没关系。它不是界面的一部分。