4

画像/信号処理などに関連するさまざまな機能を提供する C++ ライブラリを開発中です。基本的に、開発者がさらに使用するための開発ライブラリです。できるだけ便利で使いやすいものにしたい。私は3つの異なるモデルを念頭に置いています:

モデル 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();
   }
}  

これらの設計モデルのどれが最適かについての推奨事項が必要ですか? 他のより良いアプローチはありますか?現在、私は2番目のモデルに満足しています。

4

1 に答える 1

6

関数を独立して使用でき (あなたの提案を見るとそう思われます)、いくつかの関数を意味的にグループ化できる場合、私は絶対に 2 番目のオプションを選択します。


オプション 1: すべてをnamespace1 つにまとめることは、あまりにも多くの異なるものを 1 つのグループにグループ化して追加することにつながります。

オプション 2: 他の方法よりもはるかに直感的です。ライブラリはいくつかのまったく異なるものを組み合わせているため、すべてをグループにまとめ、これらすべてのグループをnamespace名前付きの大きな名前 (ライブラリの名前) の一部にすることをお勧めします。

オプション 3: このオプションはオプション 2 とほぼ同じですが、class代わりに使用するのnamespaceは良くないようです。C++ 標準ではnamespace、このための s が提供されているので、それらを使用してください。


しかし、それは本当にライブラリに依存します。あなたが書くつもりです。正直なところ、これらのオプションのいずれかを選択し、後で別のオプションに切り替えることは大したことではありません. したがって、これらのオプションのいずれかを使用し始めることができます。状況が悪化し、他のオプションのいくつかがより良い選択になることがわかります。それを実行してください。


例: ソケット、スレッド、IPC 通信などのラッパーを実装する独自のライブラリがあります。選択した構造は、オプション 2 で提案したものとまったく同じです。

于 2013-02-01T16:57:43.923 に答える