LoginSignup
6
6

More than 5 years have passed since last update.

技術書評「オブジェクト指向設計実践ガイド」

Posted at

9784774183619.jpg

「オブジェクト指向設計実践ガイド」 Sandi Metz 著,髙山泰基 訳

感想

  • オススメ度 5/5
  • ある程度railsで開発慣れてきたけど、設計で行き詰ることが多くなってきたときに読んだ
  • その後の設計の指針になることが多く書いてあった
    • 「どのクラスになにをしてもらうかから設計を考える」とか

メモ

1章. オブジェクト指向設計

  • 少しずつ形になるように実装していく(Agile的)
  • ゴールは変更しやすいアプリケーション設計をすること

2章. 単一責任のクラスを設計する

  • クラスは一文で説明できるように

3章. 依存関係を管理する

  • hash.fetch使うと便利
  • 疎結合なコードを書く(依存オブジェクトの注入)
  • 自分よりも変更されないものに依存する

4章. 柔軟なインターフェースをつくる

  • 設計方針: 「このメッセージを送る必要があるけど、だれが応答すべきか」という考え方
  • メッセージを送るためにオブジェクトは存在する
  • メソッドは"どのように”よりも”なにを"

5章. ダックタイピングでコストを削減する

6章. 継承によって振る舞いを獲得する

7章. モジュールでロールの振る舞いを共有する

  • ロール(実装クラス)が RoleA.class, RoleB.class, RoleC.classがある場合、インターフェースとなるHogerable.moduleを実装して、各ロールにincludeさせてあげると、使うほうは使いやすい
  • 抽象スーパークラス内のコードを使わないサブクラスはあってはいけない
  • typeで分岐して処理が呼ばれるとか、classで分岐して処理が呼ばれる場合は、ロール実装を考える
  • 継承する側でsuperを呼び出すのは避ける
    • Parent#hoge{ local_hoge()} として、Chile.#local_hogeを実装するほうがいい
  • 改装構造を浅くする

8章. コンポジションでオブジェクトを組み合わせる

  • コンポジション
    • メリ: 構造的に独立する。見通しよくなる。
    • デメ: 明示的にメッセージ移譲をする必要がある(コスト)
  • 継承
    • メリ: シームレスに移譲する。サブクラスの実装はやい。
    • デメ: 親クラスの変更コストが高い。親クラスが思ってないような使われ方される可能性あり。
  • 迷ったときはコンポジション
    • 依存度を下げられるので
  • is-a => 継承
    • is-a => …の一種 A, B, Cが子の場合。A+B+Cで親になる。
  • behaves-like-a => Mixin
  • has-a => コンポジション
    • has-a => …に含まれる A, B, Cが子のの場合。A+B+Cより親のが大きい。

9章. 費用対効果の高いテストを設計する

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6