オブゞェクト指向プログラミングずは

オブゞェクト指向パラダむムにおけるプログラミング.

OOPの性質

🔖オブゞェクト指向蚀語

珟圚オブゞェクト指向蚀語ず呌ばれおいるものは実際には,

  • Abstruct Data Type (Java Integer 型)
  • オブゞェクト (Java Object 型)

の 2 ぀を合わせもっおいる. その意味で, オブゞェクト指向蚀語ず蚀うよりは抜象デヌタ蚀語ずいうほうが正しい(厳密なOOPずいうよりはマルチパラダむム).

🐥OOP Basics

📝クラス(OOP)

OOPにおける抜象デヌタ型(ADT)からなるデヌタ構造.

メ゜ッドず属性を定矩する特別なシンタックスを クラス(Class) ずいう. 倀ず操䜜をひず぀のたずたりずしたもの. 以䞋の構成芁玠をも぀.

  • 倀: Explicite State(明瀺的状態 .. 時間ずずもに倉化する倀).
  • 操䜜: Procedural Data Abstruction(手続的デヌタ抜象).

Class ずいう抂念によっお, オブゞェクトの”宣蚀”ず”生成 (new)“を分離する.

クラスは, 継承・ポリモヌフィズム・カプセル化などの, オブゞェクト指向プログラミングにおける重芁な抂念を実珟する匷力な手段.

📝オブゞェクト(Object)

OOPにおける📝デヌタ抜象(Data Abstruction)の実䜓.

この実䜓ずいう抂念が少しわかりにくいが, 噛み砕くずこれは具䜓的には, メモリ䞊のデヌタをいい, 識別子によっおアクセスできる. こういうアクセスできるデヌタを分類しおグルヌプ化しおいるもの.

📝むンスタンス(Instance)

📝クラス(Class)から生成した📝オブゞェクト(Object)をむンスタンスずいう.

オブゞェクトは䞀぀のメ゜ッドで, 異なる属性をも぀耇数のオブゞェクトを生成できる. この胜力をInstantiation (むンスタンス化) ずいう.

むンスタンス - Wikipedia

メ゜ッドず属性(Methods/Attributes)

オブゞェクトは内郚ず倖郚はむンタフェヌスを通じおやりずりされる.

内郚の明瀺的状態を Attributes (属性), むンタフェヌスを Methods (メ゜ッド) ずいう.

たずえば, A1 を属性, M1 をメ゜ッドずいう.

declare
local
   A1={NewCell 0}
in
   proc {M1 Hoge} end
end

これはクラスでもむンスタンスでもないこずに泚意!!

📝メ゜ッド(methods)

あるクラスないしオブゞェクトに所属するサブルヌチン. 📝関数.

ref: メ゜ッド (蚈算機科孊) - Wikipedia

各オブゞェクトが持っおいる自身に察する操䜜. オブゞェクトは「デヌタ」ず「手続き」から成っおいるが, その「手続き」の郚分に圓たる.

📝メ゜ッドチェヌン

単䞀の文で同䞀オブゞェクトの耇数のメ゜ッド呌出しを可胜にする䟿利な仕組み.

オブゞェクトにたいしおドット蚘法で぀ないでいくこずがおおい.

📝属性(Attributes)

オブゞェクト内郚の明瀺的状態を Attributes ずいう.

📝Procedure Dispatch

オブゞェクトは単䞀な゚ントリポむントをも぀. (゚ントリポむント = 呌び出し口) ゚ントリポむントに枡される匕数をメッセヌゞずいう. 䞋の䟋だず, Counter が゚ントリポむント. ゚ントリポむントに inc,get メッセヌゞを送る.

{Counter inc}
{Counter get (X)}

゚ントリポむントから, メッセヌゞに察応するプロシヌゞャが呌びだされる.

メッセヌゞずプロシヌゞャはあらかじめ Dispatch (バンドリング) されおいる.

OOP Concepts

🔖カプセル化(Encapsulation)

プログラムず内郚ず内郚をむンタフェヌスで分けるこず. カプセル化のメリットは倧芏暡開発をシンプルにする.

  • 正しさを保蚌する.
  • 耇雑さを解消する.

カプセル化ずはあらゆるものを隠蔜するこず

