メンタルモデルから見るオブジェクト指向設計

![](https://storage.googleapis.com/zenn-user-upload/f1769a520c0b-20241025.jpg)

今回は、プログラマーではない方にもわかりやすくオブジェクト指向についてお話しします。本来、オブジェクト指向は初心者の方にも理解しやすいように考えられたものなのですが、なぜかプログラムを学び始めると難しく感じる方も多いようです。不思議ですね。

なお、メンタルモデルという言葉を取り入れています。これは「頭の中にある『ああなったらこうなる』といった行動のイメージ」を指すもので、プログラミングにはなじみがない用語ですが、オブジェクト指向の理解にはぴったりの概念なので今回使っています。

![](https://storage.googleapis.com/zenn-user-upload/164dc95c7585-20241026.jpg)

プログラマーの多くはオブジェクト指向を難しいと感じることが多く、20年以上前から「オブジェクト指向は不要」という意見がたまに出てきます。言っている人は違うようですが、内容はずっと同じであるようです。たぶんオブジェクト指向ができたときから同じことが言われ続けているのではないかな。
ライブラリなどが高度なオブジェクト指向を前提としていることが増え、オブジェクト指向を完全に避ける人は減っている印象です。それでも、独自にクラスを作りこなすのが難しいと感じる方も多いようです。

この状況が続くと、プログラマー自身が「オブジェクト指向を非プログラマーに説明するのは無駄」と考えがちです。ですが、オブジェクト指向の本質は、アプリの設計や現実のものをわかりやすく整理するための考え方にありますので、十分説明する価値があるのです。

![](https://storage.googleapis.com/zenn-user-upload/42ab833e3158-20241026.jpg)

こちらは、オブジェクト指向の提唱者が目指した未来像を描いたものです。この図に描かれている子どもたちもプログラミングをしており、オブジェクト指向は子どもにも意味がわかるプログラムの構造を意識して設計されたものだと考えられます。実際、プログラマー以外にも理解しやすい方法として考えられているのです。

![](https://storage.googleapis.com/zenn-user-upload/f6887b9f4ad8-20241026.jpg)

そもそもオブジェクト指向には「オブジェクト指向設計」と「オブジェクト指向プログラミング」があり、設計はアプリの動きを整理すること、プログラミングはそれをコードに落とし込むことです。オブジェクト指向設計があるからこそ、プログラミングが効率的にできるのです。設計を理解せずにプログラミングだけを行うと、「何のためにこれが必要なのか」がわからなくなり、難しいと感じる原因になります。

このようにオブジェクト指向は、アプリの動きを整理して理解しやすくするためのものなのです。

![](https://storage.googleapis.com/zenn-user-upload/67914a445a75-20241026.jpg)

ここで、メンタルモデルが理解を助けます。アプリが扱う対象は、ユーザーや商品、カートといった「実際に世の中に存在するもの」なのです。もしこれをプログラマーが書くUI部品などの視点で考えると、訳がわからなくなります。ユーザーがアプリを通して操作するのは、世の中に存在する対象であり、アプリ自体が目的ではありません。これを忘れないことで、より良いアプリの設計が可能になります。

![](https://storage.googleapis.com/zenn-user-upload/0083bf6709a3-20241026.jpg)

まず、メンタルモデルを意識し、頭の中でアプリが扱うものを整理する必要があります。この段階でアプリの基本的な構造が固まり、その後でボタンやテキストボックスといったUI要素を考えるのがスムーズな順序です。

![](https://storage.googleapis.com/zenn-user-upload/b89c7be4ca64-20241026.jpg)

オブジェクト指向の特性を活かすと、扱う対象すべてをオブジェクトとして構造化できます。オブジェクト指向を使うことで、ユーザーや商品、カートなど、実際にアプリで操作したいものを変数として扱うことが自然にできるのです。

![](https://storage.googleapis.com/zenn-user-upload/27966bc5763d-20241026.jpg)

ただし注意点もあります。現実のものをアプリに取り込むといっても、現実のすべてをそのまま反映させるわけではありません。例えば、人は必ず死にますが、アプリで「死」を扱うことは通常必要ありません。そのため、必要なものを選んで整理する必要があるのです。

![](https://storage.googleapis.com/zenn-user-upload/bd8fe036ed61-20241026.jpg)

整理した概念を名詞と動詞に分け、それぞれをクラス名・変数名、メソッド名としてコードに落とし込むことで、オブジェクト指向の考え方がプログラムに反映されます。名詞や動詞に当てはまらないものは、関連する名詞句や動詞句として組み合わせることで整理します。

![](https://storage.googleapis.com/zenn-user-upload/23c8b4a21ea7-20241026.jpg)

オブジェクト指向では「継承」によって同様な動詞を整理できます。例えば、犬と猫の「鳴く」行動をどう扱うか、辞書では同じ言葉で表されますが、犬は「ワン」、猫は「ニャン」と鳴くように少し違います。このとき、すべて別々に扱うと煩雑になるので、「動物」という共通の分類に「鳴く」を持たせ、個別の鳴き方を犬や猫で上書きすることでシンプルに整理できます。

![](https://storage.googleapis.com/zenn-user-upload/966371c7498d-20241026.jpg)

こうしたツリー構造で概念を整理することは、人間の理解に沿った方法で、ある学者によると本能的なものだとも言われています。この人間の理解方法をプログラムにも応用し、理解しやすい構造で整理することができるのです。

![](https://storage.googleapis.com/zenn-user-upload/03186173ba8f-20241026.jpg)

また、例えば猫は「ペット」としても「食肉目」としても分類できるように、複数のツリーに同じものが現れる場合もあります。オブジェクト指向では多重継承を使ってこれを整理できますが、これは扱いに注意が必要です。言語によっては多重継承を制限してエラーにすることもあり、代替手段としてインターフェースやMixinなども提供されています。必要最低限に抑えることで複雑さを避けることができます。

![](https://storage.googleapis.com/zenn-user-upload/1876a20d7511-20241026.jpg)

このように、アプリで使用するメンタルモデルを整理し、名詞と動詞を構造化して継承関係をツリーで表現すると、プログラムも理解しやすくなります。この整理方法がそのままプログラマーにも伝わり、実装や改修時にスムーズに話が通じるようになります。非プログラマーの方もこの点を意識していただけると、双方にとって理解が早まり作業が効率化されます。

(編集協力：ChatGPT 4o様)  
(当記事はZennにもマルチポストされます)
[Zenn](https://zenn.dev/hrmstrsmgs/articles/78e9f4f001d860)
(スライド全体はこちら)  
[speakerdeck](https://speakerdeck.com/player/13ebc27e2c1845ff8ebbbfe4807e316c)