C++ で階層型名前空間が実際に使用されるようになるのはいつですか?

StackOverflow https://stackoverflow.com/questions/117110

  •  02-07-2019
  •  | 
  •  

質問

名前空間の 1 レベルの使用法は理解できます。ただし、名前空間は 3 レベルです。正気じゃないように見える。実用的な用途はあるのでしょうか?それとも単なる誤解でしょうか?

役に立ちましたか?

解決

階層型名前空間には、徐々により洗練された定義を可能にするという意味での用途があります。確かに、1 つのプロバイダーが同じ名前の 2 つのクラスを生成する場合があります。多くの場合、最初のレベルは会社名で占められ、2 番目のレベルでは製品が指定され、3 番目 (場合によってはそれ以上) でドメインが指定されます。

名前空間の分離には他の用途もあります。よくある状況の 1 つは、ファクトリ パターンの基本クラスを独自の名前空間に配置し、プロバイダーによって派生ファクトリを独自の名前空間に配置することです。例えば。 System.Data, System.Data.SqlClient そして System.Data.OleDbClient.

他のヒント

明らかにそれは意見の問題です。しかし、結局のところ、それは組織に帰着します。たとえば、次のような関数/オブジェクトを持つプラグイン API を持つプロジェクトがあります。

plugins::v1::function

2.0 がロールアウトされると、それらは v2 サブ名前空間に配置されます。将来的に下位互換性を適切にサポートする必要がある v1 メンバーは非推奨にするだけで、削除することはありません。これは「賢明な」使用法の一例にすぎません。意見が異なる人もいると思いますが、先ほども言いましたが、それは意見の問題です。

大規模なコードベースにはそれが必要になります。例としてブーストを見てください。ブーストコードを「非常識」と呼ぶ人はいないと思います。

階層の 1 つのレベルでは、人々は非常に大まかに 10 項目程度しか理解できないという事実を考慮すると、2 つのレベルでは最大 100 しか得られません。十分に大きなプロジェクトではさらに多くのものが必要になるため、簡単に 3 レベルの深さになってしまう可能性があります。

私は yyy 社で XXX アプリケーションに取り組んでおり、GUI サブシステムを作成しています。したがって、名前空間として yyy::xxx::gui を使用します。

複数のレベルが必要な状況に簡単に遭遇することがあります。たとえば、あなたの会社では、サードパーティのコードから分離するためにすべてのコードに巨大な名前空間があり、独自の名前空間に配置したいライブラリを作成しているとします。一般に、階層的に分割された非常に大規模で複雑なシステムがある場合は、複数の名前空間レベルを使用するのが合理的です。

それはあなたのニーズとプログラミングスタイルによって異なります。しかし、その利点の1つは、 namespace 名前空間のパーティション化を支援するためのものです (それが名前の由来です)。単一の名前空間では、プロジェクトのサイズと複雑さが増大するにつれて、名前衝突の可能性も高くなります。

共有または再利用することを目的としたコードを作成している場合、これはさらに重要になります。

申請に同意します。(私の経験では) 複数レベルの名前空間を使用するほとんどの人は、ノイズが大幅に少ない Java または .NET のバックグラウンドを持っています。優れたクラス プレフィックスは、複数のレベルの名前空間の代わりに使用できることがわかりました。

しかし、Boost (および他のライブラリ) で複数の名前空間レベルがうまく使用されているのを見てきました。すべては boost 名前空間内にありますが、ライブラリは独自の名前空間内に存在することが許可されています (奨励されていますか?)。たとえば、boost::this_thread 名前空間です。それは次のようなことを可能にします...

boost::this_thread::get_id()
boost::this_thread::interruption_requested()

「this_thread」は、無料の関数のコレクションの単なる名前空間です。クラスと静的関数でも同じことができます (つまり、Java で自由関数を定義する方法) ですが、言語には自然な方法があるのに、なぜ不自然なことをするのでしょうか?

.Net 基本クラス ライブラリを見ると、名前空間階層が有効に活用されていることがわかります。いくつかの場所では 4 つまたは 5 つのレベルに分かれていますが、ほとんどの場合は 2 つまたは 3 つのレベルにとどまっており、この組織は物事を見つけるのに非常に優れています。

コードベースが大きくなるほど、階層型名前空間の必要性も大きくなります。プロジェクトが大きくなるにつれて、項目を見つけやすくするためにプロジェクトを分割する必要があることがわかります。

たとえば、現在は 2 レベルの階層を使用しています。ただし、より大きな部分の一部については、3 つのレベルに分割することについて現在話しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top