2013-02-01 116 views
3

我正在开发C++库,提供与图像/信号处理和其他内容相关的不同功能。它基本上是一个供开发人员进一步使用的开发库。我希望它尽可能方便和易于使用。我心里有3种不同的模式:推荐的C++库设计

模型1:

包含库的所有功能的单一大命名空间。例如C++标准库在namespace std内实现。或者在namespace cv内部实现OpenCV。

namespace library 
{ 
    //all classes, variables, functions, datatypes are present inside this namespace 
} 

模型2:

父命名空间,根据功能进一步细分成子名字空间。 e.g .NET框架的父namespace System包含namespace Collectionsnamespace Windows等等

namespace library 
{ 
    //datatypes go here 

    namespace group1 
    { 
     //functions related to group 1 
    } 

    namespace group2 
    { 
     //functions related to group 2 
    } 

    . 
    . 
    . 
} 

模型3:

几乎一样的模型2,但包含的功能类,而不是命名空间static成员。

namespace library 
{ 
    //datatypes go here 

    class group1 
    { 
    public: 
     static function1(); 
     static function2(); 
    } 

    class group2 
    { 
    public: 
     static function1(); 
     static function2(); 
    } 
} 

我需要建议这些设计模型哪个最好?还有其他更好的方法吗? 目前我很喜欢第二款车型。

+3

使用任何有意义的你代码(看看boost,例如,没有一个标准,每个库都根据需要使用嵌套命名空间......)但我要说的一件事是,使用命名空间而不是类来分组函数... – Nim

+0

我个人发现模型2更直观,并且让我知道如果我需要在API中找到某些东西,我应该在哪里看看。 – jviotti

回答

5

如果函数可以独立使用(看起来是这样,看看你的建议),并且可以将多个函数语义分组,我绝对会选择第二个选项。


选项1:把一切都在一个单一的namespace会导致增加太多不同的东西,归纳为一个单一的组。

选项2:我发现它比其他更直观。由于图书馆结合了几个完全不同的东西,所以将所有这些群组中的所有群组分组成一个好名字似乎是一个好主意,它们是名称 - 图书馆名称的大型namespace的一部分。

选项3:此选项与选项2几乎相同,但使用class而不是namespace对我来说似乎不好。 C++标准为此提供了namespace,请使用它们。


但它真的取决于图书馆,你会写。老实说,选择其中一个选项,然后切换到另一个选项并不是什么大问题。所以,你可以开始使用这些选项之一,如果事情变得很难看,那么其他一些选择将会是一个更好的选择 - 就这样做。


例子:我有自己的图书馆,它实现了插座,线程,IPC通信等包装我选择的结构正是你在选项有什么建议2.

+1

谢谢你的答案...选项2它是:)。 – sgarizvi