🍊

Rubyでさらっと学ぶSOLID原則③「リスコフの置換原則」

2021/10/10に公開

SOLID原則とは

ソフトウェアの拡張性や保守性を高めるための下記5つの原則のこと。

リスコフの置換原則(LSP)とは

「子クラスは親クラスと置換可能でなければいけない」という原則。

言い換えると、

  • 子クラスでオーバーライドしたメソッドは、親クラスのメソッドと同様の引数を取り、同じ型の返り値を返さなければいけない。
  • 親クラスで例外を返さないにも関わらず、子クラスで例外を返してはいけない。

リスコフの置換原則に違反している例

class Animal
  def cry
    'えーん'
  end
end

class Human < Animal
  # OK
  def cry
    'えーんえーん'
  end
end

class Dog < Animal
  # NG(返り値の型が親クラスと異なる)
  def cry
    1
  end
end

class Fish < Animal
  # NG(子クラスで例外を発生させている)
  def cry
    raise StandardError, '魚は泣けません'
  end
end

リスコフの置換原則違反に気付くための質問

  • 子クラスでオーバーライドしたメソッドが親クラスと同様の引数を取っているか?
  • 子クラスでオーバーライドしたメソッドが親クラスと同様の型の返り値を返しているか?
  • 子クラスでオーバーライドしたメソッド内で例外を返していないか?

参考文献

Discussion