55
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

4551A3E0-40A2-49F4-AC5D-98E2EBF40E15.png

Singleton は神の創造物たる普遍存在そのものなので、いくらちょうぜつエンジニアでもちょっとやそっとでは手出しできません。名前が有名なので勘違いされて、「グローバル変数置き場」のことだと思われがち (そういうデリケートなボケは通じにくいといくら言ってもめもりーちゃんは聞いてくれなくて) ですが、ぜんぜん違いますからね。

本来の Singleton とは、人類のどの言語で言い表しても偏在する概念が、つねに単体で、不変な形として、擬似的に存在を得たものです。なんだそりゃ。ええと、たとえば「ナノ秒の誤差もなく現在時刻を正しく表す時計」は、宇宙の本質のメタファーですよね。数学や物理法則の公式も、神が作った世界のモデルなので普遍かつ不変です。

とはいえ、プログラミング言語にとってはコンピューターの世界こそが世界なので、開発言語で書かれたプログラムから恣意的に手出しできない環境変数や OS サービスも、神の創造物と同じぐらいの扱いにしてもいいでしょう。というわけで、ファイルシステムのルートだとか、標準入出力なんかは、Singleton とみなしてもオッケーです。

Singleton は、初回の取得でいちど初期化されると、二度目以降は必ず同じインスタンスを返します。異なるプロセスとして起動された場合でも、基本的には再度、等価なオブジェクトが得られるはずです。

つまり、単一インスタンスを共有していて、その必要条件はイミュータブルであることが特徴です。これは Prototype パターン と正反対の特徴です (クローンされる前のオリジナルは Singleton かもしれませんが)。

本来、シングルトンは生成にパラメーターを取りません。だって、異なるパラメーターで生成できる複数のインスタンスがあるのはおかしいじゃないですか。

とはいえ、ユーザー設定を持つ種類のクラスでも、コンフィグ済みのインスタンスを 1 クラス 1 インスタンス保証するコンテナにある場合は、ビジネスロジックから見たバーチャル Singleton とみなせます。

DI コンテナユーザーは、この仮想 Singleton を便宜上 Singletin と呼んでいるかもしれませんが、はい、ここで注意。Singleton とみなしたクラスを勝手に new するのは NG です。YouTube 視聴者にとって VTuber には中の人などいないので、3D モデルデータを勝手に new して乗っ取るのはダメですよというのと同じですね。いろいろ台無しです。

さらに多くの人が誤解しているのは、アプリケーション全体で共有するコンテキストのことを Singleton と呼んでしまうことです。それただのグローバル変数だから。他の信者もいるのに、アプリケーションが神を恣意的に変更できてはいけないでしょ。Singleton は共有で、いつでもあなたの隣にいます、だけど、絶対にイミュータブルですからね。

もし Singleton のフリをしたものがアプリケーションの望みを聞き入れてしまうなら、それは悪魔の誘いです。人の煩悩にとって都合のいい形で祀られ、いずれ肥大化します。そうすると、人は逆に、その悪魔によって、制御できない無秩序に支配されます。

それ、神の創造物じゃなくて、いわゆる「神クラス」ですよね。「アプリケーションの民は何をするにも俺様の靴を舐めてからだククク...」 悪い意味で使われる Singleton = 神クラスの正体は、つまり神のフリをした邪神だったのです。はいはい、悪い文明は滅ぼしましょうね


解説がどんどん長くなってしまって、何ならこれ絵よりたいへんなので、次回からもっとあっさりやろうと思います。

55
21
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
55
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?