nikkie-ftnextの日記

イベントレポートや読書メモを発信

読書ログ | #ちょうぜつ本 (第8章)でも #fukabori (48)でも、ただしSingleton、テメーはダメだ

はじめに

変更しやすいコードが書けないのにソフトウェア開発とか舐めているのですか
天使様1ごめんなさい〜、nikkieです。

「かわいい」と技術書が夢の合体を果たした、ちょうぜつ本(『ちょうぜつソフトウェア設計入門』)!🤗
読書会を共同主催しており、第8章「デザインパターン」を読み進めています。
次回の範囲を予習する中で、Singletonについて取り上げます。

目次

前回のちょうぜつ本!

第7章まで読み進め、天使様にこれ以上刺されないというところまで来たはずです(そうであってほしい!)。
8章に突入し、Bridgeパターンを学びました。

Template Methodには限界があったんだ!
私がわからん殺しされてる状況が見えましたね〜

第8章より Singletonパターン

ひとつのクラスのインスタンスがたったひとつしかない形を取るためのパターン (Kindle版 pp.340-341)

  • 実装イメージ
    • getInstanceメソッド
    • 内部の静的プロパティに保持されたインスタンスがあれば、それを返す(2回目以降)
    • なければインスタンス化して保持し、それを返す(初回)
  • 有効なシーン:普遍的に世界にひとつしか存在しないものを実装するとき
  • 本質的にグローバル変数
    • 書き込んだらあかん
  • 見出しより「シングルトンが必要ならクラスよりDIコンテナを選ぼう」
    • 7章の依存性注入の話だ!

fukabori.fmより 「Singletonパターンはいらないです」

共同主催のnibuさん(id:nibutan)に教えていただいたfukabori.fm(感謝)

「このパターン、いまだとよくないんじゃない?」に対して、t-wadaさん🦁がズバッと

Singletonパターンは、いらないです(00:28:05あたり)

この後に続くお話は「ちょうぜつ本で見たところだ!」状態。
ひさてるさんからもt-wadaさんからも、同様の説明を目からも耳からもインプットして、完全に理解した感があります

  • Singletonが使われたシーン
    • グローバルなディクショナリ、キャッシュとして使いたいのでシステムで1個だけにしたい
    • 使う箇所でgetInstanceメソッド呼び出し
  • グローバル変数なので、副作用のほうが大きい
    • 無関係のモジュール間で依存してしまう
      • メソッドの引数だけでなくグローバルスコープも考えないといけない(コード例)
    • グローバルな状態の共有は自動テストと相性が悪い
    • 現代的には、プロセスの中で単一にしても意味がない

たしかに副作用のほうが大きそうだなと思いました。

def func1():
    cache = SingletonCache.getInstance()
    # cacheを操作

def func2():
    cache = SingletonCache.getInstance()
    # cacheを操作

これは2箇所でcacheの操作ですが、キーを変えたら全部変えないといけないわけですし、このコードを変更していくのは大変そうです...

1つのキャッシュがほしいという要求には、Singletonではなくdependency injection(依存性注入)がt-wadaさんのオススメとのこと。
ちょうぜつ本 7章で完全理解済みの私はこの後の解説も完全理解!(ありがとう、ちょうぜつ本)
cacheインスタンスが注入されればgetInstanceは不要になりますね。
あれ、でも、共通キー名はどうするんだろう...?(突然の何もわからない)

GoFによるSingletonが先で、その後に出てきたdependency injectionがSingletonというパターンに影響を与えたというのが興味深かったです。
ソフトウェア設計の概念同士も歴史的な影響があるんだ〜。

Singletonまわりしか聞いていませんが、わかる、わかるって感じだったので通しで聴きたいところ。

ちょうぜつ本の元「マンガでわかる Singleton」

本来の Singleton とは、人類のどの言語で言い表しても偏在する概念が、つねに単体で、不変な形として、擬似的に存在を得たものです。

t-wadaさんはいらないと言い切ってましたが、ひさてるさんはいらないとまでは言い切っていない印象です。
ただ、Singletonは神の創造物に関わるので、使い所がめちゃめちゃ限られそうですね(めったにないからいらないという主張も分かるという感じです)。
気軽に手を出したらグローバル変数となって、システムを苦しめるであろう...

さらに多くの人が誤解しているのは、アプリケーション全体で共有するコンテキストのことを Singleton と呼んでしまうことです。それただのグローバル変数だから。

終わりに

ちょうぜつ本 8章の中のSingletonパターンを読みました。
ちょうぜつ本だけでなくfukabori.fmでも共通する説明を聞いて完全理解です。
dependency injectionが登場した今となっては、Singletonは役目をほとんど果たしたんですね。

t-wadaさんのお話が分かる、分かるぞ、という感覚だったので、ちょうぜつ本はすごいなあ。知の高速道路感!

P.S. 12/1(金) 第8章「デザインパターン」(8-4)のちょうぜつ本_読書py!

次回ちょうぜつ本_読書py(Python使い視点でちょうぜつ本を読む、みんなのアウトプット中心の読書会)は12/1(金)です!

常連さんも、お久しぶりの方も、はじめましての方もデザインパターンに興味ある方、大歓迎です!
ぜひぜひお気軽にお越しください〜


  1. ちょうぜつ本読書ログシリーズではおなじみのこちらの書き出し。元は『お隣の天使様にいつの間にか駄目人間にされていた件』の「家事ができないのに一人暮らしとか舐めているのですか」です。アニメ2期決定うれしい