🍊
Rubyでさらっと学ぶSOLID原則③「リスコフの置換原則」
SOLID原則とは
ソフトウェアの拡張性や保守性を高めるための下記5つの原則のこと。
- S(Single-responsibility principle): 単一責任の原則
- O(Open-closed principle): オープン・クローズドの原則
- L(Liskov substitution principle): リスコフの置換原則
- I(Interface segregation principle): インターフェース分離の原則
- D(Dependency inversion principle): 依存性逆転の原則
リスコフの置換原則(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