長すぎる名前空間に別名をつける

それができるということをつい先日に知った。


Javaにはパッケージというものがって、たとえば、パッケージ名を

package jp.co.my_company_name.app_name;

public class MyClass {    // パッケージ内で一意な名前であれば名前衝突は起きない
}

のようにすることによって、名前の衝突を防ぐことができる。*1


C++には名前の衝突を防ぐために名前空間というものがある。

namespace jp
{
namespace co
{
namespace my_company_name
{
namespace app_name
{

class MyClass    // 名前空間内で一意な名前であれば名前衝突は起きない
{
};


}
}
}
}

わりとしんどい。実際にこんなことをやっている人を見たことはないが、仮に頑張ってこのような名前空間を構成したとしよう。


MyClassの利用者側はこうだ。

using namespace jp::co::my_company_name::app_name;

// ...

MyClass* obj = new MyClass();

ここまではまだ良い。その名前空間を使用するソースファイル内で1度記述するだけで良いからだ。問題は実際に衝突が起きて、各クラス(など)を使うときに、各所で完全修飾しなければならないときである。

jp::co::my_company_name::app_name::MyClass* obj = new jp::co::my_company_name::app_name::MyClass();

これはさすがにしんどい。
単純にJavaと比較しても、"." と "::" では、記述の長さと読みやすさが違ってくる。

もちろん、型推論を使えば以下のように書けるが。

auto obj = new jp::co::my_company_name::app_name::MyClass();

問題の本質はそこじゃない。


実は、なんと、


名前空間に別名をつけることができます!

namespace short_name = jp::co::my_company_name::app_name;

// ...

short_name::MyClass* obj = new short_name::MyClass();


やるじゃないか。



以下、じじいの戯れ言

私がまだ19歳くらいだった幼い頃、C++の仕事はたぶん、まだ今よりはあったし、当時は毎日のように(学習として)C++のプログラムを書いていた。残念なことに、社会に出てからは、C++を書く機会がめっきり減ってしまった。fucking the LL. それから長い月日が流れて、私はもはや最近のC++についていけなくなってしまっている。
それどころか、今ではチームの進捗管理やら打ち合わせ、報告書や設計書の作成にばかり時間を取られてしまって、コーディングをする時間そのものが減ってきている。それでも、あるいはそれゆえか、こうして久しぶりにC++を書くのは楽しいものだと実感する。なにより、苦労して作ったものが速く動いてくれるのが嬉しいじゃないか。

まだだ・・・まだ終わらんよ・・・

どうにかして、定年までプログラマとして生きてゆきたい。

それができなかったときは、私はこのブログに日々のアルバイトで出会った嫌な客の悪口を書くことにする。



ところで、名前空間は、CamelCaseで命名するのが一般的なのか、under_scoreで命名するのが一般的なのか。私はC++ではなんとなく、クラス名はCamelCase、定数はすべて大文字、それ以外はすべて小文字のunder_score形式で書いている。

*1:もちろん、Javaのパッケージは名前の衝突を防ぐためだけにあるわけではないが、パッケージによって結果的に名前衝突を避けることができる。