ぷろみん

プログラミング的な内容を扱ってます

シングルトンを使うのはやめよう

概要

この記事は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を持ち、それのポインタや参照を返している場合、それを禁止する。