オブジェクト指向以外の言語との違い
オブジェクト指向の言語が生まれる前は、「手続き型言語」に分類される言語があった。
「手続き型言語」は処理させたい内容を基本的には上から順に記述する。
手続き型
- 処理A
- 処理B
- 処理C
- 処理D
・
・
・
上記のように記述する場合、記述量が増えてくると可読性が下がる。
そのために「関数」を使用し、複数の処理を1つのグループにまとめ、そのグループに名前をつけて使用していた。
rubyで再現すると以下のようになる。(rubyは手続き型言語ではない)
def mixer(fruit)
puts "#{fruit}を細かく砕く"
return "#{fruit}のジュース"
end
puts "フルーツを入力してください"
input = gets.chomp
puts mixer(input)
上記のように関数を利用しつつ、上から順にコードを記述していくのが手続き型言語のスタイル。
ただ、上述の通り手続き型言語はコード量が多くなると管理しきれなくなる。
それを解消するためにオブジェクト指向と呼ばれる考え方が生まれた。
オブジェクト指向
オブジェクト指向では、オブジェクトと呼ばれるパーツを連携させることでアプリなどの機能を実現する。
手続き型では、処理をまとめるために関数という仕組みがある。
オブジェクト指向では、さらに複数の関数をまとめて1つのオブジェクトとして扱っている。
手続き型とオブジェクト指向の違い
「カレーをつくる」という作業を例に、手続き型とオブジェクト指向の発想の違いのイメージを掴む。
手続き型的アプローチは、1人でカレーを作る時に適しており、オブジェクト指向的アプローチは複数人で大量にカレーを作る時に適している。
手続き型のイメージ
以下のように手順を紙にまとめ、上から順に取り組んでいくイメージです。
- 食材を買いに行く
- 野菜を洗う
- 野菜を切る
- 肉を切る
- 野菜を炒める
- 肉を炒める
- 水を入れて煮る
- ルーを入れる
オブジェクト指向のイメージ
例えば10人でカレーを作る場合、以下のように全員が同じ手順を踏んでいくことは効率がいいとは言えない。
- 10人で食材を買いに行く
- 10人で野菜を洗う
- 10人で野菜を切る
通常は、以下のように買い出しや野菜担当などのチームに分かれて、それぞれの作業を行うことが考えられる。
- リーダー
- 買い出しチーム
- 野菜チーム
- 肉チーム
また、必要な材料や道具をチームごとに配っておけば効率よく作業ができる。
このカレー作りでの「チーム」に当たるのが、オブジェクト指向における「オブジェクト」にあたる。
役割ごとに分けたチームが連携してカレーを作るように、機能ごとに分けたオブジェクトを連携させてアプリを開発するのがオブジェクト指向の考え方になる。
オブジェクトとは役割ごとに分けたチームのようなもの
オブジェクトの特徴
オブジェクト指向におけるオブジェクトについて、必ず押さえておきたい特徴
- 1つのオブジェクトには、1つの責務がある
- オブジェクトにはメソッドと変数が含まれる
- 他のオブジェクトに公開するメソッドや変数は必要最低限のもののみとする
先ほどのカレー作りに当てはめていく。
1. 1つのオブジェクトには、1つの責務がある
上記のカレー作りの場合、野菜に関する調理は野菜チーム、肉に関する調理は肉チームが行なっていた。
これを「単一責任の原則」と言い、アプリ開発では、1つのオブジェクトに1つの機能を持たせるよう設計する。
例えば、フォームからの投稿機能を実装する場合は、以下のようなオブジェクトを作成し、それらを連携させることで機能を実現できるようにする。
- データの入れ物となるオブジェクト
- フォームからデータを受け取るオブジェクト
- SQLを発行するオブジェクト
- 上記のオブジェクトをコントロールするオブジェクト
2. オブジェクトにはメソッドと変数が含まれる
カレー作りの場合では、各チームにメンバーが配置され、下記のように必要な道具や材料が割り振られていた。
- 買い出しチーム・・・買い出しに必要な費用、買った材料を入れる袋
- 野菜チーム・・・包丁
- 肉チーム・・・包丁
オブジェクトは「メソッド」と「変数」をひとまとめにしたもの。
メソッドは、チームに配置されたメンバーのようなもの。メンバーが野菜を加工するように、メソッドはオブジェクト内の変数の変更や参照といった処理を担っている。
3. 他のオブジェクトに公開するメソッドや変数は必要最低限のもののみとする
カレー作りでも、初めに決められた仕事以外を手伝うと、たとえそれが善意であっても返って混乱することが考えられる。
カレー作りで、じゃがいもの皮むきを追加で10個行う必要が出たとした場合でも、別チームのメンバーが代わりに手伝うことはしない。
混乱を防ぐためには、別チームのタスクを直接行うのではなく、そのチームの担当にタスクを依頼する仕組みにする必要がある。
必ず、野菜担当に「追加で10個皮をむいてほしい」ということを伝えるのみで、実際の皮むきは担当者が行う。
それと同じように、オブジェクト指向では、あるメソッドが別のオブジェクトの変数に直接アクセスしないよう設計する。
別のオブジェクトに含まれる変数を取得したい場合は、相手方のオブジェクトに含まれる「取得用のメソッド」に対して、データ取得を依頼する形にする。
オブジェクトごとにメソッドや変数を分離して、他オブジェクトに必要以上に干渉しないようにする考え方を「カプセル化」という。
カプセル化を含む以下の3点がオブジェクト指向の特徴だと言われている。
- カプセル化
- 継承
- ポリモーフィズム
今回の内容はカプセル化にあたる。