オブジェクト指向設計はどうして必要とされたか

![](https://storage.googleapis.com/zenn-user-upload/49ffb99a2f80-20240928.jpg)  
今回は、どうしてオブジェクト指向が必要とされたのかについてお話しします。

![](https://storage.googleapis.com/zenn-user-upload/3d4f397ff7d6-20240928.jpg)  
考えを整理することって、意外と楽しいですよね。アプリケーション設計におけるオブジェクト指向は、その整理を助けてくれる頼もしい存在です。今回オブジェクト指向の意義を見つめ直すことで、頭の中の整理が言語化され、少しだけ人生について深く理解した気分になれました。（あくまで個人の感想です！）

![](https://storage.googleapis.com/zenn-user-upload/ba3b16703aa9-20240928.jpg)  
「良い設計は大切だ」とよく耳にしますが、なぜそんなに大切なのでしょうか？

![](https://storage.googleapis.com/zenn-user-upload/15822890aaa4-20240928.jpg)  
その前に、設計の目的をはっきりさせてみましょう。

![](https://storage.googleapis.com/zenn-user-upload/bcd232c5afc5-20240928.jpg)  
プログラムは年々複雑になっています。技術の進歩が速い中、プログラムもどんどん大きくなっていきます。たとえば、ビル・ゲイツが1974年に書いた最初のBASICシステムはたった4kBでしたが、今のWindowsは1億行以上のコードがあると言われています。  
1億行の文書を整理することを想像してみてください。それが常に更新され、すべての部分が個別にどこかから参照されているとしたら、整理するのがどれだけ大変か想像できますよね？ だからこそ、綺麗に整理された設計が必要なんです。

![](https://storage.googleapis.com/zenn-user-upload/909474d1d230-20240928.jpg)  
「良い設計」とは、つまりこの整理をうまくやることです。どこに何があるかがすぐに分かり、修正したい箇所や呼び出したい部分がすぐに見つかるようにする。それが「良い設計」のプログラムです。

![](https://storage.googleapis.com/zenn-user-upload/fca83c90ef75-20240928.jpg)  
極端なことを言えば、動くかどうかはどうでもいいです。

![](https://storage.googleapis.com/zenn-user-upload/c839ce2638fe-20240928.jpg)  
要件を満たしているかどうかもどうでもいい。

![](https://storage.googleapis.com/zenn-user-upload/eb3d5c8431a1-20240928.jpg)  
動かないプログラムはテストではじかれますし、世の中に出回ることはありません。すべてのプログラムが「動く」ことを前提にしているわけですから、動いていること自体に特別な価値はありません。  
本当に重要なのは、そのプログラムがどういう設計で動いているかです。

![](https://storage.googleapis.com/zenn-user-upload/bd8cc86fa97e-20240928.jpg)  
同様に、要件を満たすことは基本的なことなので、それ自体を誇っても仕方がありません。問題は、設計が悪ければ後から機能追加や修正が難しくなる点です。現代のソフトウェアでは、変更や追加が迅速にできることが求められているため、設計が全てと言っても過言ではありません。

![](https://storage.googleapis.com/zenn-user-upload/2d579758f0e0-20240928.jpg)  
つまり、「良い設計」とは保守・拡張がしやすい設計のことです。プログラムがすぐに変更できるように整理されていることが、価値を決める重要な要素です。そのためには、膨大なコードをきちんと部品化し、必要な時にすぐ取り出せるように整理する必要があります。

![](https://storage.googleapis.com/zenn-user-upload/d097ded95fc0-20240928.jpg)  
では、どこまで整理すればいいのでしょうか？

![](https://storage.googleapis.com/zenn-user-upload/58f1d7c7b973-20240928.jpg)  
整理する方向性は間違いありませんが、果たしてどこまでやれば十分なのでしょう？ 完璧を目指すと終わりが見えませんが、どこかで区切る必要がありますよね。

![](https://storage.googleapis.com/zenn-user-upload/a6eb7a53727a-20240928.jpg)  
文章や図で整理する方法を参考にしてみましょう。人間は、複雑な概念を整理するために、長い歴史の中で文章や図を使って工夫してきました。そして、現在のプログラム言語はその表現力に匹敵するほど発展しています。ですから、図や文章のようにわかりやすく整理することを心がけましょう。

![](https://storage.googleapis.com/zenn-user-upload/0b1db25bef75-20240928.jpg)  
アインシュタインの名言を思い出してみましょう。  
「ものごとはできる限りシンプルにすべきだ。しかし、シンプルすぎてもいけない。」

![](https://storage.googleapis.com/zenn-user-upload/e14b18da292a-20240928.jpg)  
これをプログラムの世界に当てはめると次のようになります。
* シンプルにすべき：要件をできるだけ少ない要素で表現する。
* シンプルすぎてはいけない：要件が読み取れないほど簡略化してしまうと、本末転倒です。

![](https://storage.googleapis.com/zenn-user-upload/9b6c563be76d-20240928.jpg)  
オブジェクト指向は、プログラムを整理するための強力な手段です。変数名を名詞、メソッド名を動詞と見立てることで、図や文章を整理するようにプログラムを整理することができます。また、最近ではわかりやすいライブラリが増えたため、それを参考にすることにより、わかりやすく整理されたプログラムがどのようなものかをより学ぶことができるでしょう。

![](https://storage.googleapis.com/zenn-user-upload/b785d2bf5492-20240928.jpg)  
次に、シンプルな表現をするために考えられた方法を少し抽象的にまとめてみましょう。

![](https://storage.googleapis.com/zenn-user-upload/991d76ff74e1-20240928.jpg)  
まずは「構造化手法」について。  
構造化というと少し難しい印象があるかもしれませんが、プログラムをツリー構造で整理することだと考えればわかりやすいでしょう。ツリー構造は、私たちの脳が自然に理解しやすい形です。大きなものを小さく分けて整理する、という考え方です。

![](https://storage.googleapis.com/zenn-user-upload/f3b419695f18-20240928.jpg)  
構造化する際には「結合度」と「凝集度」にも注意が必要です。各部分ができるだけ他の部分に依存しないように整理することが大切です。これを「結合度が低い」と言います。また、一つの要素に関連した内容だけをまとめておくことで、見やすく整理された状態を保ちます。これが「凝集度が高い」ということです。

![](https://storage.googleapis.com/zenn-user-upload/d3470f04eea3-20240928.jpg)  
オブジェクト指向は、構造化手法をベースにさらに発展させたものです。名詞（オブジェクト）とその操作（メソッド）でデータを整理することで、私たちにとって直感的にわかりやすいプログラムが書けるようになります。カプセル化や継承、ポリモーフィズムといった技術も、この整理を助ける重要な要素です。

![](https://storage.googleapis.com/zenn-user-upload/c007edc25bdb-20240928.jpg)  
このオブジェクト指向を実際の業務に応用したのが「ドメイン駆動設計（DDD）」です。  
整理という観点から考えると、オブジェクト指向を使って業務ロジックを整理するのが最も自然に思えますが、長年、プログラマーたちは業務ロジックの整理を後回しにしてきました。ドメイン駆動設計は、この業務ロジックの整理に着目し、それを実現しようとするアプローチです。最近注目を集めていますが、こうして説明すると、その価値は意外とシンプルに理解できます。

![](https://storage.googleapis.com/zenn-user-upload/ff0d3559b89b-20240928.jpg)  
また、「DSL（ドメイン特化言語）」という手法もあります。これは、特定の分野に特化した言語やライブラリを作成し、その分野のロジックをわかりやすく整理することを目指しています。DSLには「内部DSL」と「外部DSL」がありますが、プログラムの整理に役立つのは主に内部DSLです。これを利用することで、整理されたプログラムをさらに読みやすくすることができ、整理の効果がより高まります。

---

以上、プログラムの整理という視点から、オブジェクト指向のテクニックをまとめてみました。  
整理が行き届いたプログラムは、保守性や拡張性が高まり、結果的に開発効率が向上します。オブジェクト指向をうまく活用して、よりわかりやすいプログラムを目指してみてください。

---

(編集協力：ChatGPT 4o様)  
(当記事はZennにもマルチポストされます)
@[Zenn](https://zenn.dev/hrmstrsmgs/articles/029930e163c405)
(スライド全体はこちら)  
@[speakerdeck](https://speakerdeck.com/hrmstrsmgs/obuziekutozhi-xiang-she-ji-hadousitebi-yao-tosaretaka)