iT邦幫忙

2021 iThome 鐵人賽

DAY 5
1
自我挑戰組

馬克的軟體架構小筆記系列 第 5

30-5 之軟體架構設計原則 4 - ISP 介面隔離原則

  • 分享至 

  • xImage
  •  

軟體架構設計原則一切都是為了下面這兩點,別忘了。

  • 低耦合
  • 高內聚

這一篇文章我們將要來談談 ISP 介面隔離原則。

ISP ( Interface Segregation Principle ) 介面隔離原則是什麼呢 ?

它的定義如下 :

不應該強迫 client 依賴他們不需要的方法

這個原則事實上很好理解,重點我自已覺得可以條列成以下幾項 :

  • 一個 class 或 module 沒必要 public 就用 private
  • 設計 class 儘量使用 interface,並往『 它可以做什麼 』而不是以『 它是什麼 』來設計

然後在來想想,如果沒有這個原則可能會發生什麼事情呢 ?

  • client 可能會誤用它們不需要使用的方法,並且依賴不需要使用的東西

範例

這裡我們簡單說個平常應該不少人會用到的範例模式,就是一個 service 層的某個東東,裡面包了一大陀的方法,只要是和 Cart 購物車有關的都丟裡面。

// Bad
class CartService {
    add(product: any): void{
        console.log('A product add to cart')
    }

    remove(product: any): void{
        console.log('A product remove to cart')
    }

    checkout(): void {
        console.log('checkout the cart')
    }
}

const cartService = new CartService()
cartService.add('A')
cartService.remove('B')
cartService.checkout()
// Good
interface ICartItemOperator{
    add(product: any): void
    remove(product: any): void
}

interface ICartPurchase{
    checkout(): void
}

class CartService implements ICartItemOperator, ICartPurchase{
    add(product: any): void{
        console.log('A product add to cart')
    }

    remove(product: any): void{
        console.log('A product remove to cart')
    }

    checkout(): void {
        console.log('checkout the cart')
    }
}

const cartService: ICartItemOperator = new CartService()
cartService.add('A')
cartService.remove('B')

小總結

老樣子,來問一下三個問題,來加深記憶

這個知識點可以用來解釋什麼現象

事實上 ISP 原則讓我想到諜報組織的建立基礎,就是只讓需要知道情報的人知道它『 需要知道 』的情報,這也避免了某位情報人員知道人它不需要知道的情報,而發生無法預期的錯誤。

感覺這個 ISP 可以用在更多領域。

這個知識點可以和以前的什麼知識連結呢 ?

事實上我覺得 ISP 介面隔離原則,很接近 SRP 單一職則原則,記不記得 SRP 的定義為 :

一個 『 類別 』只有一個『 角色 』引起『 變化 』

這裡事實上可以將 client 當成『 角色 』也就是使用這個物件的地方,以上述範例 CartService 來看,它事實上可以分為兩種角色 :

  • 負責結帳購物車處理的角色
  • 負責操作新增與刪除的角色

那如果往這裡思考是不是,就感覺可以拆兩個呢 ? 不過這也只是我自已的想法。

我要如何運用這個知識點 ?

  • 我們平常寫了不少 service 與 util 是不是改考慮可以根據『 做什麼 』來切分了,而不是 model 是啥就是啥。例如 ArticleService 裡面就包了大大小小的文章方法。
  • 沒必要 public 就不要 public。

參考資料


上一篇
30-4 之軟體架構設計原則 3 - LSP 里氏替換原則
下一篇
30-6 之軟體架構設計原則 5 - DIP 依賴反向原則
系列文
馬克的軟體架構小筆記29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言