推荐的C ++库设计

时间:2013-02-01 16:44:05

标签: c++ design-patterns dll

我正在开发一个C ++库,提供与图像/信号处理和其他东西相关的不同功能。它基本上是一个开发库,供开发人员进一步使用。我希望它尽可能方便易用。我有三种不同的模型:

模型1:

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

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

模型2:

父命名空间,根据功能进一步细分为子命名空间。例如,.NET Framework的父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();
   }
}  

我需要建议哪种设计模型最好?还有其他更好的方法吗? 目前我对第二种模式很满意。

1 个答案:

答案 0 :(得分:5)

如果这些功能可以单独使用(看起来很像,看看你的建议),并且几个功能可以按语义分组,我绝对会选择第二个选项。


选项1:将所有内容放在一个namespace中会导致添加太多不同的内容,并将其分组到一个组中。

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

选项3:此选项与选项2几乎相同,但使用class代替namespace似乎对我不利。 C ++标准为此提供了namespace,使用它们。


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


示例:我有自己的库,它实现了套接字,线程,IPC通信等的包装。我选择的结构正是您在选项2中的建议。