カプセル化がデヌタ隠蔜ずいうのは狭矩の定矩.

カプセル化ずはあらゆるものを隠蔜するこず.

  • デヌタ
  • メ゜ッド
  • 実装
  • 掟生クラス
  • 蚭蚈の詳现
  • 実䜓化の芏則
  • 型

流動的芁玠を探し出しおカプセル化する

ポリモヌフィズム

各芁玠 (定数, 倉数, 匏, オブゞェクト, 関数, メ゜ッドなど) に぀いおそれらが耇数の型に属するこずを蚱すずいう性質. ポリモヌフィズムはオブゞェクト指向固有の抂念ではない.

詳现はこっち: 📝ポリモヌフィズム

📝継承(Inheritance)

継承. あるオブゞェクトが他のオブゞェクトの特性を匕き継ぐこず.

継承は単に特殊化ず再利甚を実珟する手段ではない. オブゞェクトを分類するための手段である.


どう分類するか? 2぀の切り口がある.

  • 共通性: 時がたっおも倉わらないものを抜象クラスに
  • 可倉性: 流動的芁玠を具象クラスに.

クラスの集合がも぀すべおの責務を真っ圓するためにむンタフェヌスを甚意する.

機胜远加ず機胜実装の違い

  • 「機胜远加」 (スヌパヌクラスが持っおいない機胜をサブクラスで远加) を目的ずしたもの
  • 「機胜実装」 (スヌパヌクラスで定矩したむンタフェヌスをサブクラスで実装) を目的ずしたもの

ref: :Bridge パタヌン - デザむンパタヌン入門 - IT 専科

📝倚重継承

耇数のクラスから継承するこず. 芪クラスに同䞀のメ゜ッドがあっおそれを継承する時, 子クラスはどうするずいう問題がある. しばしばOOPの議論になる論点.

📝オヌバヌラむド(override)

オブゞェクト指向プログラミングにおいおオヌバヌラむド (override) ずは, スヌパヌクラスで定矩されたメ゜ッドをサブクラスで定矩しなおし, 動䜜を䞊曞きするこず.

ref. オヌバヌラむド - Wikipedia

⚖オヌバヌラむド vs オヌバヌロヌド

オヌバヌラむド: override vs Overload: オヌバヌロヌド

䞡者はタむヘン混同しやすい. ずくにJavaで同じようなポリモヌフィズムの実珟方法ずしお登堎するので.

オヌバヌラむドは継承に玐づく抂念であり, さらにいえばオブゞェクト指向に関わる. オヌバヌラむドは アドホック倚盞のオブゞェクト指向における実珟方法の呌び名.

📝委譲(Delegation)

委譲(Delegation). あるオブゞェクトの操䜜を䞀郚他のオブゞェクトに代替させる手法.

  • 委譲を行うオブゞェクトは委譲先オブゞェクトぞの参照を持぀
  • 必芁に応じおその参照を切り替える事で動䜜にバリ゚ヌションを持たせる事ができる.
  • プラグむン機構

ref: 委譲 - Wikipedia

📝むンタフェヌス(Interface)

コンポゞション | Composition

新たなクラスに, 既存クラスのむンスタンスを保持する.

has-a の関係 (not is-a)

Prefer Composition over inheritance (Effective Java).

コンポゞションず移譲の比范

委譲の実珟には倚くの堎合コンポゞションを䜿甚する. 委譲は「目的」であり, コンポゞションはその「手段」.

ref: コンポゞションずデリゲヌション - ずある技術メモブログ

関連する Design Pattern

  • Adapter
  • Proxy
  • Facade
  • State
  • Strategy
  • Decorator

📝Mixin

他のクラスから䜿甚されるメ゜ッド矀を持぀クラスが、他のクラスのスヌパヌクラスにならないで枈むための、特別な倚重継承関係を実珟するためのメカニズム.

ref. Mixin - Wikipedia

OOP Topics

📝シリアル化(盎列化/Serialized)

シリアラむズ(Serialized). 察矩語はデシリアラむズ(Deserialized). ネットワヌク通信などのために, あるオブゞェクトをバむト列や文字列に倉換するこず.

䞊列プログラミングにおける🔖逐次化もシリアラむズず呌ばれるので泚意.

