オブジェクト指向にメリットなんて存在しない

古都こと

2018/12/28 08:40

    最近の新人は勉強熱心だ。新しく聞いた概念を貪欲に取り入れようとする様は、はたから眺めていても感心する。私なんて10年前に得た知識でなんとかごまかしごまかし生きているというのに。

    もちろん様々な場面で「躓き」は発生する。有名どころではポインタや非同期処理が初心者キラーだ。そして一番の初見殺しは……オブジェクト指向だ。

    オブジェクト指向に殺されたプログラマは数知れない。新人からベテランまで、たいてい皆殺しにされている。

    なぜそれほどまでに多くのプログラマを混乱させるのだろう。本やネットではオブジェクト指向の数々の多大なメリットが列挙されており、実に素晴らしいパラダイムに思える。しかし教本通りに組んでみてもどうにもしっくりこない。本当に自分はオブジェクト指向のメリットを享受できているのだろうか?

    種明かしをしよう。実はそれらメリットとやらは全部全くの嘘で、オブジェクト指向にメリットなんてものは存在しないからである。

    概念自体はシンプルなオブジェクト指向

    オブジェクト指向のアイデアは実にシンプルである。「オブジェクト」と呼ばれるモデルが、互いにメッセージを送信しあって協調動作してシステムを構成するという、ただそれだけのものである。

    オブジェクト指向に厳密な定義は存在せず、なんとなくそれっぽければオブジェクト指向と呼ばれる。よってプログラミング言語によって仕組みは意外とバラバラで、「メッセージング主体原理主義」と「オブジェクト主体主義」が2大宗派になる。

    ただし、メッセージング主体原理主義言語は今となってはドマイナーで、プログラミング言語オタクが触るような言語でしか実現されていない。よって現代で一般に「オブジェクト指向」というと「オブジェクト偏重主義」の方を指す。

    オブジェクトは一般に「クラス」や「プロトタイプ」といった機能で実現される。メッセージ送信はメソッド呼び出しがそれにあたる言語が多いだろう。

    これだけ聞くと平凡な仕組みで特に革新性はないように思える。オブジェクト作ってメソッド呼び出して。いつもやってるプログラミングの手法そのままだ。

    うん、オブジェクト指向、それだけなんだ。インターネットによく書かれてるような斬新な問題解決方法とかでは全くないよ。オブジェクトが相互にメッセージ送って終わり。以上。

    オブジェクト指向はもう主流ではない

    そもそもの話、オブジェクト指向ってもう主流ではない。

    よくよく周りを見渡すと、いまはマルチパラダイム言語が主流で、手続き型も根強いし、一部では関数型とかも強い。純粋なオブジェクト指向言語、ほぼ死んだ。

    本やインターネットで謳われてるような、すげーメリットがオブジェクト指向にあるなら、こんなことにはならないよね。オブジェクト指向、見捨てられてるじゃん。

    「オブジェクト指向ならでは!」ってもてはやされてたメリット、他のパラダイムでも普通に実現できるって人類が気づいてしまったんだよね。そして下手したら他のパラダイムの方が便利に実現できる可能性すらもある。

    そんな時代に「オブジェクト指向を使うと……再利用性が高まるんです!!」みたいなこと言ってもそりゃピンとこないしわからないでしょ。他のパラダイムでも普通に再利用性高められるんだし。(今回の記事からは逸れるから書かないけど再利用性ってのもだいぶ幻想なんだけどね)

    CだろうとHaskellだろうと似たようなことができるって人類が気づいてしまった時代に「オブジェクト指向の特権!!」とか言い出しても滑稽なだけでしょ。もう魔法は解けたんだよ。

    オブジェクト指向の勉強自体は必要

    でもまあマルチパラダイムって言ってもだいたいあれだよ。オブジェクト指向をベースにして他のパラダイムの要素をちょくちょく取り入れたのがほとんど。実質オブジェクト指向じゃねーか。騙しやがって。

    だから現実的にはオブジェクト指向から逃げることはできない。勉強は相変わらずいる。

    ただ、もうクソみたいな「オブジェクト指向のメリット」とやらの理解は完全に放棄していい時代になった。「犬がワン。猫がニャー」とか「太郎くんがリンゴを買って」とかもう無視していいよ。何の役にも立たねえし。オブジェクトが相互に作用して動作する、それがオブジェクト指向のコアアイデア。そんだけ。

    クラス定義できてメソッド呼び出しができりゃもうオブジェクト指向マスターだよ、現代では。そんで余った時間でプログラミングの技術磨いとけ。

    カプセル化とかポリモーフィズムとかデザインパターンとか

    ところでカプセル化とかポリモーフィズムってどーなんよ?あれはわりと大きいメリットじゃねーの?

    あの辺は大事なんだけども、実はオブジェクト指向そこまで関係なくて、わりと一般的なプログラミング概念なんで頑張って習得するといいよ。この記事の趣旨からは外れるから今回は詳しい内容は省略。

    デザインパターンも似たようなもんかな。今時の言語ではいらねーってことも稀にあるんだけど、大半の設計はまだまだ使える。というか現代でもバリバリ使う。

    オブジェクト指向そのものと違ってデザインパターンでクソ本クソ記事ってまず見ないから勉強は楽だと思うよ。

    Javaのセールストーク

    そもそもどうしてこんなことになったんだ。

    Javaというプログラミング言語をご存知だろうか。かつて世界を支配し、一時代を築き上げたプログラミング言語である。今はもう死体だが。いやAndroidでかろうじて生き残ってるのか。

    当時のJavaは、いや今も若干そのきらいがあるが、オブジェクト指向に非常に重きを置いた言語であった。C++はCで書けるけど、Javaはオブジェクト指向で書かなければならない、甘えの通用しない言語となっていた(いくつか逃げ道はあったが)。

    そんな革新的というか選民思想持ってそうな言語が現れたということは、当然セールストーク祭りが発生するわけである。「現実世界のモデリングができる」「再利用性が高い」「変更に対して強い」などである。

    どっかで聞いたことあるよね。そう、君らが今まで聞かされてきたの、1990年代に使われたセールストークなんだ。

    20年前のカビの生えた胡散臭いセールストークを大量に浴びてたわけよ。

    バカとセールストークの合体事故が聖書になった

    コンポーネントの再利用性なんてC言語でも普通に実現できるだろ、って普通のプログラマなら気づくし、適当に聞き流しときゃ終わる話である。

    まあ売り手がよくわからんメリットを大々的に喧伝するのはわかる。現代でも「AIで人間の仕事がなくなる」とか言ってるやついるしな。まあ真に受けるやついねえし好きにしとけばいいんじゃねえの。

    だが世界はそう甘くはない。バカという存在がいる。バカはセールストークを真に受ける。それだけならまだいい。バカには行動力が備わっている。バカは本を書いた。セールストークを真に受け、存在しないメリットを多数「捏造」した本をである。ついでに独自解釈も多数盛り込み、プログラミングの既存部分まで破壊した。

    それだけならまだ救いは残ってる。だがこの本は売れた。飛ぶように売れた。そしてそれはオブジェクト指向の聖書となった。

    世界は終わった。

    90年代の呪い

    セールストークとバカの奇跡的知能が融合したトンチンカンブックがバカ売れした。しかしそれも90年代後半から00年代始めぐらいの事件である。2018年も終わろうとしている今となってはもはや歴史の教科書でしかみないような事件のはずである。

    だがその本の影響を受けたさらなるバカがネットで情報を再生産し、その影響を受けたニュージェネレーションバカがまた記事にし、2018年になってもその本を発端とするマヌケ記事がどんどん湧いてくるわけである。

    かくしてトンチキ解釈メリット捏造オブジェクト指向本は現代にも影響を与え続けているわけである。

    そろそろ呪縛から解き放たれよう

    もういいだろ。こんな呪いは終わりにしよう。

    オブジェクト指向なんて数あるパラダイムの中のひとつでしかないし、何か革新的なことができるわけでもないし、プログラミングのやり方が変わるわけでもない。

    ただ私たちが使う言語がオブジェクト指向中心のマルチパラダイムを採用しているから仕方なく使う程度のもので、積極的に採用する理由があるわけでもない。でも拒否する理由もない。自然体で受け入れたらそれでいいでしょ。

    「オブジェクト指向を要求されてるからオブジェクト指向でやる」程度のふにゃふにゃした意識でいいはずなのに、妙に肩に力を入れて「手続き型とオブジェクト指向の違い!世界が変わるほどのメリット!」なんてやるからわけのわからん架空のメリットに振り回されることになる。

    「犬がワンで猫がニャー」とか「太郎くんクラスが」とかもう見たくねえよ。終わりにしよう。なあ。


    この記事が気に入ったら、サポートをしてみませんか? 気軽にクリエイターを支援できます。

    古都こと

    技術ポエム置き場。真面目な内容はブログで → https://sbfl.net/blog/ ツイ → https://twitter.com/kfurumiya

    #エンジニア 系記事まとめ

    noteに投稿されたエンジニア系の記事のまとめ。コーディングTIPSよりは、考察や意見などを中心に。

    1つのマガジンに含まれています

    フォロー

    コメントを投稿するには、ログインまたは会員登録をする必要があります。