OOP

オブジェクト指向(おぶじぇくとしこう) プログラミング(Object-Oriented Programming)の核心概念(かくしんがいねん)

Objects (オブジェクト)

  • オブジェクトはクラスのインスタンス
  • 現実(げんじつ) 世界(せかい)実体(じったい)対応(たいおう)実行時(じっこうじ) 実体(じったい) とも() ばれる
  • メソッドとプロパティを(ふく) み、データを有用(ゆうよう) にする
  • メモリ空間(くうかん)占有(せんゆう) しアドレスを()
  • 状態(じょうたい) (state)と()() い(behaviour)を()

Classes (クラス)

クラスはオブジェクトを作成(さくせい) するための設計図(せっけいず) で、データとそのデータを操作(そうさ) するメソッドをカプセル()

特性(とくせい)

  • 論理的(ろんりてき)概念(がいねん) で、メモリ空間(くうかん)占有(せんゆう) しない
  • オブジェクトのテンプレートとも() ばれる
  • クラス(ない)定義(ていぎ) された変数(へんすう) はインスタンス変数(へんすう)
  • クラス(ない)定義(ていぎ) されたメソッドと変数(へんすう) はメンバー

クラス宣言(せんげん)構成(こうせい)

  1. 修飾子(しゅうしょくし) (Modifiers): public, protected, default, private
  2. クラス(めい) (Class name): 先頭(せんとう) 文字(もじ) 大文字(おおもじ)
  3. (おや) クラス (Superclass): (ひと) つの(おや) クラスのみ継承(けいしょう) 可能(かのう)
  4. インターフェース (Interfaces): 複数(ふくすう)実装(じっそう)可能(かのう)
  5. 本体(ほんたい) (Body): { }(かこ) まれる

Abstraction (抽象化)

抽象化(ちゅうしょうか)必要(ひつよう)情報(じょうほう) のみを表示(ひょうじ) し、不要(ふよう)情報(じょうほう)(かく) すプロセス。

コアコンセプト:

  • (おも)目的(もくてき) はデータ隠蔽(いんぺい)
  • 大量(たいりょう) のデータから表示(ひょうじ) すべき情報(じょうほう)選択(せんたく)
  • プログラムの複雑(ふくざつ) さと開発(かいはつ) 作業量(さぎょうりょう)削減(さくげん)
  • 抽象(ちゅうしょう) クラスは(ひと)以上(いじょう)抽象(ちゅうしょう) メソッドを宣言(せんげん) 可能(かのう)
  • 抽象(ちゅうしょう) メソッドは定義(ていぎ) があるが実装(じっそう) はない
  • 複数(ふくすう) のサブクラスが(こと) なる方法(ほうほう)(おな) じタスクを実行(じっこう) する場合(ばあい)使用(しよう)

Abstract vs Interface

側面(そくめん)Abstract ClassInterface
インスタンス()直接(ちょくせつ) インスタンス() 不可(ふか)直接(ちょくせつ) インスタンス() 不可(ふか)
継承(けいしょう)extends継承(けいしょう)implements実装(じっそう)
コンストラクタ() てる() てない
フィールドインスタンス変数(へんすう)() てる定数(ていすう) (static final) のみ
メソッド抽象(ちゅうしょう)具象(ぐしょう)両方(りょうほう)抽象(ちゅうしょう) メソッドのみ
多重(たじゅう) 継承(けいしょう)(ひと) つのみ継承(けいしょう) 可能(かのう)複数(ふくすう) 実装(じっそう) 可能(かのう)
コード再利用(さいりよう)共通(きょうつう) 基底(きてい) クラスと共有(きょうゆう) 動作(どうさ)提供(ていきょう)複数(ふくすう) クラスが遵守(じゅんしゅ) する契約(けいやく)定義(ていぎ)
使用(しよう) 時期(じき)共有(きょうゆう) 機能(きのう)()共通(きょうつう) 基底(きてい) クラスが必要(ひつよう)(とき)無関係(むかんけい) なクラスが実装(じっそう) すべき契約(けいやく)定義(ていぎ) する(とき)
拡張性(かくちょうせい)(あたら) しいメソッドのデフォルト実装(じっそう)追加(ついか) 可能(かのう)既存(きそん) コードを(こわ) さず(あたら) しいメソッドを追加(ついか) 可能(かのう)

Inheritance (継承)

継承(けいしょう) は「is-a」関係(かんけい)(あらわ) す。

種類(しゅるい)

  • Single (単一(たんいつ) 継承(けいしょう) ): (ひと) つのサブクラスが(ひと) つの(おや) クラスを継承(けいしょう)
  • Multilevel (多段(ただん) 継承(けいしょう) ): A → B → C の継承(けいしょう) チェーン
  • Multiple (多重(たじゅう) 継承(けいしょう) ): (ひと) つのクラスが複数(ふくすう)(おや) クラスを継承(けいしょう)一部(いちぶ)言語(げんご)非対応(ひたいおう)
  • Hierarchical (階層(かいそう) 継承(けいしょう) ): 複数(ふくすう) のサブクラスが(おな)(おや) クラスを継承(けいしょう)
  • Hybrid (混合(こんごう) 継承(けいしょう) ): 上記(じょうき) 種類(しゅるい)()() わせ

Polymorphism (多態性)

多態性(たたいせい)(おお) くの(かたち) 、または単一(たんいつ)動作(どうさ)(こと) なる方法(ほうほう)実行(じっこう) するプロセス。

種類(しゅるい)

