オブジェクト指向

オブジェクト指向

執筆済 ソフトウェア開発設計

データと、それを操作する手続きをまとめる考え方。

4 つの要素#

要素 内容
カプセル化 内部を隠し、公開された操作だけで触らせる
継承 既存の型を拡張する
多態性 同じ呼び出しが型に応じて違う動作をする
抽象化 本質だけを表に出す

最も重要なのはカプセル化#

内部を隠すことで、 内部を自由に変えられる(外に影響しない)。

公開された操作 = 変えられない契約
内部の実装     = いつでも変えてよい

公開範囲を狭くするほど、後から変更できる余地が広がる。

多態性と依存の逆転#

swift
protocol Storage { func save(_ d: Data) }

final class Service {
    let storage: Storage        // 具体的な実装を知らない
    init(storage: Storage) { self.storage = storage }
}

ServiceStorage という抽象にだけ依存する。 ファイルにも 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
ノート一覧を閉じる