2014/12/28

正しくオブジェクト指向できているどうかという意味のない議論

僕はプログラマをしていて、数千万行以上の規模で10億ユーザ以上が使うようなプログラムの開発にもかかわっていたりしたけど、そういう仕事環境で「(ある何かが)オブジェクト指向かどうか」という議論をほとんどしたことがない。デザインのレビューでもAPIが十分シンプルかどうか議論にはなるけど、そのやり方がオブジェクト指向かどうかなどという観点でものを見る人はいなかった。日頃のコードレビューでも、やるべきことが普通にわかりやすく行われているかという観点でコードを見るのが普通で、オブジェクト指向ではどう、ということをいう人はいなかった。

一方でプログラミングの入門書などをみると「オブジェクト指向とはなにか」という説明に多くの分量が割かれていて、オブジェクト指向というものが、なにかまるである時点で悟りを開くように理解すべきものであるかのような解説がなされていることがよくある。しかもその解説が哺乳類と犬と猫みたいな、プログラミングですらないものだったりする。

一体このギャップはなんなんだろう? と思っていた。昔は、これだけまじめに議論しているひとたちがいるのだから、何らかの価値がそこにあるのだろうと思っていた。いまはあまりそうは思っていない。完全に否定しているのではないが、考えすぎても意味がないものだと思っている。

考えすぎることには害もある。いわゆるオブジェクト指向機能を濫用するとむしろコードは読みにくくなってしまう。まとめて一つの関数で一つの操作として書けばすむものを、無理に「多数のオブジェクトがメッセージを送り合って実行が進む」ように書いたら、単にスパゲティみたいなコードになるだけだ。たくさんあるプログラミングパターンも、プログラミングパターンを使うコードはよいコードという意識でいると、不要な抽象化を積み重ねてしまってコードが複雑になってしまうだけだ。

プログラムをリーズナブルな小さな単位に分解するというのはよい。そこで必要なのは「コードをなるべく単純で理解しやすくする」という意識だけだ。作るべき機能があるなら素直にそれを実装すればいい。「オブジェクト指向ができているか」みたいな考えは、本来の目的とは別の不要な評価軸を持ち込んでしまって、本来の目的の妨げにすらなってしまう。

「オブジェクト指向プログラミングとされているものはひととおりわかったが、いまいち本当のオブジェクト指向がなんなのかよくわからない」という状態になったら、別にそれ以上は悩む必要などないと思う。だいたいそれですべてで、僕の知る限りそれ以上の悟りのようなものはないのだから。

僕の書くコードも他人からみれば十分に「オブジェクト指向でき」ているんだろうとは思う。でも別にそれを目指しているわけでもないし、できていようができていなかろうが気にしていない。わかりやすくまとまっていて、不必要に複雑なことはしていなくて、十分にテストされているかどうかだけをだいたい気にしている。

Rui Ueyama @rui314