はじめに
オブジェクト指向について自分の言葉で説明できる自信が少しなかったので、来年を迎える前に復習するために書きました。
オブジェクト指向についての現段階の理解
主な3つの要素は
クラス・継承・ポリモーフィズム
- クラスを作成(カプセル化) することによって、再利用性を高めることができる
- 継承することによって、コードの重複を減らすことができる。保守しやすい
- ポリモーフィズムによって、同じ名前のメソッドが他のクラスでは異なる挙動をする
クラスはオブジェクトのひな型や設計図であり、そこから作成されたオブジェクトをインスタンスと呼ぶ。
さっそく調べていく
「オブジェクト指向ってなに?」一言でいうと
オブジェクト指向ってなに?って聞かれた時にスパッと言い切れないので、調べてみたところいくつかありました。
「実世界のものごとを、データ(属性)とその動作(メソッド)を一つの単位(オブジェクト)として捉え、それらのやり取りでシステムを構築する考え方」
「プログラムを設計するときに考え方の一つで、プロパティとメソッドをひとまとめにしてクラスを作り、それを元にオブジェクト(インスタンス)を作成する手法」
これを読んだときにコードのイメージが湧いたり、たとえ話が思い浮かぶと良さそう。
オブジェクトって一言で言うと何?
データ(状態)とそれに関する操作(振る舞い)をひとまとめにしたもの
3大要素については間違ってはいなさそうでした。
カプセル化についての説明はメモ
- データ(状態)とそれを操作する処理(振る舞い)を一つのオブジェクトにまとめること。
- 外部から直接データを変更できないようにして、内部の一貫性を保つ
オブジェクト指向を理解していると何がいい?
- コードの保守性が向上し、エラーを防ぎやすくなる
- 柔軟性の高い設計が可能になり、変更要求に応じやすい
- チーム開発においても役割分担がしやすい
- ソフトウェアの規模が大きくなっても管理しやすい構造を保てる
具体的なポイント
変更が局所化しやすい
オブジェクト指向では、データとその操作をクラスにまとめ、カプセル化しているので、特定の機能や挙動を変更したい場合、該当するクラスやメソッドを修正すればよくなる。
コードを重複を避けられる
継承やメソッドの再利用により、同じ処理を複数個所に記述する必要がなくなる。これにより、修正が必要になったときに複数個所を変更する手間を減らし、バグのリスクを低減することが出来る。
再利用性と拡張性
継承を使うことで、既存のクラスの機能を引き継ぎ、新しい機能を追加したクラスを簡単に作ることが出来る。親クラスに共通部分をまとめることで拡張が容易になる。
ポリモーフィズムによって、異なるクラスでも同じインターフェース(メソッド名)を持つことで、同じように扱える。わんわんにゃーにゃー的な。
バグが発生しにくい構造
オブジェクト指向では、外部からクラス内部データを直接操作できない(カプセル)のため、不正な値や予期しない操作を防ぎやすくなる。
コードの可読性と理解のしやすさの向上
クラスやメソッドを使って責務を分割することで、コードの構造が明確になり、開発者がコードを理解しやすくなる。
テストがしやすい
クラスやメソッド単位で動作を確認しやすいので、ユニットテストを効率よく作成できる。変更があった場合でも、影響範囲を限定できる。
メリットをずらっと並べると
「変更がしやすい」「バグが起きにくい」「理解しやすい」「修正の影響範囲が狭い」「拡張がしやすい」
オブジェクト指向のクラスとは?
オブジェクトとはデータと処理をまとめた集まりのことで、オブジェクト指向の基本となる。
クラスとはこれから作る「モノの定義」「設計書」
クラスはあくまで設計図であって、実際に動作して仕事をしてくれるのは「インスタンス」。クラスからインスタンスを作ることをインスタンス化という。
クラスがもつ3つの要素
属性(フィールド/インスタンス変数)
属性とは、クラスやそのインスタンスがもつデータのこと。オブジェクトが何を表し、どのような状態であるかを記録する。
メソッド
クラスに属する機能や処理を表す。メソッドを通じて、クラスやオブジェクトがどのように振る舞うかを定義する。
コンストラクタ
オブジェクトが生成されるときに初期化処理を行うメソッド
属性とプロパティの違い
「属性」は、オブジェクトが持つ本質的な性質や情報
「プロパティ」は、プログラミング言語における実装の側面を強調する用語で、属性をプログラム上で操作可能にする仕組みのこと
調べる前との差分
- 今まで具体的なポイントのパートで挙げた特徴を 「オブジェクト指向」で作られているからという括りで理解していなかった。
- クラス内にある要素をしっかりフレーミングできていなかった