オブジェクト指向
データと、それを操作する手続きをまとめる考え方。
4 つの要素#
| 要素 | 内容 |
|---|---|
| カプセル化 | 内部を隠し、公開された操作だけで触らせる |
| 継承 | 既存の型を拡張する |
| 多態性 | 同じ呼び出しが型に応じて違う動作をする |
| 抽象化 | 本質だけを表に出す |
最も重要なのはカプセル化#
内部を隠すことで、 内部を自由に変えられる(外に影響しない)。
公開された操作 = 変えられない契約
内部の実装 = いつでも変えてよい公開範囲を狭くするほど、後から変更できる余地が広がる。
多態性と依存の逆転#
swift
protocol Storage { func save(_ d: Data) }
final class Service {
let storage: Storage // 具体的な実装を知らない
init(storage: Storage) { self.storage = storage }
}Service は Storage という抽象にだけ依存する。
ファイルにも DB にもクラウドにも差し替えられ、
テストではモックを渡せる。
多態性は、依存の向きを反転させる道具として最も価値がある。
継承の問題#
| 問題 | 内容 |
|---|---|
| 密結合 | 親の内部実装に子が依存する |
| 脆い基底クラス | 親を直すと子が壊れる |
| 深い階層 | 振る舞いがどこにあるか追えない |
| 単一継承 | 1 つしか選べない |
**「継承より合成」**が現代の指針。 プロトコルと 拡張で必要な機能を組み合わせる。
誤解されやすい点#
Alan Kay が当初考えていたのは、 クラスや継承ではなく オブジェクト間のメッセージ送信だった。
現在「オブジェクト指向」と呼ばれるものは Simula 系のクラスベースの流れが主流で、 元の構想とは重なりつつずれている。
参考文献#
- Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1994.
- Alan Kay. The Early History of Smalltalk. ACM HOPL-II, 1993. https://doi.org/10.1145/154766.155364
- Barbara Liskov, Jeannette Wing. A behavioral notion of subtyping. ACM TOPLAS 16(6), 1994. https://doi.org/10.1145/197320.197383