読者です 読者をやめる 読者になる 読者になる

静的よりも無名、グローバルインスタンスよりグローバル関数

c/c++

最近、やっと意識していること。

static HogeManager hogeManager_;

ではなく、

namespace {
HogeManager hogeManager_;
}

とする。
HogeManagerは静的でありたいわけではなく、
ファイル内アクセスをしたいだけに過ぎないから正当な機能である無名名前空間を使う。
(Cだとstaticにせざるをえないけど)

Hoge* hoge = HogeManager::getInstance()->create(...);

ではなく、

Hoge* hoge = ::CreateHoge(..);

を使う。
Hogeをつくるために、
HogeManagerのインスタンスをグローバルにする必要はない。
関数で十分。
グローバル関数は悪ではないが、
グローバル変数は悪だ、という理念に従えばこれは当然の理となる。
CreateHogeの中身は、

namespase {
HogeManager hogeManager_;
}

Hoge* CreateHoge(...)
{
    return hogeManager_.create(...);
}

だったりする可能性は高いが、
静的よりも無名、グローバルインスタンスよりもグローバル関数、だと思ってる。