物を選んでから何かをさせる - オブジェクト指向のお話

ときどき「オブジェクト指向でプログラミングをするというのはどういうことなの?」と聞かれるときがあります。そんなときにうーん、オブジェクト指向ってどう説明したらいいものか...犬がワンって吼えるでしょ...ああ、これじゃわからん、などと頭を悩ませるのですが、ふと 憂鬱なプログラマのためのオブジェクト指向開発講座 (DDJ Selection) から学んだ、Windows の UI の話が分かりやすいと思いました。

Macintosh や Windows の GUI はオブジェクト指向だ、というのが書籍の中にある説明です。(P.300 ぐらいから解説されています。) ファイルの削除、という動作を思い浮かべてみましょう。このとき行う操作は、

  1. まずファイルをマウスで選択する
  2. 右クリックして操作一覧を出す
  3. 削除する

という動作になります。(ドラッグ&ドロップでごみ箱に入れる、というのもありますね。) これを目を細めてよーくみてみると

  1. 物を選ぶ
  2. それを消す

ということをしています。決して、

  1. 消すという命令を出しておいて
  2. 物を選ぶ

ということはしていません。最初に物を選んで、後から消す、ということを命令するんです。

UNIX のコマンドラインからファイルを消す場合は、

$ rm foobar.txt

という感じで、消すという動作を最初に決めてから、次に消す対象を選んでいます。これはオブジェクト指向じゃないですね。(なので、コマンドラインからの操作は、慣れないと難しいんだろうなあと思います)

つまり、物を選んでから何をさせるかを決める。これを一度理解できると、オブジェクト指向がよく分かるようになる...はずです。(笑)

この物を選んでから何かをさせる、というのはどうやら人間が何かをするときの基本のようです。カップラーメンを持ってからフタを開ける、ポットを持ってからお湯を注ぐ、お箸を持ってから麺をすくう。

人の自然の振る舞いはオブジェクト指向、それ故にユーザーインタフェースを作るときにも心がけておくと、どうやら使いやすいアプリケーションになりやすいようです。ファイルを選択させてから、そのファイルに対して行う動作を決めさせる、文章を選択させてから、それに何をするかを決めさせる、などなど。

ちょっと話がずれました。この物を選んでからほげる、っていうので考えるようになると、デザインパターンも理解しやすいんじゃないでしょうか。Templateメソッドは、物を取り出してAという動作をさせる、そのAが空になっててサブクラスごとにAを決めましょう、とか Factoryパターンは、Aという動作をさせることはきまってるけど何に対してAをさせるかが決まっておらず、その何を決定するロジックをクラスの中に内包しちゃえ、とか。

結城さんの名著 増補改訂版Java言語で学ぶデザインパターン入門 ではよく「インタフェースでプログラミングする」というキーワードが出てきます。(ここでいうインタフェースは Java の interface、つまり実装と切り離されたメソッドのことです。) これも、「物を選んで何をさせるかが決まるの法則があるのだから、そのプログラムに何を登場させて、それぞれに何をさせるかが決まれば、メソッドの中のロジックは後回しにプログラミングができる」という風に理解できます。

Blog Hackers Conference 2005 の打ち上げのときに、プログラムをどうやって書き始めるかという話で盛り上がりました。まずはじめにデータベース周りをオブジェクトにする、つまり物を作ってから書き始める人、紙に簡単なフローを描いてから作る人などなど。で、注目の宮川さんは、最初にメインプログラムの中にオブジェクトと、そのオブジェクトに何をさせるかを書くそうです。つまり、インタフェースでプログラミングをしているそう。だから宮川さんのソースは綺麗なんだな、という秘訣がわかったり。

そんなことを考えながら歩いて会社から帰ってきました。

憂鬱なプログラマのためのオブジェクト指向開発講座 (DDJ Selection)

憂鬱なプログラマのためのオブジェクト指向開発講座 (DDJ Selection)