はじめに
Rubyを学習するにあたって、自分が難しいと感じたオブジェクト指向について備忘録。
まだ100%理解できてるとは思えないので、間違いがあればご指摘お願いします!
参考記事 [オブジェクト指向]
参考動画 [Youtube]
結論
記事や本によっても若干異なりますが、自分が納得できたものを3つ上げます!
- 簡単にいうとオブジェクト(モノ)と、操作に分けてプログラムを組み立てていく考え方のこと。
- いかに効率良く開発を行うかを突き詰めた考え方。
- オブジェクト指向とは現実世界を正しく捉えること。
抽象的、、、もう少し深掘ります!
具体的に
テレビのリモコンを作るときを想像します。
まず本体を作る、その後リモコンを操作するための要素(電源を入れたり操作するなど)を追加します。
必要な要素 | |
---|---|
モノ | リモコン本体 |
操作1 | 電源OFF |
操作2 | チャンネル変更 |
モノと操作を分けて作っていき、組み立てて完成させます。
オブジェクト指向の考え方としてはまさにこれです!
でも、「まだオブジェクト指向の必要性が分からない!」というのが本音。。
なぜ必要なのか(メリット)
- プログラムの設計・開発が効率的に!
Webアプリなどのボタンを作る時を想定します。
新規登録ボタンや更新ボタン、削除ボタンなどたくさんのボタンが考えられます。
早速、モノと定義したボタンを一つだけ作りました。
でも、登録、更新、削除などのいろんな種類のボタンを作りたい!と考えたとき、
同じ工程をボタンの数だけ繰り返すのは結構大変。。色を変えたり表記文字だけを変えれればなぁ、、
という悩みを解決してくれます!
オブジェクト指向により定義することでコレ、できてしまうんですね。
色を変えたりサイズを変えても同じボタン。再利用し簡単に作ることが可能にできるんです!
- 不具合が生じた時に原因を特定しやすくなる!
開発中に、エラーやなんらかの不具合が出たとき、原因を探すために、ソースコードの中から探します。しかし当てが無い中、長ーいコードを辿るのはきついです、、。
しかし、オブジェクト指向は、モノと操作に分けているため、
どこでエラーが起こったか、どんな操作をした時にエラーが出たかを推察することが出来ちゃいます!
(範囲が狭ければ全てを確認するより多少は予測できる!)
また、操作ごとに処理が分かれてるため、エラーの処理が起こった部分を操作処理を見るだけで、原因が特定しやすくなるんですね!
- プログラムの仕様が変わっても対応しやすい!
今あなたは、メルカリのようなWebアプリケーションを開発しています。ボタンサイズが小さくて見づらい!と開発責任者から指摘された時を想像してください。
前でも書きましたが、ボタンには、新規登録、ログイン、ログアウト、購入、出品、詳細確認、、など多数のボタンが存在します。全部修正しなければいけません。
オブジェクト指向でないと、一つ一つのボタンのサイズを修正し拡大しなければなりません。
10個修正するなら10箇所の修正が必要になるという事。。( ゚д゚)
対してオブジェクト指向を使うと、定義したボタン幅や高さを一箇所だけ修正すれば全てのボタンが変更できます!
効率的にスピーディーに対応できますね!
オブジェクト指向を学ぶ時に必要なキーワード
カプセル化
他のプログラムからできるだけ変更できないようにする仕組みのこと。
モノとして使いまわしたい時に、変更したくない部分がある。他プログラムにより簡単に変更できないように設定して守ってくれるのが「カプセル化」。
継承
継承は、同じようなプログラムを一箇所にまとめて、そのコードを再利用しやすく仕組みのこと。
アプリを開発していると、データの登録や、テストを書く時などに、似たような処理を作るケースが出てくる。
もし、使用の変更が必要になったら?
この時、別々にコードを書くと、これまたカプセルかの時と同じように、書いた分だけコードの修正箇所があるということに・・探すのも大変、書くのも大変。_| ̄|○
また、開発が進んでいくと、重複したコードが多くなっていく。それを読むとなると時間がかかり、コードを探すのも大変。記述も冗長に、、
しかし継承を使えば、登録や更新、削除などのカテゴリー別にコードをまとめられるため、新しい機能機能を追加するときも、似たような処理がないかを確認しやすくなる。
コードを書いていて、これは確かに感じました。
例えばテストなんか、FactoryBotを使用して、処理をまとめて書けば工数も減るし、仕様が変わっても、修正にさほど手間はかからないです。
結合テストなんかも、同じログイン処理を一箇所にまとめて使いまわしていたのもまさにコレかと。
抽象化
重要な要素や共通な要素を抜き出し、他は切り捨てる考え方。
例えばスマートフォンを作りたいとき。
聞かなければ分からないこと
- どれくらいのサイズ?
- どんなデザイン?
- どんなコンセプト?
必ず必要な共通要素
- バッテリーがついている
- 操作するための画面がある
- 通話機能がある
などと言ったことが考えられる。
この後者の必ず必要な共通要素を考えるのが抽象化。
詳しいことは決まってないけれど、開発する上で必要となる機能には◯○だな、と考えるようなイメージ!
ポリモーフィズム
継承したコードの一部を変更して利用するための仕組み。
新しい機能を搭載したいなぁと考えたとき、継承を使ってカテゴリーとしてまとめたコードの中に、似ている機能があったとする。
このとき、コードの一部分のみを変更して利用できるのがポリモーフィズム。
ボタンの例で記述した色を変えたり、大きさを変更するというのはまさにポリモーフィズムの例って事ですね!
まとめ!
- オブジェクト指向をマスターすると開発・運用効率が上がる!
- 開発後の修正もしやすいコードが作れるようになる!
正直このまとめをしていても30%も理解できているか自信がありません💧
ただ、実装している時に知らず知らずのうちに実行していたことはありました。(継承とかポリモーフィズムは特に)
とにかくフワッとでも、オブジェクト指向のことを理解できた!という人が増えればなと思います。
ではではお疲れ様でした!
追記 クラスとインスタンスの関係性
オブジェクト指向とは?
プログラムの動作をある特徴(属性値とメソッド)を持ったパーツの組み合わせで実現するという考え方。
パーツの特徴を定義するのがclass、実際のパーツはインスタンス。インスタンスはclassから生み出される。
Comments
Let's comment your feelings that are more than good