リスコフの置換原則
from Clean Architecture 達人に学ぶソフトウェアの構造と設計
リスコフの置換原則
ここで望まれるのは、次に述べるような置換可能な性質である:S 型のオブジェクト o1 の各々に、対応する T 型のオブジェクト o2 が 1 つ存在し、T を使って定義されたプログラム P に対して o2 の代わりに o1 を使っても P の振る舞いが変わらない場合、S は T の派生型であると言える。
『アジャイルソフトウェア開発の奥義 第 2 版』(SB クリエイティブ)より引用
リスコフの置換原則は継承(インターフェース)を使えば素朴に達成できるように思えるが、プログラムの仕様、意味的にも違反してないか確認する必要がある
正方形・長方形問題
長方形クラスを継承(実装)した正方形クラスが存在し、長方形型を操作するユーザクラスが存在するとする。このときユーザクラスが長方形であるという知識で派生型である正方形クラスを操作すると正方形クラスに暗黙的に追加されている「4つの辺の長さが全て等しい」という制約に違反する場合がある。このとき正方形クラスはリスコフの置換原則を満たせていない。
ユーザクラスが扱っている長方形クラスが正方形であるか確認すればワークアラウンドにはなるが、これはユーザクラスが特定の派生型に依存してしまう(折角インターフェースを導入して依存性を逆転させたのに!)のでダメな対処法である
avashe.iconpythonとかでダックタイピングしてるというのに入って来た値の型をチェックしなければならないことってあるよね、あれはリスコフの置換原則に違反したやり方であり、アーキテクチャ的に改善すべき点があることを示唆している
この原則はクラスだけではなく、アーキテクチャの至る所、RESTfulサービスの呼び出し方などにも適用できる
URIが全体で一貫したものなら素朴に呼び出せるが、1つでも特殊なURIの組み立て方が仕様に追加されると、この特殊な組み立て方を汎用的に扱う仕組みが必要になる