回答:
名前の接頭辞は、名前空間と同じものではありませんが、それはあまり有用ではなく、読み取り/解析がより困難な方法で行われますか?質問自体は答えませんか?
using
、by import xxxxxxxxx as yyy
などで定義される名前空間で
using SDL;
たり、あちこちで打ち込んだりする必要がありSDL_*
ますか?
名前空間を持つほとんどの(すべて?)言語はオブジェクト指向である傾向があります。互換性のない実装が複数ある場合でも、多くの場合、人間が読み取れる型の名前が適切です。(これはオブジェクト指向の再利用に関する他の問題を引き起こしますが、それはこの質問の目的ではありません)。たとえば、Javaには、バックグラウンドUIタスクに使用されるタイマーと、バックグラウンドアプリケーション(AWT / Swingに関連付けられていない)タスクに使用されるタイマーがあります。名前空間を使用すると、これらの同じ名前のオブジェクトを異なるサブAPIに配置できます。
名前空間が存在するようになった理由は、他の開発者が自分のオブジェクトにどのような名前を付けるかを予測するという不合理なタスクと関係がありました。C ++はこの概念を導入しました(少なくとも、この概念で最初に触れた最初の言語でした)。これは、ベストプラクティスを実践するためのガイドラインがなくても役に立ちました。Javaは概念を適合させ、名前空間に会社名を含む「ベストプラクティス」を追加しました。そうすれば、自分の会社について心配するだけで済みました。
プレフィックスはかなり面倒になります。いつ適用しますか?いつ適用しないのですか?構造体/クラス/グローバルメソッドはプレフィックスを取得しますか?メソッドはどうですか?構造体のプロパティはどうですか。ありがたいことに一度にすべてではありませんが、これらのすべてをコードで見ました。名前空間は、これらすべての質問にある程度の予測可能性を提供し、個人的な「ベストプラクティス」というよりも言語機能にします。
名前空間は素晴らしいアイデアだと思います。名前のスコープを制限することにより、名前の競合を防ぐのに役立ちます。Javaパッケージでは、推奨されるパッケージ命名規則はドメイン名に基づいており、一意である必要があります。これにより、カスタムライブラリでの名前の競合を防ぐことができます。全体的に、それらは、広義の命名をもう少しユニークにしますが、それでもプログラマーは、いくつかのあいまいな命名規則に従う必要なく、自分の作品を命名する際にかなり多くの自由を与えます。
名前空間/モジュール/パッケージは、名前の競合を回避するのに役立ちます。名前のプレフィックスも同様ですが、名前空間には、現在の名前空間にシンボルをインポートできるという追加の利便性があるため、Namespace :: *全体を気にする必要はありません。
一部の言語(Pythonなど)では、特定のシンボルのみを現在のモジュールにインポートしたり、シンボルを別の名前でインポートしたりすることにより、この機能を拡張しています。これは、少数のクラス/関数/定数のみに関心がある場合、または一部のシンボルがネームスペース内のシンボルと競合するが、一部は競合しない場合に役立ちます。
一部の言語(Rubyなど)では、モジュールのメソッドをクラスに含めることができます。これは、ポリモーフィズムとジェネリックに役立ちます。たとえば、同じように動作するイテレータを持つ複数のクラスがある場合、オブジェクト内のデータをソートおよびフィルタリングするメソッドを提供する別のモジュールから、これらすべてのクラスにメソッドを混在させることができます。これにより、has a
関係とis a
(継承)関係が可能になります。
using
特定の名前空間であり、その名前空間の識別子の先頭にプレフィックスを付ける必要がないと言うことができます。