4

1つのレベルの名前空間の使用法を理解できます。しかし、名前空間の3つのレベル。非常識に見えます。その実用的な使い方はありますか?それとも単なる誤解ですか?

4

9 に答える 9

9

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

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

于 2008-09-22T19:55:17.107 に答える
2

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

plugins::v1::function

2.0 が展開されると、それらは v2 サブ名前空間に配置されます。将来的に下位互換性を適切にサポートする必要がある v1 メンバーは非推奨にするだけで、決して削除しない予定です。これは「正気」な使用法のほんの一例です。違う人もいるとは思いますが、先ほども言ったように、それは意見の問題です。

于 2008-09-22T19:54:40.900 に答える
1

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

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

于 2008-09-22T19:54:40.433 に答える
1

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

于 2008-09-22T19:55:08.793 に答える
1

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

于 2008-09-22T19:59:50.233 に答える
0

コードベースが大きいほど、階層的な名前空間の必要性が高くなります。プロジェクトがどんどん大きくなるにつれて、何かを見つけやすくする方法でプロジェクトを分割する必要があることに気付きます。

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

于 2008-09-22T20:03:30.770 に答える
0

それは、ニーズとプログラミング スタイルによって異なります。しかし、 の利点の 1 つは、namespace名前空間を分割するのに役立つことです (そのため、名前が付けられました)。名前空間が 1 つの場合、プロジェクトのサイズと複雑さが増すにつれて、名前の衝突の可能性も高くなります。

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

于 2008-09-22T19:59:05.507 に答える
0

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

しかし、boost (およびその他のライブラリ) で複数の名前空間レベルが適切に使用されているのを見てきました。すべてがブースト名前空間にありますが、ライブラリは独自の名前空間にあることが許可されています (推奨されていますか?)。例 - boost::this_thread 名前空間。それは次のようなことを可能にします...

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

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

于 2008-09-22T20:02:01.460 に答える
0

.Net 基本クラス ライブラリを見て、名前空間階層がうまく利用されていることを確認してください。いくつかの場所では 4 ~ 5 レベルの深さになりますが、ほとんどは 2 ~ 3 レベルで、組織は物事を見つけるのに非常に適しています。

于 2008-09-22T20:02:40.990 に答える