新人エンジニアが「オブジェクト指向って何？」をOOUIとOOPから理解する

:::note info
本記事は[リンクアンドモチベーションAdvent Calendar 2024](https://qiita.com/advent-calendar/2024/lmi)の12日目の記事です。
:::

# 1. はじめに
はじめまして！リンクアンドモチベーションの井上です。
新卒未経験エンジニアの私は、「オブジェクト指向」という言葉を聞いたとき「オブジェクト？モノ？ナニソレ？？？？」となりました。
様々な記事を調べて読んでみたものの、
**「『オブジェクト指向』を説明しているその単語がそもそもわからない！オブジェクトってそもそも何？」**
となったので、自分なりの理解をアウトプットしてみようと思います。
オブジェクトってよくわからないな〜という方の参考になれば幸いです。

# 2. オブジェクト指向をひと言で
まず、「オブジェクト指向」とは何なのか簡単に説明します。
オブジェクト指向は、Object Orientedの訳語で、直訳すると「モノ指向」「モノ中心」という意味です。
システムを構築するときの**考え方・概念**の１つです。
つまり「モノ中心で考えよう！」ということです。抽象的でよくわからないですよね。
[『オブジェクト指向でなぜつくるのか』](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC3%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84OOP%E3%80%81%E8%A8%AD%E8%A8%88%E3%80%81%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E5%B9%B3%E6%BE%A4-%E7%AB%A0/dp/4296000187)という本の中では、以下のように説明されています。

>オブジェクト指向をひと言で表現すれば「難しいソフトウェア開発を楽に行うための総合技術」となるでしょう。

どうやら「モノ中心」（オブジェクト指向）で考えると、難しいソフトウェア開発が楽にできるらしい！ということです。



# 3. オブジェクト指向UIからオブジェクト指向を理解する
ここで私は、じゃあここで言う「モノ」って何なんだ？範囲が広すぎてわからない...となりました。
そこで助けてくれたのが[『オブジェクト指向UIデザイン』](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91UI%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E2%94%80%E2%94%80%E4%BD%BF%E3%81%84%E3%82%84%E3%81%99%E3%81%84%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E5%8E%9F%E7%90%86-WEB-DB-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297113511)という本です。
この本を読んだらオブジェクト指向がしっくりきたので、一旦オブジェクト指向UIという観点から理解してみたいと思います。

:::note warn
OOUI（オブジェクト指向UI）とは、あくまでオブジェクト指向の発想をUI領域に適用したものであり、OOP（オブジェクト指向プログラミング）の本質を表したものではありません。
:::

## 3-1. オブジェクト指向UIとは
オブジェクト指向UI（Object Oriented User Interface）とは、**ユーザーの関心の対象物（＝オブジェクト）を起点としてUIをデザインすること**です。

:::note info
UIとは私たちのようなユーザーと製品・サービスの接点で、例えば私たちが触る画面そのものもUIのひとつです。
:::

例えば、ファッション通販サイトを使用するとき、ユーザーの関心の対象物（＝オブジェクト）は洋服です。
「洋服を起点としてUIをデザインする」というのは、そのサイトを使用するユーザーの動作の対象が「洋服」になるということです。つまり、**洋服を**選択して商品詳細を見る、**洋服を**お気に入りに登録する、**洋服を**カートに入れる...というような感じです。

**まず洋服を選択**して、その洋服に対して何らかの動作をするというのが、洋服を起点としている（＝オブジェクト指向）ということになります。

## 3-2. オブジェクト指向ではないUIとは
では、逆にオブジェクト指向でないUIって何？という観点から考えてみます。
ここでは[『オブジェクト指向UIデザイン』](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91UI%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E2%94%80%E2%94%80%E4%BD%BF%E3%81%84%E3%82%84%E3%81%99%E3%81%84%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E5%8E%9F%E7%90%86-WEB-DB-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297113511)で説明されていた自動販売機の例を参考にしたいと思います。

皆さんは自動販売機で飲み物を買いたいと思った時、まず何を考えるでしょうか？
多くの人は、「どれにしようかな〜」と購入する商品を考えると思います。
そのため自然に考えると、決めた商品のボタンを押して、その代金を支払いますね。ファッション通販サイトで洋服を選んで購入するのと同じ流れです。

<img width= "230" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNsSdULp9eUkYVsrcPGxEVJefcX9Xxf3pGgyJSW7f-t7_tckOs4gYY5DL-rT3v4NhKVidSDyk2ojczBg18z4Tycs37OCIxMW6dXbxHNhtCQDbkpY7mZRJk_tBD4mEzd0TV8rmvHo6rr3JM/s400/machine_jidouhanbaiki.png">


しかし、街中の自動販売機では、まずお金を入れてから商品を選ぶことが多いと思います。（最近では、先に商品を選べるものもありますが...）
私は間違えて先に商品を選択しようしとして、何回もボタンを押してしまうことがあります。その理由は、自動販売機が私の関心の対象物である飲み物を起点としたUIになっていないためだったのです。（この理由は、おそらくハードウェア機構上の歴史的な経緯があるのでは、と説明されています）

これが**オブジェクト指向ではないUI**です。

ここでもう一度おさらいすると、オブジェクト指向とは以下のように捉えることができます。

:::note info
オブジェクト指向とは、「対象物＝モノ」を中心とした考え方である
:::

# 4. クラスからオブジェクト指向を理解する
オブジェクト指向がなんとなく理解できたところで、最後にオブジェクト指向の基本的な仕組みである**クラスとインスタンス**から、オブジェクト指向ついて理解したいと思います。
クラスはOOP（オブジェクト指向プログラミング）の三大要素の一つです。

:::note info
**OOPの三大要素**　引用：『オブジェクト指向でなぜつくるのか』
1. クラス（カプセル化）
2. ポリモーフィズム
3. 継承
:::

:::note warn
OOPの三大要素は、一般的には「カプセル化」「ポリモーフィズム」「継承」と言われ、この三つはクラスの仕組みを利用しています。本記事では、クラスの役割は「カプセル化」だけではないという理由で「クラス」と表記したと説明している[『オブジェクト指向でなぜつくるのか』](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC3%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84OOP%E3%80%81%E8%A8%AD%E8%A8%88%E3%80%81%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E5%B9%B3%E6%BE%A4-%E7%AB%A0/dp/4296000187)の表現に従っています。
「クラス」とは、以下三つの仕組みを持ったものとして書籍内で説明されており、②がカプセル化に当たると考えられます。
①サブルーチンと変数をまとめる
②クラス内部のみで使う、変数やサブルーチンを隠す
③1つのクラスから複数のインスタンスを作成する
:::


三大要素について詳しく知りたい方は、以下の記事を参考にしてください。

https://qiita.com/yu-saito-ceres/items/69adadab38cc99ad6c21


では、なぜクラスがオブジェクト指向の基本的な要素と言われるのかを考えてみます。
クラスとインスタンスについてはよく、「クラスが**設計図**でインスタンスが設計図をもとに作られた**実体**である」と説明されます。

例として、従業員インスタンスを作成する場面を考えます。
従業員は名前・年齢・出身地という属性を持つとすると、従業員の設計図（従業員クラス）は「従業員を作成するには名前・年齢・出身地という情報が必要だよ！」と言うものになります。

そしてその設計図をもとに、
* 名前：太郎
* 年齢：30歳
* 出身地：東京都

という情報を加えて、太郎さんという従業員インスタンスを作成するというイメージです。

この場合、**オブジェクト＝関心の対象物**は従業員であり、従業員を中心に考える仕組みを実現したのが**クラスとインスタンス**ということです。
そのため、クラスがオブジェクト指向の基本と言われるのだと理解できます。


# 5. 終わりに
初めて「オブジェクト指向」について調べた時、その説明文に知らない用語や読めないコードが沢山出てきて、理解するのを一度諦めてしまっていました。理解したい対象の説明を理解するための知識がないというのは、新人エンジニアがぶつかる壁なのではないかと思います。
そんな時に、オブジェクト指向UIを学ぶ機会があったことで、別の観点からオブジェクト指向を理解するきっかけを得られました。
一つのものを理解するために、**複数視点からアプローチする**ことの意義を今回学ぶことができたと感じています。


「オブジェクト指向」という言葉はなんとなく理解したものの、その中身についてはまだまだ理解不足です。複数視点からのアプローチを意識し、今後も学習していきたいと思います。
最後までお読みいただきありがとうございました！


# 参考文献
* [『オブジェクト指向でなぜつくるのか』](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC3%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84OOP%E3%80%81%E8%A8%AD%E8%A8%88%E3%80%81%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E5%B9%B3%E6%BE%A4-%E7%AB%A0/dp/4296000187)
 * [『オブジェクト指向UIデザイン』](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91UI%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E2%94%80%E2%94%80%E4%BD%BF%E3%81%84%E3%82%84%E3%81%99%E3%81%84%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E5%8E%9F%E7%90%86-WEB-DB-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297113511)