OOP
オブジェクト指向 プログラミング(Object-Oriented Programming)の核心概念 。
Objects (オブジェクト)
- オブジェクトはクラスのインスタンス
- 現実 世界 の実体 に対応 、実行時 実体 とも呼 ばれる
- メソッドとプロパティを含 み、データを有用 にする
- メモリ空間 を占有 しアドレスを持 つ
- 状態 (state)と振 る舞 い(behaviour)を持 つ
Classes (クラス)
クラスはオブジェクトを作成 するための設計図 で、データとそのデータを操作 するメソッドをカプセル化 。
特性 :
- 論理的 な概念 で、メモリ空間 を占有 しない
- オブジェクトのテンプレートとも呼 ばれる
- クラス内 で定義 された変数 はインスタンス変数
- クラス内 で定義 されたメソッドと変数 はメンバー
クラス宣言 の構成 :
- 修飾子 (Modifiers): public, protected, default, private
- クラス名 (Class name): 先頭 文字 大文字
- 親 クラス (Superclass): 一 つの親 クラスのみ継承 可能
- インターフェース (Interfaces): 複数 の実装 が可能
- 本体
(Body):
{ }で囲 まれる
Abstraction (抽象化)
抽象化 は必要 な情報 のみを表示 し、不要 な情報 を隠 すプロセス。
コアコンセプト:
- 主 な目的 はデータ隠蔽
- 大量 のデータから表示 すべき情報 を選択
- プログラムの複雑 さと開発 作業量 を削減
- 抽象 クラスは一 つ以上 の抽象 メソッドを宣言 可能
- 抽象 メソッドは定義 があるが実装 はない
- 複数 のサブクラスが異 なる方法 で同 じタスクを実行 する場合 に使用
Abstract vs Interface
| 側面 | Abstract Class | Interface |
|---|---|---|
| インスタンス化 | 直接 インスタンス化 不可 | 直接 インスタンス化 不可 |
| 継承 | extends で継承 | implements で実装 |
| コンストラクタ | 持 てる | 持 てない |
| フィールド | インスタンス変数 を持 てる | 定数 (static final) のみ |
| メソッド | 抽象 と具象 の両方 | 抽象 メソッドのみ |
| 多重 継承 | 一 つのみ継承 可能 | 複数 実装 可能 |
| コード再利用 | 共通 基底 クラスと共有 動作 を提供 | 複数 クラスが遵守 する契約 を定義 |
| 使用 時期 | 共有 機能 を持 つ共通 基底 クラスが必要 な時 | 無関係 なクラスが実装 すべき契約 を定義 する時 |
| 拡張性 | 新 しいメソッドのデフォルト実装 を追加 可能 | 既存 コードを壊 さず新 しいメソッドを追加 可能 |
Inheritance (継承)
継承 は「is-a」関係 を表 す。
種類 :
- Single (単一 継承 ): 一 つのサブクラスが一 つの親 クラスを継承
- Multilevel (多段 継承 ): A → B → C の継承 チェーン
- Multiple (多重 継承 ): 一 つのクラスが複数 の親 クラスを継承 (一部 の言語 は非対応 )
- Hierarchical (階層 継承 ): 複数 のサブクラスが同 じ親 クラスを継承
- Hybrid (混合 継承 ): 上記 種類 の組 み合 わせ
Polymorphism (多態性)
多態性 は多 くの形 、または単一 の動作 を異 なる方法 で実行 するプロセス。
種類 :
| 種類 | 別名 | 説明 |
|---|---|---|
| Compile-Time | Static Polymorphism | コンパイル時 に解決 、メソッドオーバーロードで実現 |
| Runtime | Dynamic Method Dispatch | 実行時 に動的 に解決 されるオーバーライドメソッド |
静的 バインディング: コンパイル時 にどのオブジェクトのメソッドを呼 び出 すか決定 、オブジェクトは異 なるメモリ空間 が割 り当 てられる。
動的 バインディング: コンパイル時 にバインドせず、仮想 テーブル(Virtual Table)を作成 。実行時 にどのメソッドを呼 び出 すか判断 。親 クラスのオブジェクト参照 を通 じてサブクラスオブジェクトのメソッドを選択 ・実行 し、真 の多態性 を実現 。
Encapsulation (カプセル化)
カプセル化 はデータとコードを単一 ユニットにバインドし、外部 の干渉 と誤用 から保護 するプロセス。データ隠蔽 とも呼 ばれる。
Coupling (結合度)
結合度 は一 つのオブジェクトやクラスが他 のものをどれだけ知 っているかを示 す。一 つのクラスのプロパティや動作 が変 わると、依存 する他 のクラスに影響 を与 える。
| 種類 | 説明 |
|---|---|
| Tight Coupling (密結合 ) | モジュール間 の依存度 が高 い |
| Loose Coupling (疎結合 ) | モジュール間 の依存度 が低 く、抽象 インターフェースで相互作用 |
Cohesion (凝集度)
凝集度 はクラスが単一 で明確 な責任 を持 つ程度 を示 す。単一 責任 原則 (SRP)に関連 。
Association (関連)
関連 はオブジェクト同士 が互 いを「知 っている」ことを意味 する。一対一 、一対多 、多対一 、多対多 がある。
例 :
- バスは一人 の運転手 のみ(一対一 )
- 複数 の乗客 が一 つのバスに乗 れる(多対一 )
- 一人 の乗客 が異 なるバスに乗 れる(一対多 )
- 複数 の乗客 が複数 の異 なるバスに乗 れる(多対多 )
Aggregation (集約)
集約 は「has-a」関係 で、弱 い関連 。
特性 :
- 部分 は全体 から独立 して存在 可能
- 一対一 関連 のみ
- オブジェクト間 の弱 い関連
Composition (合成)
合成 は「belongs-to」関係 で、ライフサイクルが相互 にバインドされる。
特性 :
- 含 まれるオブジェクトは独立 して存在 不可
- オブジェクト間 の強 い関連
- 全体 が破棄 されると部分 も破棄 される
Composition vs Inheritance
| Composition | Inheritance |
|---|---|
| Has-A 関係 を表 す | Is-A 関係 を表 す |
| 含 むオブジェクトの実装 変更 が容易 | 一 つの実装 変更 が全体 の継承 階層 に影響 |
| 動的 または実行時 バインディング | 静的 またはコンパイル時 バインディング |
| フロントエンドクラスのインターフェース変更 が容易 | メソッドやプロトタイプの変更 が全 てのクラスに影響 |
| 特性 を追加 しない場合 に使用 | 継承 クラスに機能 を追加 する場合 に使用 |
Message Passing (メッセージパッシング)
メッセージパッシングはプロセス間 の通信 現象 。
種類 :
- Synchronous (同期 ): オブジェクトが同時 に実行 されている時 に発生
- Asynchronous (非同期 ): 受信 オブジェクトが停止 またはビジー状態 の可能性 あり
OOP 長所と短所
長所 :
- 再利用性 (Re-usability)
- データ冗長性 削減 (Data redundancy)
- コード保守 (Code maintenance)
- セキュリティ (Security)
- 設計 の利点 (Design benefits)
- デバッグの容易 さ (Easy troubleshooting)
短所 :
- 開発 作業量 が多 い
- 他 のプログラムと比 べて速度 が遅 い
- プログラムサイズが大 きい