getInstance がキモいと言う話についてのメモ
http://d.hatena.ne.jp/Isoparametric/20071227/1198713105
面白そうなので、とりあえず、今日のところのメモ。あんまりよく考えていないのでツッコミどころ満載だとおもわれます。あとでちゃんと考え直そうとおもいます。
- Singleton とは(比較的セーフティな)グローバル変数である、に、「いや別のものだろう」という話は、新鮮に感じた。(で、この当たり前の話を新鮮に感じた私は、ダメダメも過ぎるだろうと思ったorz)
- だから、「getInstanceキモい」は(「Singletonキモい」じゃなくて)グローバルなオブジェクトは良くないよ、って話。あちこちでいろんなのを getInstance とかしてたら、悪いデザインのサイン。たとえば生成時にDependency Injection するとかしなさいよと言う話。
- だけれど、でも、やっぱりグローバルなオブジェクトは楽なのは楽。ログ出しオブジェクトとか。Smalltalk の Transcript だってグローバル変数だし。そういうときどうするか?
- そういうケースだったら、グローバルならクラスをオブジェクトとみなせばいいじゃん、とは思う。でも、C++ のクラスはオブジェクトじゃないから、引数として渡せないなど、オブジェクトじゃない制約がある。
- そういうのがダメな場合、2択として、グローバル変数を使うよりは Singleton の方が良いか、というと、私はそっちの方が良いかな、となんとなく思っている。少なくとも取得に関数を通してくれる分マシとか思っている。(でも、この思考は多分惰性だ)
Smalltalkを初めて知ったとき、グローバル変数とか、グローバルオブジェクトとしてのクラスとか、想像以上に多いのでビックリした記憶があります。
前述のTranscript みたいなのとか、あとはインスタンス全部が依存するオブジェクトはクラスメソッドから取ってくるデザイン(そしてクラスにたいしてゴニョゴニョしてあげると、全部が変わる)をよく見ます(いや、コッチはちょっと違う話かしらん)。
Smalltalkにとってのグローバル変数は、普通のOSでファイルを置くみたいなもんだから、C++のグローバル変数と比べていいものじゃないけれど。
* * *
うーん、脳が死んどるです。なんか嘘書いているような気がする。そして案の定 纏まらないです。(^^;
追記(2008-01-01)
↑本当に脳が死んでいるみたいです。3あたりで頭がおかしい子になってる。おかしな方向に思考が暴走してますヨorz
「本当にインスタンスが一つであることを完全に保証しなければならない」
ことってそもそもそんなに多発するケースなんだろうか?
Singletonを実現するgetInstanceが推奨できない理由 - 神様なんて信じない僕らのために
多発しないにゃー。