javascript で factory メソッドを使わない理由
factory メソッドが好きで、よく使う。
なんで好きかって言うと、if 文を減らせるからだ。
if 文をいかに減らすかで、コードの可読性はだいぶ違ってくると信じてる。
phpでもよく使ってた。
けど、今まで javascript で factory メソッドにお目にかかったことが無い。
フレームワーク的なもののソースをいろいろ見てきたけど
(流し読みとか、エディタで開いたことがあるもカウント)
(いや、ほんとのこというと、そんなにいろいろ見てません。嘘つきました。)、
factory メソッドを使ってるものを寡聞にして知らない。
「寡聞にして知らない」って言葉を使ってみたかった。
ちょっと前まで、「寡聞にして」を全く逆の意味と寡聞にして思ってた。だから、なんて鼻にかかる言葉だと思って使う機会がなかったのだ。
まあ、なんせなんでかなーと思って、試しに使ってみた。
正確に言うと、なんでかなー、便利なのになーとか、
実はみんな知らないんじゃねえのとか、
あれ、俺間違ってんのかなとか、
なんか俺やっぱついていけてない?とか、いろいろ思って使ってみた。
いや、違うわ。
何も考えずに普通に使ってみた後で
いろいろ思うことがあった。
ただ、その時本当に何も考えてなかったかというと(略
例えば javascript で気になる if 文といえば、
やっぱり クロスブラウザ対策だよね。ってことで、
こんな感じでやってみた。
hoge = {} hoge.factory = function() { var ua = navigator.userAgent.toLowerCase(), isOpera = (ua.indexOf('opera') > -1), isSafari = (ua.indexOf('safari') > -1), isGecko = (!isOpera && !isSafari && ua.indexOf('gecko') > -1), isIE = (!isOpera && ua.indexOf('msie') > -1); if (isIE) { return new hoge.IE(); } else if (isSafari) { return new hoge.Safari(); } else { return new hoge.Gecko(); } }
で、思ったのは、
これってハードコーディングだよね。ってことです。
ブラウザごとにクラス作ってるけど、
例えば IE6.0 と IE7.0 でも挙動はぜんぜん違うわけで。
バージョンごとにクラス作ってくつもりかよ、っていう。
javascript におけるクロスブラウザ対策では
「関係する機能が使えるか」で処理を分岐させることが多いぽいですね。
attachEvent が使えるか、とか、addEventListener が使えるか、みたいな。
ただし、ブラウザによって判別する他ないような場合もあるわけで。
そういう時には factory メソッドも悪くないんじゃないかと思った。
例えば、ブラウザの「戻る」対策とか。
というわけで、クロスブラウザ対策に factory メソッドが使えるかも。
と思ったけど、実際は微妙だったって結論なわけですが、
factory メソッドの用途はクラスブラウザ対策以外にも全然あるので、表題は間違い。