LSK - Liskov置換原理


Liskov代用原理は、固体の一部であり、5つの設計原理の合計を束ねるニーモニック頭字語です.
これはしばしばクリーンコードに関連付けられます.
しかし、それは正確には、それはあなたにとって重要であり、あなたも気にする必要がありますか?

どのような状態ですか?

If S is a subtype of T, then objects of type T may be replaced with may be replaced with objects of type S without altering any of the desirable properties of the program (correctness, task performed, etc.).


複雑な、右の音?
しかし、それはより単純な定義に煮詰めることができます:

Software (systems) should be built from interchangeable parts.
Those parts should agree on a common contract, which enables those parts to be substituted one for another.


多分それは簡単ではないかもしれませんが、さらに一歩進めて、JavaScriptの観点から見てみましょう.
✅ 基底クラスのメソッドをオーバーライドするサブクラスのメソッドは、同じ引数
✅ オーバーライドメソッドの各引数は基本クラスのメソッドと同じ型でなければなりません
✅ ベースメソッドをオーバーライドするメソッドの戻り値の型は、同じ型
✅ 基底クラスが行う例外と同じ型をスローする必要があります

いくつかの例
正確にLSPがすべてについてのより良い理解を得るために、あなたは原則の違反を示す以下の例を見てみることができます.

例1
この例では、LSPFriendlyGreeter greetメソッドに別のパラメータを追加します.
class Greeter {
  greet(name) {
    return `Hello, ${name}!`;
  }
}

class FriendlyGreeter extends Greeter {
  greet(name, age) {
    return `Hello, ${age} year old ${name}, have a nice day!`;
  }
}

例2
この例では、サブクラスPenguin ベースクラスで知られていないエラーをスローし、Bird クラス.
この問題は、より明白なものの1つですが、それは実際にLSPの一般的な違反です!
class Bird {
  fly() {
    return "I'm flying!";
  }
}

class Penguin extends Bird {
  fly() {
    throw new Error("I wish I could but I can't. :(");
  }
}

何を防ぐためにしようとすると?
原則は、驚くべき行動からあなたとあなたのユーザーを保護しようとします.
そして、これが何につながるか知っていますか
あなたやライブラリクリエイターは、ベースのロジックを作成することができます契約に依存!
この規約では、パラメータ、戻り値の型、エラーの発生を指定します.
そして、これらのすべてを手にすると、実際には、この==>何も、より少ない何かを扱う論理を実装することができます.
base論理を書く誰かがそれを指定するならCannotDoError を呼び出すことができます.このエラーは、その論理を使用している場合や、それから派生したエラーを扱う必要があります.
ユーザーが契約に同意する限り、彼らはあなたの側から予想外の振舞いにどんな問題も持ちません.
そして、これはかなり素晴らしいです、あなたのソフトウェアが予想通りに働くので!

あなたは気にする必要がありますか?
ああはい、あなたは!
誰も驚かない信頼性と拡張性の高いソフトウェアを構築するあなたの主要な目標である必要があります.
これらのすべては、開発速度につながる速度は、より頻繁に出荷されている機能につながる!

去る前に
あなたが私のコンテンツが好きならば、私を訪ねてください、そして、おそらく、あなたはあなたが見るものが好きです!