オブジェクト指向はコードを複雑に読みにくくする

オブジェクト指向するとプログラムが読めなくなるから禁止」のような話は昔からあって、新しい技術についてこれない人を揶揄するようなニュアンスで使われていましたが、実際にはこれはオブジェクト指向迷路にうんざりした現場での率直な意見だと思います。
オブジェクト指向は、まじめにやるほどプログラムを読みにくくするという性質をもっています。
※ 使い方次第というコメントついてますが、だからこそちゃんと性質をしっておく必要があると思います。

オブジェクト指向の代表的な指針を3つあげると次のようなものがあります。

  • オブジェクト同士の連携としてプログラムを組む
  • 単一責務の原則
  • インタフェースと実装の分離

まず、オブジェクト同士の連携でプログラムを組むと、コードが飛びまくって追いにくくなります。そして単一責務の原則により、小さいクラスが大量に生成されて、追いにくさがさらにあがっていきます。
ダイクストラ先生がGoTo Hellといってあちこち飛び回るコードは地獄だと、構造化手法を提示してくださったのに、あらたなGoToを生み出してしまっていたのです。
しかも、オブジェクトは状態を持ち、その状態によって分岐するということもあります。
さらにそれをややこしくするのがインタフェースと実装の分離です。そうすると、メソッド呼び出しを追っていったら行き止まりであったり、一生懸命おっかけたメソッドが「そいつは残像だ」ということで実際はオーバーライドした別メソッドが呼ばれているということもあります。 そうすると、実際に動かしながらデバッガで追うか、メソッドの呼び出しと状態変更の両方を追っていく必要があります。デバッガの場合、目的とした状態を正しく追えているかの確認も必要になったりするので、結局は状態変更も追わないといけなかったりします。

そして、問題を大きくしたのは、オブジェクト指向をしていればよいプログラムができ、オブジェクト指向しなければいいプログラムはできないという感覚です。
それは過去のブログで「オブジェクト指向やめよう」のようなことを書くと「メソッドひとつに全部の処理を書くのか」「メンテナンスしないならそれでいい」のような、オブジェクト指向をやめるとまともなプログラムが書けないかのようなコメントがついていることからもわかります。

これは、オブジェクト指向を誤って使うのが悪いというよりも、オブジェクト指向の求めるものがその方向であったことにもあります。マーチンファウラーの「ドメインモデル貧血症」がその典型です。
このアンチパターンは、ドメインモデルがデータコンテナになってしまっていることを嘆くものですが、次のように、「オブジェクト指向ではないからよくない」という表現になっていて、どのような場合には許されるのかということは書かれていません。

「このアンチパターンが根本的に怖いのは、オブジェクト指向設計の基本概念(データと処理を一緒にする)の真逆だということです」
「貧血オブジェクト(Anemic Object) が本物のオブジェクトだと思っているひとがたくさんいます。 つまり、オブジェクト指向設計が何たるかをまったく分かっていないということなんです」
https://bliki-ja.github.io/AnemicDomainModel/

このようにして、「オブジェクト指向する」とどんどんプログラムが追いにくくなっていって、禁止ということが行われたのではないかと思います。

今ではなるべく階層化を行うことや状態をなるべく持たないようにすることが定着しているので迷路化が避けれますが、こういった節度はオブジェクト指向の文脈では語られておらず、オブジェクト指向とは別の文脈で語られるため、まともにプログラムを組むにはオブジェクト指向から離れる必要があるということになります。
オブジェクト指向でうまくやってる」という人もオブジェクト指向以外で学んだことを自分なりにとりいれた、再現性のない「オブジェクト指向」であることが多いように思います。そしてその場合には「オブジェクト指向を取り入れる」くらいで「オブジェクト指向する」ではないはずです。オブジェクト指向を目的にしてはいけない。

その根底には、コンサルが自分たちの開発ツールを売るために業務アプリ屋さんに手法を売っていたというオブジェクト指向ビジネスモデルにあって、手法を売るために絶対化しつつ難しくなっていくし、自分たちがツールを作るときに発見した手法では業務アプリにフィットしにくいというところに原因があったと思っています。

もっと定義とか個別機能の話を、という方はこちらの特集を。

※ ここに書いたこととだいたい同じなんだけど、だいぶ大人になった気がする
オブジェクト指向は禁止するべき - きしだのHatena

※ 追記 2023/6/2 最近は、処理とデータをわけましょうという「データ指向プログラミング」という考え方がでてきています。(昔あったデータ中心アプローチ(DOA)とは別概念です)
なぜオブジェクト指向でコードが読みにくくなることがあるかということも含めて、WEB+DB PRESS Vol.134の連載記事で説明しているので、興味あればご一読を。
簡単に言えば、現在のアプリケーションはブラウザ+マイクロサービスですでにモジュール化されているので、モジュール化技術であるオブジェクト指向を使っても不要な分割になり読みにくくなる、アプリケーションはデータ指向で書きましょうという話。

データ指向プログラミングについてもっと知りたい人は、この本を。4月発売なのでWEB+DB PRSSS記事の執筆時には未発売で知らなかったのだけど、ぼくがこれまでオブジェクト指向について書いてたことが結構そのまままとまっています。