ちょうぜつソフトウェア設計入門 (語彙編)
本書は、オブジェクト指向に触れたことがある人向けの中級者よりの難易度となっている。
今回は、主に、オブジェクト指向に触れている、3章から5章についてざっと紹介する。
オブジェクト指向と関数型プログラミング
オブジェクト指向は、状態管理システムを作る事だけにあるわけではない。
関数型プログラミングのほうがブームが後だったのだが、それまで行われていた状態変化を管理するプログラミングをオブジェクト指向そのものだと誤解する人がいる。
非関数型すなわちオブジェクト指向そのものととらえるのは間違い。
関数型プログラミング ・・・ 「あるxに対応するyは常に一つにきまる」という、状態を持たない数学関数のようなものだけで答えを求める方法
オブジェクト指向とは?
肥大化したプログラミングのむつかしさを、「モノ」としてイメージして、優しくできないかという試み
カプセル化
カプセル化 ・・・ 関連性の高い知識群を一つのオブジェクトに閉じ込める事
オブジェクト指向では、変数と処理を同時に一度に、オブジェクトという概念にまとめる。
デメテルの法則
デメテルの法則 ・・・ カプセル化により関心を分離すること
自分の隣の隣のクラスに聞くことは、デメテルの法則に反する。
せっかく隠蔽されているはずの情報を掘り起こすな。
パッケージの原則
全再利用の原則(CRP)と 閉鎖性共通の原則(CCP)を満たしているもの
凝集度が高い ・・・ パッケージには関係の弱いものを含み過ぎず、かつ、関係があるものを十分に含んでいるもの
委譲
委譲 ・・・ オブジェクトが一部の処理を別のオブジェクトに肩代わりさせる仕組みのこと
委譲された側は、全体を俯瞰した目的から距離を置くほうが詳細に集中できる。たとえると、自動車のエンジン開発は、どんな車体を動かすかという目標があるのを知りつつ、車体やフォルムとは無関係に目標の性能を出せる回転効率に集中して送る。
ダックタイピング
利用者の文脈で十分にアヒルに見えるのなら、鳥ですらないアヒルのおもちゃでもアヒルとみなしていいというものです。
function makeItQuack(animal) {
animal.quack(); // quackメソッドさえあればOK!
}
animal が Duck クラスでも ToyDuck クラスでも、quack() メソッドがあれば問題なしである。
class Duck {
quack() {
console.log("ガーガー!");
}
}
class ToyDuck {
quack() {
console.log("ピーピー!");
}
}
makeItQuack(new Duck()); // => ガーガー!
makeItQuack(new ToyDuck()); // => ピーピー!
型じゃなくて「quack()できること」が大事である。
静的型言語ではクラスを指定するが、動的型言語では、ふるまいで判断する。
Discussion