オブジェクト指向のまとめ2026年版

なんかオブジェクト指向の話が盛り上がってるので、関連記事をまとめておきます。

まずはここから。12年たちました。

Java 8が出たすぐあとくらいの記事です。
Javaラムダ式が入って、その後は継承のできないrecord型が入ったり、パターンマッチが入ったり、クラスの定義を書かなくてもHello worldが書けるようになったりと、非オブジェクト指向な機能も出そろってます。

だいたい同じ内容ですが、3年前。

今回の発端になったのは、過剰設計のコードがオブジェクト指向的に正しいみたいな話が出てきたからだと思うのだけど、過剰設計ということばでいろいろ議論されてるように、オブジェクト指向だとオブジェクト迷路ができがちというのは問題視されていたので、正しいというわけではないです。

で、なんでオブジェクト指向迷路ができるかというと、オブジェクト指向の本がアプリケーションを見据えずにモデリングの話を進めがちだからというのがあります。

アプリケーションを考えないモデリングは際限がないし、なにをやっても正しいということになってしまう、そして現実を正しくモデリングなんてできないのでなにをやっても正しくないということにもなり、あまり意味がないです。

ただ、オブジェクト指向の話になると「お前のいうオブジェクト指向とはなんぞや」ってなるんですが、こういうスタンスです。

というか、オブジェクト指向について継承なしにまとめた本は見たことがない、もしくはソフトウェアをうまく作る工夫をぜんぶ「オブジェクト指向」と言ってるかです。

継承なしにオブジェクト指向が有用と言ってる人が言ってるのはだいたいはカプセル化で、それは抽象データ型の話オブジェクト指向とは独立ですね。

そして「コンピュータプログラミングの概念・技法・モデル」から次のような文を抜粋していました。

オブジェクト指向に頼るのは、プログラム構造が著しく簡単になる場合に限ることを奨める。プログラムに、密接に関連するデータ抽象の集合があって、明らかに継承の必要があるような場合がその一例である。そうでなければ、もっと簡単なプログラミング技法を使用することを奨める。

もともとオブジェクト指向が流行ったのって、Windowsが出てGUIプログラミングが一般的になって、そこでC++でのクラス+継承がハマったのでオブジェクト指向が注目されて、「オブジェクト指向」と名前がついていたら売れる、ついていなければ売れないとう状況があったので、当時の開発手法研究者が自分のもってた手法にクラスと継承を組み込んで「オブジェクト指向手法だ!」ってやりはじめたからです。なので、継承を組みこんだオブジェクト指向といっても、 OMTやらOOSEやらBooch法やら、Coad/Yordon、Shlaer/Mellor、SOMA、MERODE、SSADMなどいろんな手法があったわけです。なので当時の「ソフトウェアをうまく作る工夫」はぜんぶオブジェクト指向と言われたというのは現実にあるのだけど。

ただ、そういった手法の乱立は混乱を生んで、統一手法を作ろうという話になったけど、かなり難しいとうことで記法だけ統一しようとしてできたのがUMLです。その後、統一手法というのは頓挫して、プロセスをまとめるということでRUP(ラショナル統一プロセス)ができてオブジェクト指向は忘れられていきました。

そうなると、「オブジェクト指向に代わる指針は?」という話になるのですけど、そもそもとして、単一の指針でアプリケーションが構築できるというのが幻想だったんでは、として、こういうことをまとめてます。

オブジェクト指向というのは、設計から実装までを「オブジェクト」という単位で考えれて素敵ですね、という考え方であり、だからこそ流行ったのだけど、そういった、アプリケーションのライフサイクル全体を統合的に考えれる指針なんてないので、ちゃんと機能実現を考えていきましょうということになってるんじゃないかと思います。

DDD、アジャイル継続的インテグレーション、SREという感じになったわけですね。これらは実装パラダイムには依存しないので、プログラマは自分たちに適した技術を採用できます

今回も、オブジェクト指向を実務で使っててどう扱うのがいいか、みたいな話はほとんどされてないですね。

オブジェクト指向は継承を取り込んだけど、インタフェースやジェネリクスは取り込まれず、そのあたりをうまく扱おうとすると型理論やら代数型を勉強しましょうみたいな話になって、型に対してプログラムを組むと考えるほうが勉強しやすいですね。

指針としてデータ指向プログラミングというのを提唱してる人もいますが、基本は現状追認で、実際の開発で行われていることを整理したものになってると思います。本はあまり評判がよくないけど・・・
まあ、抽象データ型でデータを定義して代数型で分類してプロセスに乗せて行こうという話、のはず。

ここでまとめてた。

まあでも、要件定義をちゃんとやろう