あどけない話

インターネットに関する技術的な話など

JavaScript でデザインパターン

以下は株式会社ネットスプリングのニュースレター NSquest No. 4 に寄稿した記事です。JavaScript に対するデザインパターンの議論を始めるにあたり、同社の許可を得て、このブログに転載します。

オブジェクト指向JavaScript

もし、プログラマを3つに分けるとしたら、私は構造化プログラマに分類されて、オブジェクト指向プログラマの仲間には入れてもらえないだろう。(もう一つのグループはスパゲッティ・プログラマ)

この十数年の間、私は主に C 言語や Lisp を用い、構造化プログラミングの手法だけを使ってきた。オブジェクト指向に興味がなかったわけではない。ただ、オプジェクト指向が標榜する利点、たとえば継承による差分プログラミング、に懐疑的だったのだ。実際、構造化プログラミングでも問題なくコードは書けるし、忙しさに負けて本格的に習得するまでには至らなかった。

それでもオブジェクト指向を使っていないと恥ずかしいという気持ちもどこかにあり、ときどき理解を深めようと周りの人に議論を吹っかけていた。たとえば、当たり前のように教えられる「名詞抽出法」によれば、仕様から名詞的なものを取り出してきてクラスにし、関連のある動詞的なものをそのクラスのメソッドにする。そうすれば、おのずとプログラムができあがるのだそうだ。

納得できない僕はこう問いかける。「たとえば、並べ替えのアルゴリズムを実装する。並べ替えは動詞的であって名詞的ではないからクラスにするのは変だ。では、どのクラスに入れるのか?」意地悪で聞いているわけではない。Java が指定されている授業で、学生に並べ替えを教えた際に実際困ったことだ。残念ながら僕を論破してくれる人はいなかった。

様変わりした風景

昨年、仕事の区切りがついたこともあり、重い腰を上げて評価が高い数冊の書籍を読んで再び勉強を始めた。そしてすぐに風景が様変わりしていることに気付いた。名詞抽出法は万能でないとされ、最近では責任の所在をクラスとするらしい。これなら並べ替え自体をクラスにすることも許される。また、オブジェクト指向と言えば、もう疑いもなく Java であり、Javaインターフェイスという機能を使えば動詞的なものだけをまとめられる。これを使って多重継承の問題も軽減されていた。

継承による差分プログラミングも以前ほど強調されておらず、代わりに拡張性が重要視されている。ユーザの要求は変わっていくので、流動的要素をクラスとして切り出して、変わりそうにない部分と切り離すことが肝要だ。また、オブジェクト指向の恩恵に与るにはデザインパターンと共に学ぶべきだとも分かった。

JavaScript のススメ

長年の疑問は氷解したが、普段は Java を使わないので、オブジェクト指向プログラミングを実践する気にはなれなかった。そんなときに出会ったのが、ブラウザの制御に使われる JavaScript である。

JavaScript は、プロトタイプに基づいたオブジェクト指向言語であるが、構造化プログラミング風にコードを書いてもよい。どちらも自然な形で記述できるので、両者の違いを比較しやすい。

オプジェクト指向の知識がなくても、大域の空間で消費する名前は少ない方がいいという主張には賛同してもらえるだろう。なぜなら、大域の変数や関数をたくさん定義すると、他のコードと組み合わせにくくなるからである。

なんでもよいので、まずは構造化プログラミングの手法でコードを書いて欲しい。たくさんの大域変数や関数を利用することになるだろう。次に、それを書き換えてみる。すなわち、複数の大域変数をまとめ、関連する関数をそれらのメソッドにすることでクラスを作る。そうすれば、それらが消費するのは定義したクラスの名前のみとなる。

こう言うと簡単に聞こえるかもしれないが、クラスへの分割は実際難しいし、すべてを把握して最適に動作させることに慣れていると、複数のクラスを連動させて動かすことは困難に感じる。しかし、そこを越えることが、オブジェクト指向プログラミングの第一歩となる。もし、オブジェクト指向の習得に興味があるなら、JavaScriptで始めてみてはいかがだろうか?