🫣

SOLIDについて書き記していくだけ#3

2024/05/04に公開

Liskov substitution principle : リスコフの置換原則

オブジェクト指向プログラミングにおいて、サブタイプのオブジェクトはスーパータイプのオブジェクトの仕様に従わなければならない
 (Wikipediaより)

簡単に言うと
→ 継承を行う時には継承元のクラスと継承先のクラスの振る舞いを同じにしよう!!

リスコフの置換原則は、基底型からの派生型の定義に際して、以下の項目の順守を提唱している。

  1. 事前条件(preconditions)を、派生型で強めることはできない。派生型では同じか弱められる。
  2. 事後条件(postconditions)を、派生型で弱めることはできない。派生型では同じか強められる。
  3. 不変条件(invaritants)は、派生型でも保護されねばならない。派生型でそのまま維持される。
  4. 基底型の例外(exception)から派生した例外を除いては、派生型で独自の例外を投げてはならない。

事前条件とは?
メソッドの開始時に保障されるべき条件の表明
扱えるクラスなどの条件

事後条件とは?
メソッド正常終了時に保証されるべき条件
例えば、足し算メソッドであれば、「二つの値を足した値が返ってくる」と言うのが事後条件

不変条件とは?
クラスが持つ公開された各メソッドの開始時と正常終了時に共通して保証されるべき状態についての条件

上で述べられている4つの条件はリスコフの置換原則を守る為のチェック項目だと考えられるので、強く意識するのは継承先と継承元を入れ替えても動くかどうかということ

目的

コードの理解しやすさ、書きやすさを維持するため
→ 保守性が上がる

もし、LSPに違反している場合、クラスを利用する側は継承先のクラスは同じように扱えないというのを確認したり意識しながら書くことになる(めんどくさいし分かりにくい)

Discussion