種類(しゅるい)別名(べつめい)説明(せつめい)
Compile-TimeStatic Polymorphismコンパイル()解決(かいけつ) 、メソッドオーバーロードで実現(じつげん)
RuntimeDynamic Method Dispatch実行時(じっこうじ)動的(どうてき)解決(かいけつ) されるオーバーライドメソッド

静的(せいてき) バインディング: コンパイル() にどのオブジェクトのメソッドを()() すか決定(けってい) 、オブジェクトは(こと) なるメモリ空間(くうかん)()() てられる。

動的(どうてき) バインディング: コンパイル() にバインドせず、仮想(かそう) テーブル(Virtual Table)を作成(さくせい)実行時(じっこうじ) にどのメソッドを()() すか判断(はんだん)(おや) クラスのオブジェクト参照(さんしょう)(とお) じてサブクラスオブジェクトのメソッドを選択(せんたく)実行(じっこう) し、(しん)多態性(たたいせい)実現(じつげん)

Encapsulation (カプセル化)

カプセル() はデータとコードを単一(たんいつ) ユニットにバインドし、外部(がいぶ)干渉(かんしょう)誤用(ごよう) から保護(ほご) するプロセス。データ隠蔽(いんぺい) とも() ばれる。

Coupling (結合度)

結合度(けつごうど)(ひと) つのオブジェクトやクラスが(ほか) のものをどれだけ() っているかを(しめ) す。(ひと) つのクラスのプロパティや動作(どうさ)() わると、依存(いぞん) する(ほか) のクラスに影響(えいきょう)(あた) える。

種類(しゅるい)説明(せつめい)
Tight Coupling (密結合(みつけつごう) )モジュール(かん)依存度(いぞんど)(たか)
Loose Coupling (疎結合(そけつごう) )モジュール(かん)依存度(いぞんど)(ひく) く、抽象(ちゅうしょう) インターフェースで相互作用(そうごさよう)

Cohesion (凝集度)

凝集度(ぎょうしゅうど) はクラスが単一(たんいつ)明確(めいかく)責任(せきにん)()程度(ていど)(しめ) す。単一(たんいつ) 責任(せきにん) 原則(げんそく) (SRP)に関連(かんれん)

Association (関連)

関連(かんれん) はオブジェクト同士(どうし)(たが) いを「() っている」ことを意味(いみ) する。一対一(いちたいいち)一対多(いちたいた)多対一(たたいいち)多対多(たたいた) がある。

(れい)

  • バスは一人(ひとり)運転手(うんてんしゅ) のみ(一対一(いちたいいち)
  • 複数(ふくすう)乗客(じょうきゃく)(ひと) つのバスに() れる(多対一(たたいいち)
  • 一人(ひとり)乗客(じょうきゃく)(こと) なるバスに() れる(一対多(いちたいた)
  • 複数(ふくすう)乗客(じょうきゃく)複数(ふくすう)(こと) なるバスに() れる(多対多(たたいた)

Aggregation (集約)

集約(しゅうやく) は「has-a」関係(かんけい) で、(よわ)関連(かんれん)

特性(とくせい)

  • 部分(ぶぶん)全体(ぜんたい) から独立(どくりつ) して存在(そんざい) 可能(かのう)
  • 一対一(いちたいいち) 関連(かんれん) のみ
  • オブジェクト(かん)(よわ)関連(かんれん)

Composition (合成)

合成(ごうせい) は「belongs-to」関係(かんけい) で、ライフサイクルが相互(そうご) にバインドされる。

特性(とくせい)

  • (ふく) まれるオブジェクトは独立(どくりつ) して存在(そんざい) 不可(ふか)
  • オブジェクト(かん)(つよ)関連(かんれん)
  • 全体(ぜんたい)破棄(はき) されると部分(ぶぶん)破棄(はき) される

Composition vs Inheritance

CompositionInheritance
Has-A 関係(かんけい)(あらわ)Is-A 関係(かんけい)(あらわ)
(ふく) むオブジェクトの実装(じっそう) 変更(へんこう)容易(ようい)(ひと) つの実装(じっそう) 変更(へんこう)全体(ぜんたい)継承(けいしょう) 階層(かいそう)影響(えいきょう)
動的(どうてき) または実行時(じっこうじ) バインディング静的(せいてき) またはコンパイル() バインディング
フロントエンドクラスのインターフェース変更(へんこう)容易(ようい)メソッドやプロトタイプの変更(へんこう)(すべ) てのクラスに影響(えいきょう)
特性(とくせい)追加(ついか) しない場合(ばあい)使用(しよう)継承(けいしょう) クラスに機能(きのう)追加(ついか) する場合(ばあい)使用(しよう)

Message Passing (メッセージパッシング)

メッセージパッシングはプロセス(かん)通信(つうしん) 現象(げんしょう)

種類(しゅるい)

  • Synchronous (同期(どうき) ): オブジェクトが同時(どうじ)実行(じっこう) されている(とき)発生(はっせい)
  • Asynchronous (非同期(ひどうき) ): 受信(じゅしん) オブジェクトが停止(ていし) またはビジー状態(じょうたい)可能性(かのうせい) あり

OOP 長所と短所

長所(ちょうしょ)

  • 再利用性(さいりようせい) (Re-usability)
  • データ冗長性(じょうちょうせい) 削減(さくげん) (Data redundancy)
  • コード保守(ほしゅ) (Code maintenance)
  • セキュリティ (Security)
  • 設計(せっけい)利点(りてん) (Design benefits)
  • デバッグの容易(ようい) さ (Easy troubleshooting)

短所(たんしょ)

  • 開発(かいはつ) 作業量(さぎょうりょう)(おお)
  • (ほか) のプログラムと(くら) べて速度(そくど)(おそ)
  • プログラムサイズが(おお) きい