- If S is a subtype of T, then objects of type T may be replaced with objects of type S, without breaking the program.
- Functions that use pointers of references to base classes must be able to use objects of derived classes without knowing it.
子型態必須遵從父型態的行為
//父型態
class Shape {
get area() {
return 0;
}
}
//子型態
class Rectangle extends Shape {
constructor(length, width) {
super();
this.length = length;
this.width = width;
} get area() {
return this.length * this.width;
}
}
由於我們在寫 JS 或 React 的時候通常不會使用到繼承,大部分是靠 props,所以自然就形成了對於 Component 功能的保護,不容易被修改破壞。基本上就有遵循里氏替換原則,所以我們就不太深入去探討 LSP
No client should be forced to depend on methods it does not use.
介面隔離原則其實並不困難。模組之間的依賴不應該有用不到的功能,我們可以透過介面來進行分割,把模組分得更合符本身的角色,也讓使用介面的角色只能分別接觸到應有的功能。
也就是說不要一個介面提供一堆功能。
// 違反 ISP
const rectangle = {
area: function() {
//...
},
draw: function() {
//...
}
};
const geometryApp = {
getLargestRectangle: function(rectangles) {
//...
}
};
以這個例子來說,在geometryApp的getLargestRectangle ,他只需要用到 rectangle 中的 area(),但他其實用不到 rectangle 中的 draw 就違反了原則。
這兩個原則都是在跟我們說不要去寫高耦合的程式碼,將依賴降到最低,程式碼才有良好的可維護性