オブジェクト指向の話

どうでもいい話だが、私はジョブズ復帰以前からのApple信者なので、オブジェクト指向が絶対正義などと言われると現在のmacOSの源流であるNeXTSTEPの話を思い出す。NeXTSTEPにはオブジェクト指向で設計された当時としてはかなり先進的なライブラリが用意されていたそうで、ジョブズApple復帰が決まった当時のMacユーザの間でそれは非常に素晴らしいものだと話題になっていたのだ。ただ、これはC++のクラスベースのオブジェクト指向に対して、Objective-Cのメッセージパッシングによるオブジェクト指向の優位性を主張するものだ。その根底にあるのは言うまでもなくWindowsに対するMacの優位性のアピールといういつものやつであって、オブジェクト指向が正義だとかそういう話ではない。ちなみにiOSアプリなどを作っているときに出てくるNSなんちゃらというクラスはNeXTSTEPの名残り。

私はプログラマとしてのキャリアの最初の数年をSIの世界で過ごしたのだが、オブジェクト指向プログラミングやデザインパターンは絶対という空気を感じたことはなかった。まあ、その会社は技術レベルの低い中規模SIerであり、当時普及が始まりつつあったStrutsが使えるかどうかという議論が彼らの手にようやく届く範囲の技術的話題だったということも影響しているだろう。もっと上流を見渡せばオブジェクト指向分析といった言葉でオブジェクト指向銀の弾丸であるかのように語られていたような記憶はあるが、私は上流に手が届くようになった頃にはSIの世界を離れてWeb系の世界に来てしまったのでよく知らない。

WebアプリそれもJava限定の話になってしまうが、なぜオブジェクト指向が重要でなくなったのかといえば、Webアプリは1回のリクエスト・レスポンスで処理が完結し、DBから取得したデータをHTMLやXMLJSONに変換して返したり、入力値をバリデーションしてDBに格納したりするのが主な仕事だからである。そこではオブジェクト指向プログラミングが解決する複雑な状態遷移とそれに伴う処理の変化を扱う必要はない。状態を持たず関数をまとめただけのサービス等のクラスと、振る舞いを持たずデータを格納するだけのDTOクラスがあれば大抵事足りてしまったのだ。このような階層型モジュールと抽象データ型によるプログラミングはオブジェクト指向というよりも手続き型プログラミングに近い。それでもインスタンスメソッドとして手続きを書くのは、フレームワークやDIコンテナ等との相性を考えるとそれが一番楽だからである。

とはいえデータと手続きの一体化というオブジェクト指向の基本的なコンセプトは非オブジェクト指向言語であるRustやGoにも引き継がれている。まあ、オブジェクト指向はもはや当たり前のものとしてプログラマに受け入れられているので、ことさら重要性を強調するようなものではなくなったのだろう。