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 メソッドの用途はクラスブラウザ対策以外にも全然あるので、表題は間違い。