iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0

LSP 里氏替換原則

  • 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


ISP 介面隔離原則

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 就違反了原則。


這兩個原則都是在跟我們說不要去寫高耦合的程式碼,將依賴降到最低,程式碼才有良好的可維護性


上一篇
Day22 - S.O.L.I.D 原則
下一篇
Day 24 - S.O.L.I.D 原則 part 3
系列文
React Clean Code And Unit Tests - 利用測試寫出人類看得懂的React程式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言