Liskov Substitution Principle (LSP) はオブジェクト指向設計の基本原則であると聞きました。それはどのようなもので、どのような使用例がありますか?
ベストアンサー1
LSP を説明する素晴らしい例 (最近聞いたポッドキャストで Uncle Bob が挙げたもの) は、自然言語では正しく聞こえるものが、コードではうまく機能しないことがあるというものでした。
数学では、 aSquare
は ですRectangle
。実際、これは長方形の特殊化です。「 である」という表現から、これを継承でモデル化したいと考えるでしょう。しかし、コード内で をSquare
から派生させた場合Rectangle
、Square
が期待される場所であればどこでも を使用できるはずですRectangle
。これにより、奇妙な動作が発生します。
基底クラスにSetWidth
とメソッドがあると想像してください。これは完全に論理的に思えます。しかし、参照が を指している場合、と は意味をなしません。一方を設定すると、もう一方もそれに合わせて変更されるからです。この場合、で Liskov Substitution Test に失敗し、を継承するという抽象化は不適切です。SetHeight
Rectangle
Rectangle
Square
SetWidth
SetHeight
Square
Rectangle
Square
Rectangle
皆さんも他のプライスレスもチェックしてみてくださいモチベーションを高めるポスターで説明する SOLID 原則。