シングルトンを使うのはやめよう
概要
この記事はC++の作者Bjarne Stroustrup
等によって書かれたコーディングガイドラインのAvoid singletons
の箇所の翻訳です。
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Ri-singleton
シングルトンを使うのはやめよう
理由
シングルトンは基本的に変装したグローバルオブジェクトに過ぎないため。
例
class Singleton { // シングルトンオブジェクトが確実に1つだけ作られて // プロパティの初期化が行われるようにする };
シングルトンという発想には多くの亜種がある。 それが問題の1つである。
メモ
あなたがグローバルオブジェクトを変更したくない場合、const
またはconstexpr
を宣言する。
例外
最初の使用での初期化を行うための純粋なシングルトン(設計を考えなくて良いような)の場合は使用できる。
X& myX() { static X my_x {3}; return my_x; }
これは初期化順を制御する最も効果的な解決策の1つだ。 マルチスレッド環境において静的オブジェクトはレースコンディションを引き起こさない。(うっかりそのコンストラクタ内から共有オブジェクトにアクセスしない限り)
もし、あなたが他の大勢のようにシングルトンをオブジェクトを1つだけ作成するためのクラスと定義するのなら、myX
のような関数はシングルトンではない。そして、この便利なテクニックはシングルトンを無くすルールの例外ではない。
実施
一般化することは非常に難しい。
singleton
を含む名前を持つクラスを探す。- 作成された単一オブジェクトを探す。(オブジェクトを数えたりコンストラクタを調査する)
- クラスXの持つpublic static関数が内部に静的なクラスXを持ち、それのポインタや参照を返している場合、それを禁止する。