#この記事について&前提条件
初心者向け記事です。
クラスってなんだ?OOP(オブジェクト指向プログラミング)ってなんだ?何の意味があるんんだ?と思って調べると、よく出てくるのが、動物とか車のとの図。
その図を見て、「言わんとしてることは分かるけど、それが何なんだ?」と思った初心者向けの記事。
私も初心者なので、これが答えの全てではないだろうが、少しでも理解の助けになればと思い書きました。
(20200911更新)
・クラスとサブクラスの関係、クラスとインスタンスの関係を明確に分けた方がよい
・現実世界とオブジェクト指向では関係が異なる
というコメントをいただいたので、記事修正しております。
#本文
1つの答え:メンテナンスしやすい
よく見るのが下記のような図ですね。
これは、クラス(乗りもの、動物)と、サブクラス(乗用車・バイク・バス、人間・犬・猫)の関係です。
「お、おう、それがどうした」という感じ。
「そりゃあそうだろ、まともな教育受けていればそんなことをわかるよ」と。
問題は、「これがどう使えるか?」という話。
下記の図のように、クラス(もしくはサブクラス。プリウスという車種)とインスタンス(現実に存在するプリウス1~3)を考えたほうがよいと思う。
例えば、プリウスのプログラムにある条件でブレーキが利かなくなるという問題が発生したとする。
当然すでに販売したプリウス1~3にもそのような問題が発生する。
さあどうやって対応しようか?
ここで、2つの選択肢がある。
- 頑張ってすでに販売した車1つ1つを見て回り(もしかしたら全国に点在してるかも)、1台1台のプログラムを直す
- あらかじめ、プリウスの親のプログラムを直せば自動で1台1台のプログラムに反映されるようにしておき、親のプログラムを直す
これはさらに抽象化して、親クラスと子クラスを考えても同じ。
トヨタの全車種にまたがる問題が見つかったときに、各車種(プリウスとかカローラとか)のプログラムを1つずつ直すのか、それとも全車種の共通プログラムを作っておいてその共通プログラムだけ直せばOKなのか。
これは例えばWordPressの記事でも同じ。
記事1つ1つに編集や削除の機能(メソッド)を個別に作成するのではなく、記事というクラスに編集とか削除とかの機能を持たせる。
現実世界とオブジェクト指向では関係が異なるという点について、
現実世界では、「乗り物」は、乗用車・バイク・バスなど、要素を包括した概念(@shiracamusさんからいただいた図を記載させていただきます)
オブジェクト指向では、「乗り物」は、乗用車・バイク・バスの共通データ・共通機能
なので、オブジェクト指向においては、「乗り物」を修正すると、乗用車・バイク・バスの機能のうち、「乗り物と共通している機能」が修正できるということかと。
このように、オブジェクト指向でクラスを用いてプログラムを作ることで、より管理しやすくなる、というのがオブジェクト指向の意味なのでは、と思いました。