我正在开发一个C ++库,提供与图像/信号处理和其他东西相关的不同功能。它基本上是一个开发库,供开发人员进一步使用。我希望它尽可能方便易用。我有三种不同的模型:
包含库的所有功能的单个大型命名空间。例如,C ++标准库在namespace std
内实现。或者OpenCV在namespace cv
内实现。
namespace library
{
//all classes, variables, functions, datatypes are present inside this namespace
}
父命名空间,根据功能进一步细分为子命名空间。例如,.NET Framework的父namespace System
包含namespace Collections
,namespace Windows
等...
namespace library
{
//datatypes go here
namespace group1
{
//functions related to group 1
}
namespace group2
{
//functions related to group 2
}
.
.
.
}
与模型2几乎相同,但包含类static
成员的函数而不是名称空间。
namespace library
{
//datatypes go here
class group1
{
public:
static function1();
static function2();
}
class group2
{
public:
static function1();
static function2();
}
}
我需要建议哪种设计模型最好?还有其他更好的方法吗? 目前我对第二种模式很满意。
答案 0 :(得分:5)
如果这些功能可以单独使用(看起来很像,看看你的建议),并且几个功能可以按语义分组,我绝对会选择第二个选项。
选项1:将所有内容放在一个namespace
中会导致添加太多不同的内容,并将其分组到一个组中。
选项2:我发现它比其他人更直观。由于图书馆结合了几个完全不同的东西,所以将所有组分组并将所有这些组分组成一个具有名称的大namespace
的一部分似乎是一个好主意 - 图书馆的名称。
选项3:此选项与选项2几乎相同,但使用class
代替namespace
似乎对我不利。 C ++标准为此提供了namespace
,使用它们。
但它真的取决于图书馆,你要写。老实说,选择其中一个选项后再切换到另一个选项并不是什么大问题。所以,你可以开始使用其中一个选项,如果事情变得丑陋而你看,其他一些选项将是更好的选择 - 只需这样做。
示例:我有自己的库,它实现了套接字,线程,IPC通信等的包装。我选择的结构正是您在选项2中的建议。