由于C++不像Java那样具有反射,我构建了一组通用的数据容器,可以用于将数据格式化为各种格式(JSON、XML、CSV等)
更好的做法是让类名通用并使用名称空间,还是在没有名称空间的情况下创建唯一的类名?此外,这是解决这个反思问题的最佳方式吗?
例如:
namespace FormatContainers
{
class Object {...};
class Array {...};
class Value {...};
}
与
class FCObject {...};
class FCArray {...};
class FCValue {...};
这些类的用法示例:
FCObject o;
o.addNVP("Name1","Value1");
o.addNVP("Name2",5);
cout << o.toString("JSON");
收益率:
{"Name1":"Value1","Name2":5}
这两种约定之间的偏好更多的是个人偏好。
前缀名称是C风格的命名约定,以防止名称冲突。例如在OpenGL中,所有函数都以gl
为前缀。虽然这会创建唯一的名称,但最终可能会为函数/结构/类创建过长的名称。例如GTK+GIO库中的CCD_ 2。
使用名称空间是防止名称冲突的C++方法。命名空间与using指令相结合,可以使名称简洁明了,而不用担心与其他命名空间中的其他名称发生冲突。只要具有冲突名称的两个名称空间没有通过using语句导入到同一作用域中,则情况就是如此。大多数C++编译器通过在命名空间名称前面加前缀来破坏源代码中给定的名称,其方式类似于在C.中加前缀
名称不明确:
namespace N1 {
class Test {
};
}
namespace N2 {
class Test {
};
}
using namespace N1;
using namespace N2;
Test t2; // Which Test class should be used?
同样,两个公约都不比另一个"更好"。这是你喜欢的惯例,而不是你的项目指导方针所要求的惯例。在大多数情况下,您将看到C++项目中使用的名称空间和C项目中所使用的前缀。
最好使用namespace
并在namespace
中创建类。我看到了namespace
的以下优点:
- 它允许您创建不会污染全局名称空间的类和函数
- 当在
namespace
中定义的函数具有也在同一namespace
中定义的参数类型时,重载函数解析效果更好 - 它有助于创建更清晰的类名和函数名。
FormatContainers::Object
是一个比FCObject
更清晰的名称