「呼出し元の共通化」という言い回し

突っ込みどころが違うってば - カレーなる辛口Javaな転職日記 より連想。 OOP にするとどんなメリットがあるかわからないという話について。

私は流しのプログラマなので、現場の「はじめてのOOP」にお付き合いすることが多いのですが、エライ人中心に「で、OOPにすると何が良くなるの?」と聞かれる機会は確かに多いです。そういうときに私は 「OOPL は呼出し元の共通化が出来るんです」と説明しています。


* * *


「サブルーチンがあれば呼出し先を共通化することができます。OOPLを使えば今度は呼出し元も共通化できちゃいます。」

この言い回しは プログラミングそのものに興味が無くなってしまったかつてのプログラマさんに有効だと思います。どんなに化石的な人たちだって、さすがにサブルーチンが無い言語で開発しろといわれたら嫌になっちゃう事くらいは納得していただける*1ので、開発にOOPLを使うか使わないかで変なもめ方をしているシーンでは、なかなか効果的です。

もちろん OOPL に備わった一機能を切り出しているだけなので、「それがOOPだ」なぁんて風に話が転がると大変おかしな話になります*2。そういうリスクのある言い回しなのですが、それでも私がこの言い回しを気に入っているのは、ひとつは ポリモーフィズムOOPの代表として切り出すに足りるもっとも重要な部分である(と私が思っている)ことと、もうひとつは呼出し元の共通化が出来るようになると、それによってプログラムの部分の書き方がチョコチョコっと変わるのではなく、プログラム全体の組み方が根本的にかわるのだと言うことを連想しやすいからです。

プログラムの表現のしかたが恐ろしく変わることを、サブルーチンを使ってプログラムを組んだことのある人間には想像しやすいから、それによって何が起こるか話が進めやすい。

「OOPL は呼出し元の共通化が出来るんです」という言い回しはインパクトがありますし、それを切り口に「これが有ると無いとでは雲泥の差だな」「これを使ってプログラムを組むと今までのプログラムとは大きくスタイルが変わるな」「これまでと根本的にプログラム全体を構築していく感覚が変わるからそのノウハウを学ぶコストは結構なものだぞ」と、そんな風に話を進められるから、他の機能を持ち出すよりはまだ 銀の弾丸 にされにくいのでは?と思っています。


以上、OOPそのものを説明すると、群盲象をなでるでドリーミーな話になりがちだし、抽象化技法の重要さを理解していない方に抽象的に説明するのはナンセンス。だから部分を具体的に説明するのが一番だけど、そのとき切り出すのは ポリモーフィズムがいいんじゃない?、というお話でした。

OOPそのものの説明は、「つかみはOK!」した後に実際コードを書く人たちにじっくりすればよいのですから、ね?

*1:「どんな」は嘘かなぁ。実際、共通処理をサブルーチンにまとめたら「読みにくい、上から下に読んでいけないコードを書くな」と言われ、全部コピペに直させられた現場がありました。そんな組織つぶれてしまえですよ(T△T

*2:この手のおかしな話は構造化プログラミングにもあります。構造化プログラミングは「サブルーチンを利用して段階的詳細化構造をプログラムにもたらすこと」で、サブルーチンについて「共通機能のくくり出しが出来る」よりは「処理の塊に名前をつけられる」点に注目しています。ただサブルーチンを使うだけじゃダメです。ましてや goto文つかってないから構造化プログラミングだなんて...。