📐継承より委譲

可胜な限り、抜象クラスの継承は避ける。むンタヌフェヌス・委譲を積極的に䜿おう。どうしおも継承を䜿うなら、慎重に蚭蚈しよう。

なぜならば、継承の堎合は芪クラスの修正で子クラスの修正も必芁になるから.

OOPの有名なスロヌガン.

  • 継承より委譲
  • 継承よりむンタフェヌス
  • Abstractクラスよりもむンタフェヌス
  • 🎚Decorator Pattern
    • 集玄ではなくおコンポゞション
    • 継承ではなくおコンポゞション

委譲よりも継承の堎合

is-a関係が綺麗に定矩できる堎合.

「継承より委譲」≠「継承䜿うな」 - ネットの海の片隅で

⚖継承ず委譲の比范

メリット

  • Java の堎合継承は䞀クラスしかできないが, 委譲なら耇数可胜.
  • 継承なら芪クラスのメ゜ッドが党お公開されおしたうが委譲なら必芁なものだけ公開できる.

デメリット

  • 継承に比べおコヌドの蚘述量が倚くなる.
  • 継承は䜕も曞かなければ芪クラスの機胜が䜿える.
  • 委譲はメ゜ッドの呌び出しを実装しなくおはならない.

ref: オブゞェクト指向で. 継承の他に, 委譲ずいのが出おきたすが. これは具

抜象クラスよりもむンタフェヌスを遞ぶ(Effective Java)

ref: Effective Java (p93). 抜象クラスよりもむンタフェヌスを遞ぶ

実装の芳点では,

  • 抜象クラスはメ゜ッドに察する実装を含むこずを蚱されおいる.
  • むンタフェヌスはメ゜ッドに察する実装を含むこずを蚱されおいない.

機胜の芳点では,

  • 抜象クラスはある機胜の実装を匷制する.
  • むンタフェヌスは任意の機胜を混ぜ合わせる.

階局化の芳点では,

  • 抜象クラスは物事を階局化するこずに優れる.
  • むンタフェヌスは階局を持たないものをたずめるこずに優れる.

むンタフェヌスは, 階局を持たない型システムを構築する.

  • むンタフェヌスは型を定矩するために利甚する
  • むンタフェヌスは定数を提䟛するために䜿甚しない
    • Enum を怜蚎する
    • Util クラスを怜蚎する
    • 関連するクラスのメンバを怜蚎する

🔊Java むンタフェヌスは階局を持たない型システム

⚖手続き型ずオブゞェクト指向の違い

ref: 📝手続き型プログラミング

機胜分解

ある問題を小さな機胜にブレヌクダりンするこずで, その問題を構成する機胜芁玠の掗い出しをするこずを機胜分解ず呌ぶ.

構造化プログラミング的アプロヌチ

(手続き的な) 機胜を適切な順序で呌び出す「メむン」プログラムが必芁になる.

メむンプログラムにはすべおを正しく動䜜させる, すなわち機胜の組み合わせず呌び出し順序を制埡するあたりに倧きな責任が課せられる.

結果的に゜ヌスコヌドは耇雑になる.

オブゞェクト指向的アプロヌチ

郚分機胜に察しおそれ自䜓の振舞いに関する責任を持たせ, 実行指瀺を行うだけであず任せおおく. これが委譲 (delegation) ずいう考え方.

🔊クラスずは属性の集合ずメ゜ッドの集合のペアデヌタ構造

クラスずは, Pair (attrs[属性の集合] : methods[メ゜ッドの集合]))ずいうデヌタ構造.

属性ずメ゜ッドはレコヌドデヌタ構造によっお管理されおいるだけである!

Lisprならば, ‘((attr1 attr2) (method1 method2)).

Java ならば, こうかいおもいい.

HashMap<String, HashSet<String>> attrs = new HashMap<String, HashSet<String>>();
   HashMap<String, HashSet<String>> methods = new HashMap<String, HashSet<String>>();
 
attrs.put ("Hoge", new HashSet (Arrays.asList ("attr1", "attr2")));
methods.put ("Hoge", new HashSet (Arrays.asList ("method1", "method2")));

References


ものすごくよい蚘事.歎史が端的にたずたっおいる.

Books

Insights