Skip to content

Instantly share code, notes, and snippets.

@kaisugi
Last active March 29, 2019 09:09
Show Gist options
  • Save kaisugi/361ef6e7a838859deb9bd03254ba03ac to your computer and use it in GitHub Desktop.
Save kaisugi/361ef6e7a838859deb9bd03254ba03ac to your computer and use it in GitHub Desktop.
オブジェクト指向設計実践ガイド

SOLID則

  • 単一責任(Single Responsibility)
  • オープン・クローズド(Open-Closed)
  • リスコフの置換(Liskov Substitution)
  • インターフェース分離(Interface Segregation)
  • 依存性逆転(Dependency Inversion)

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

TRUE なコード

  • 見通しが良い(Transparent) 変更がもたらす影響が明白
  • 合理的(Reasonable) 変更によってそのコストに値する利益が得られる
  • 利用性が高い(Usable) 新しい環境、予期していなかった環境でも再利用できる
  • 模範的(Exemplary) コードに変更を加える人が上記の品質を自然に保てるようになっている

クラスを単一責任にさせ、余計な責任は隔離する

依存関係を管理する

  • 依存性の注入(依存オブジェクトの注入)

クラスの定義の中に別のクラスのインスタンスを含めるのではなく、クラスの初期化時の引数にインスタンスを含める

  • 依存性の隔離

クラスの定義の中に別のクラスのインスタンスを含める時は、initializeのような初期化メソッドの中に含めて他のメソッドと区別したり、新たにメソッドを作ってその中に閉じ込めたりする

  • 引数の順番への依存を取り除く

引数を連想配列にする

  • 依存関係をうまく選択する

場合によっては依存関係を逆転させた方がいいかもしれない
より変更の少ないものへ依存させることが重要

柔軟なインターフェース

クラス内に実装されるメソッドのうち外部のオブジェクトに使われるものがパブリックインターフェースを構成する
パブリックインターフェースはクラスの主要な責任を明らかにするもので、気まぐれに変更されないことやテストが書かれることが想定される。対照的に、プライベートインターフェースはどんな理由でも変更されうるもので、テストが書かれない場合もある。

パブリックインターフェースは「どのように」よりも「何を」になっている。

デメテルの法則

「直接の隣人にのみ話しかけよう」
いくつものドットを含むメッセージチェーンにならないようにする

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment