はじめに
変更しやすいコードが書けないのにソフトウェア開発とか舐めているのですか
天使様1ごめんなさい〜、nikkieです。
「かわいい」と技術書が夢の合体を果たした、ちょうぜつ本(『ちょうぜつソフトウェア設計入門』)!🤗
読書会を共同主催しており、第8章「デザインパターン」を読み進めています。
次回の範囲を予習する中で、Singletonについて取り上げます。
目次
- はじめに
- 目次
- 前回のちょうぜつ本!
- 第8章より Singletonパターン
- fukabori.fmより 「Singletonパターンはいらないです」
- ちょうぜつ本の元「マンガでわかる Singleton」
- 終わりに
- P.S. 12/1(金) 第8章「デザインパターン」(8-4)のちょうぜつ本_読書py!
前回のちょうぜつ本!
第7章まで読み進め、天使様にこれ以上刺されないというところまで来たはずです(そうであってほしい!)。
8章に突入し、Bridgeパターンを学びました。
Template Methodには限界があったんだ!
私がわからん殺しされてる状況が見えましたね〜
第8章より Singletonパターン
- 実装イメージ
- 有効なシーン:普遍的に世界にひとつしか存在しないものを実装するとき
- ビジネスロジックではめったに登場しない
- 本質的にグローバル変数
- 書き込んだらあかん
- 見出しより「シングルトンが必要ならクラスより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(金)です!
ちょうぜつ本_読書py[8] に参加を申し込みました!今回もデザインパターンに挑むぜ:Singleton!!Abstract Factory!!!!ひょっとするとBuilderとFactory Methodも! https://t.co/EzTobypQvY #ちょうぜつ本
— nikkie / にっきー (@ftnext) 2023年11月6日
常連さんも、お久しぶりの方も、はじめましての方もデザインパターンに興味ある方、大歓迎です!
ぜひぜひお気軽にお越しください〜
- ちょうぜつ本読書ログシリーズではおなじみのこちらの書き出し。元は『お隣の天使様にいつの間にか駄目人間にされていた件』の「家事ができないのに一人暮らしとか舐めているのですか」です。アニメ2期決定うれしい↩