namespaceを使用する正しい方法


namespaceを使用する正しい方法
原作:Dejan Jelovic翻訳:zhigang
[訳者注]本人の翻訳レベルの制限を受けて、原文の作者の本意は完全に正確に表現されていないかもしれません.もしあなたが本文を読む過程で問題が発生したら、私に手紙を書くことができます[email protected]由来:www.codeproject.comタイトル:Using Namespaces Properlyネーミングスペース(namespace)のC++での役割は一般的ではありません.本稿の目的は,ネーミングスペースの構文を述べることではなく,ネーミングスペースの使い方,あるいはネーミングスペースを使用するコツを示すことである.ネーミングスペースは、いくつかのネーミング(name)を別のネーミングで簡単にパッケージ化できます.たとえば、
namespace net { class Socket { ... }; } ... net::Socket socket;
がこのようなパッケージ化された後、2つのライブラリ(library)でSocketクラスが実装された場合、ネーミングスペースの名前が異なる限り、ネーミング上の競合なく同時に使用できます.
しかし、両方の会社がnetworkライブラリを書く場合、コードを書くときにSocketを使用してクラスを命名する可能性はどのくらいありますか?100%近いと思います.
ネーミングスペースの名前は入力しやすいほうがいいです.つまり、ネーミングスペースの名前はあまり長くしないほうがいいです.2~4文字でいいです.このような考えを持って、あの2つの会社は彼らのネーミングスペースをnetと呼ぶ機会はどれくらいですか?5%ですか、10%ですか.
ネーミングスペースはすべての問題を解決していないことがわかります.ネーミングの衝突が発生する機会を相対的に小さくしているだけです.
「工業化長さ」という方法(Industrial Strength Solution)があります.この方法はnamespaceと命名するときに長い唯一の名前を使用し、プログラムでは短い別名を使用します.これでnetworkライブラリは次のようになります.
namespace net_33843894 { class Socket { ... }; }
net_後ろの数字は乱数発生器によって生成されます.後述の便宜上、上記のコードはヘッダファイルに格納されていると仮定する.
ユーザーが私たちのライブラリを使用する場合は、以下の内容を含む独自のヘッダファイルを作成します.
#include <netlib> namespace net = net_33843894;
彼は、ライブラリに提供されたネーミングスペースを表すために、本プロジェクト内で有効な別名を作成しました.名前netが別のライブラリで使用されている場合は、net 2、sock、または他の何かの代わりに別の名前を選択することもできます.
これで万事順調ですか.まだです.ライブラリをより簡単に、より便利に使用できるようにする必要があります.この完璧な社会では、人々がインストールファイルをダブルクリックすると、あなたのライブラリは彼らの開発環境で利用できるはずです.次はincludeで、次は他のことを忙しくすることができます.
しかし、現在の状況では、ユーザーはあなたのライブラリを使用するために自分のヘッダファイルを作成する必要があります.これは大したことではありませんが、ユーザー一人一人がこれに耐えられるわけではありません.解決策は、ユーザーが適切でないと判断した場合でもキャンセルできる合理的なデフォルト値を直接提供することです.そのため、ヘッダファイルでプリコンパイルオプションを使用すると、次のようになります.
namespace net_33843894 { class Socket { ... }; } #ifndef NO_NET_33843894_ALIAS namespace net = net_33843894; #endif
これにより、ネーミングスペースの名前にデフォルト値を提供します.この名前がすでに使用されている場合、ユーザーはNO_を定義できます.NET_33843894_ALIASマクロでは、別名はキャンセルされます.
残念なことに、短い別名netを使っていても、Socketクラスを使う方法が間違っている場合、私が使ったコンパイラでは、エラーメッセージに表示できる短い別名は一つもなく、net_を使っています.33843894::Socket.読むのに少し骨が折れる.
どうしよう?私のを見てください.
#ifdef NO_NET_33843894_ALIAS namespace net_33843894 { #else namespace net { #endif class Socket { ... }; } #ifndef NO_NET_33843894_ALIAS namespace net_33843894 = net; #endif
マクロNO_が定義されていない場合NET_33843894_ALIASは、そのままネーミングスペースに短い名前を付けて、別名を長くすればいいのです.これで、エラーメッセージが読みやすくなります.