Namepsaces / Packagesのメリット


14

一部のプログラミング言語(JavaやC ++など)には、「パッケージ」または「名前空間」と呼ばれる言語機能があります。名前空間を持つことは本当に便利ですか?SDLのように(たとえばSDL_BlitSurface())、そのような言語機能を使用せずに、関数とクラスを特定のライブラリに属する​​ものとしてマークすることができます。名前空間は持つ価値があるほど有用ではありませんか?ライブラリでは便利ですが、アプリケーションでは役に立ちませんか?小さなプロジェクトを除いてどこでも便利ですか?考え?

回答:


16

名前の接頭辞は、名前空間と同じものではありませんが、それはあまり有用ではなく、読み取り/解析がより困難な方法で行われますか?質問自体は答えませんか?


識別子の名前の先頭にプレフィックスを付けることは、名前空間のような言語機能を使用することとは異なります。たとえば、C ++では、自分がusing特定の名前空間であり、その名前空間の識別子の先頭にプレフィックスを付ける必要がないと言うことができます。
compman

2
@ user9521 -それが私のポイントは...ある
ニコール・

+1名前空間の1つの大きな利点は、不要な場合はプレフィックスをスキップ/短縮できることです-参照される特定のものが、by using、by import xxxxxxxxx as yyyなどで定義される名前空間で

1
ほとんどのプログラマーは怠け者なので、宣言しusing SDL;たり、あちこちで打ち込んだりする必要がありSDL_*ますか?
ベリンロリチュ

2
+1、しかし、あなたは本当に「あまり役に立たず、読みにくく、コンパイラによって検証されていない」ことを意味すると思います。
ラリーコールマン

5

名前空間を持つほとんどの(すべて?)言語はオブジェクト指向である傾向があります。互換性のない実装が複数ある場合でも、多くの場合、人間が読み取れる型の名前が適切です。(これはオブジェクト指向の再利用に関する他の問題を引き起こしますが、それはこの質問の目的ではありません)。たとえば、Javaには、バックグラウンドUIタスクに使用されるタイマーと、バックグラウンドアプリケーション(AWT / Swingに関連付けられていない)タスクに使用されるタイマーがあります。名前空間を使用すると、これらの同じ名前のオブジェクトを異なるサブAPIに配置できます。

名前空間が存在するようになった理由は、他の開発者が自分のオブジェクトにどのような名前を付けるかを予測するという不合理なタスクと関係がありました。C ++はこの概念を導入しました(少なくとも、この概念で最初に触れた最初の言語でした)。これは、ベストプラクティスを実践するためのガイドラインがなくても役に立ちました。Javaは概念を適合させ、名前空間に会社名を含む「ベストプラクティス」を追加しました。そうすれば、自分の会社について心配するだけで済みました。

プレフィックスはかなり面倒になります。いつ適用しますか?いつ適用しないのですか?構造体/クラス/グローバルメソッドはプレフィックスを取得しますか?メソッドはどうですか?構造体のプロパティはどうですか。ありがたいことに一度にすべてではありませんが、これらのすべてをコードで見ました。名前空間は、これらすべての質問にある程度の予測可能性を提供し、個人的な「ベストプラクティス」というよりも言語機能にします。


Haskellには名前空間(モジュール)があり、オブジェクト指向ではありません。
ジェレミーハイラー

3

名前空間は素晴らしいアイデアだと思います。名前のスコープを制限することにより、名前の競合を防ぐのに役立ちます。Javaパッケージでは、推奨されるパッケージ命名規則はドメイン名に基づいており、一意である必要があります。これにより、カスタムライブラリでの名前の競合を防ぐことができます。全体的に、それらは、広義の命名をもう少しユニークにしますが、それでもプログラマーは、いくつかのあいまいな命名規則に従う必要なく、自分の作品を命名する際にかなり多くの自由を与えます。


1
ただし、Javaの特定の規則の場合、誰もがWebサイトを持っているわけではありません。また、あるWebサイトから別のWebサイトにプログラムを移動する場合(SourceforgeからGithubなど)、意味がありますが、他のことがコードに依存している場合はパッケージを変更するのは不便です。
コンプマン

1
Javaの規則は、ホストされている場所ではなく、組織に適用されます。自分自身を組織として宣言し、それを行うことができます。パッケージ名に使用できない文字を許可するURLの問題もあります。しかし、そこには行きません。したがって、パッケージ名として「me.user9521」を使用するだけで設定されます。
ベリンロリチュ

1
規約はウェブ名ではなく、ドメイン名に関するものです。Webサイトなしでドメインを持つことができます。
デビッドソーンリー

1

名前空間/モジュール/パッケージは、名前の競合を回避するのに役立ちます。名前のプレフィックスも同様ですが、名前空間には、現在の名前空間にシンボルをインポートできるという追加の利便性があるため、Namespace :: *全体を気にする必要はありません。

一部の言語(Pythonなど)では、特定のシンボルのみを現在のモジュールにインポートしたり、シンボルを別の名前でインポートしたりすることにより、この機能を拡張しています。これは、少数のクラス/関数/定数のみに関心がある場合、または一部のシンボルがネームスペース内のシンボルと競合するが、一部は競合しない場合に役立ちます。

一部の言語(Rubyなど)では、モジュールのメソッドをクラスに含めることができます。これは、ポリモーフィズムとジェネリックに役立ちます。たとえば、同じように動作するイテレータを持つ複数のクラスがある場合、オブジェクト内のデータをソートおよびフィルタリングするメソッドを提供する別のモジュールから、これらすべてのクラスにメソッドを混在させることができます。これにより、has a関係とis a(継承)関係が可能になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.