Clean Architecture Part III ch9 LSP: The Liskov Substitution Principle

Clean Architectureデザインパターン勉強メモ

出典: 

LSP: The Liskov Substitution Principle

  • 置換可能性

    • o1: S
    • o2: T
    • P —> T
    • SがTのサブタイプならば、o2の代わりにo1を使ってもPの振る舞いは変わらない
  • 基底型と派生型の間に成り立っていなければならない性質

    • 【補】プログラミング言語機構の「継承」は必ずしもこれを保証しない(後述)

Guiding The Use of Inheritance

  • LSPを満足している例
  • LSPを満足している例
  • Billingクラスはいずれの派生型にも依存していない
  • PersonalLicense, BusinessLicenseはいずれもLicenseと置換可能

The Square/Rectangle Problem

  • LSPを満足していない例
  • LSPを満足していない例

    • Rectangle: 幅高さ別々に設定できる
    • Square: 幅高さ別々に設定できない
  • 置換不可能なので、利用側は型情報で分岐するほかない

    • 【補】汎化できないということ
  • 【所感】汎化はできないことがわかったところで、Rectangleの実装をSquareに再利用したいときはこうするのがよいのかな
  • 継承ではなく集約

LSP and Architecture

  • OO黎明期、LSPは「継承の使い方のガイド」だった
  • やがて、「インタフェースの実装」についての、より広範な原則に変容した
  • クラスよりも高水準なソフトウェア構造に対しても適用可能

      • RESTインタフェース
      • アーキテクチャ
    • 共通点

      • 利用者がある
      • 利用者はwell-definedなインタフェースに依存している
      • 利用者は、インタフェースの実装が置換可能であることに依存している

Example LSP Violation

  • 置換不可能だとどうなる
  • Special Caseが必要になる

    • error-prone
    • 肥大化する

Conclusion

  • LSPはアーキテクチャレベルにも拡張可能であるし、すべき
  • LSPに違反するとSpecial Caseやそれを扱うための余計なメカニズムが必要になる

英語

  • pertain

    • …に関する、つきものである