(我没有阅读过“ 干净代码”,对Java也不太了解。)
将创建许多微小实体(每个都有明确定义的责任)的想法应用于命名空间是否有意义?
是的,就像重构为多个类和多个函数一样。
一小组相关类是否应该始终包装在命名空间中?
无需实际回答:是的,您至少应使用一个顶级名称空间。这可以基于项目,组织或您喜欢的任何对象,但是使用很少的全局名称将减少名称冲突。用于将其下所有其他内容分组的单个名称空间仅引入一个全局名称。(除了外部“ C”功能,但这是由于C的互操作性,并且仅影响其他外部“ C”功能。)
一小组相关类是否应该包装在专用于它们的命名空间中? 大概。特别是如果您发现自己在这些类上使用公共前缀– FrobberThing,FrobberThang,FrobberDoohickey –您应考虑使用名称空间– frobber :: Thing等。如果它们是较大项目的一部分,则它仍将位于您的根名称空间或其他名称空间下。
这是管理拥有许多小类的复杂性的方法,还是管理大量名称空间的成本过高?
以上面的前缀名称为例,管理frobber :: Thing比FrobberThing更加容易。使用某些工具,例如文档和代码完成,甚至可能更容易。ADL有所不同,但这可以使您满意:关联名称空间中的名称较少,使得ADL更易于理解,您可以使用声明将特定名称注入一个或另一个名称空间。
命名空间别名使您可以在特定的上下文中将较短的名称用于较长的命名空间,这又使更容易使用:
void f() {
namespace CWVLN = Company_with_very_long_name; // Example from the standard.
// In this scope, use CWVLN::name instead of Company_with_very_long_name::name.
namespace fs = boost::filesystem; // Commonly used.
}
考虑一下Boost,它有一个根根名称空间,boost和随后的许多子命名空间-boost :: asio,boost :: io,boost ::文件系统,boost :: tuples等,用于各种库。 一些名称被“提升”到根名称空间:
所有定义都在命名空间:: boost :: tuples中,但是最常见的名称通过使用声明提升为命名空间:: boost。这些名称是:tuple,make_tuple,tie and get。此外,ref和cref直接在:: boost命名空间下定义。
与带有“实际”模块的语言的最大区别是使用扁平结构的普遍性,这种情况通常发生是因为这是它的工作方式,除非您花费额外的精力来定义嵌套名称。