1

私は現在、完成したときにいくつかのツールで使用されるかなり大きな静的ライブラリを開発中です。このプロジェクトは、これまで関わってきたどのプロジェクトよりもやや大きいので、プロジェクトの適切な構造を考える時期に来ていることに気付きました。名前空間の使用は、論理的な手順の 1 つです。

私の現在のアプローチは、ライブラリをパーツに分割することです (スタンドアロンではありませんが、その目的はそのような分離を必要とします)。私は、いくつかの非常に一般的な typedef と定数 (ライブラリのさまざまな部分で使用される) を保持する「コア」部分を持っています。他の部分は、たとえば、いくつかの「ユーティリティ」(ハッシュなど)、ファイル i/o などです。これらの各部分には、独自の名前空間があります。「utils」の部分をほぼ完成させましたが、私のアプローチがおそらく最善ではないことに気付きました。問題 (そう呼びたい場合) は、'utils' 名前空間で、'core' 名前空間から何かが必要であり、その結果、コア ヘッダー ファイルと多くの using ディレクティブが含まれることになります。

それで、これはおそらく良いことではなく、何らかの方法で変更する必要があると考え始めました。私の最初のアイデアは、ネストされた名前空間を使用して、core::utils のようなものを作成することです。これにはかなりのリファクタリングが必要になるため、まずここで質問したいと思います。どう思いますか?これをどのように処理しますか?またはより一般的に: 名前空間とコード編成の観点から静的ライブラリを正しく設計する方法は? それに関するガイドラインや記事がある場合は、それらもメントインしてください。ありがとう。

注: 1 つだけでなく、より多くの優れたアプローチがあることは確かです。アイデアや提案などを自由に投稿してください。私はこのライブラリを設計しているので、本当に良いものにしたいと思っています。目標は、できるだけクリーンで高速にすることです。唯一の問題は、多くの既存のコードを統合してリファクタリングする必要があることです。これは本当に骨の折れるプロセスです (ため息) - だからこそ、優れた構造が非常に重要です)

4

2 に答える 2

3

私自身のアプローチは、ライブラリごとに 1 つの名前空間を使用することです。(キーボードで) 入力するのが好きでない限り、入れ子になった名前空間がパーティーに何かをもたらすとは思いません。これは問題なく機能しました。

于 2010-06-11T13:34:11.880 に答える
1

ええと、core.hヘッダーには次のようなものがあると思います

#include <string>
#include <iostream>
namespace core
{
    typedef std::string mystring;
    #define mycout std::cout
}

そしてusing、グローバル名前空間の汚染を防ぐための1つのディレクティブではありません。ヘッダーでは、次のutils.hようなものを使用します。

#include "core.h"
namespace utils
{
    core::mystring stringfunction(core::mystring &stuff)
    {
        core::mystring result;
        // do stuff
        return result;
    }
}

したがって、mystringcore::を除いてどこにもありません。これにはもう少し入力が必要ですが、それが名前空間の目的であり、型/関数/クラスをどこから取得しているかを自分自身に知らせます。

アップデート

話の反対側は次のようなものです:

core.h上記のようなコア名前空間にあるものを宣言するヘッダー。

utils.hcore :: utils名前空間にあるものを宣言するヘッダーと、その後のnamespace utils = core::utilsステートメント。これにより、2つのアプローチがユーザーと同じになり、ヘッダーやファイルのmystring代わりにのようなものを書くことができます。core::mystringutils*.h*.cpp

のためにこのような何かutils.h

#include "core.h"
namespace core
{
    namespace utils
    {
        mystring stringfunction(mystring &stuff)
        {
            mystring result;
            // do stuff
            return result;
        }
    }
}
namespace utils = core::utils; // allow user to type utils::stringfunction

これにより、ユーザーコードとライブラリコードが少しクリーンアップされます。

于 2010-06-11T12:48:31.180 に答える