Day16-SOLID原則-單一職責原則(Single Responsibility Principle)

什麼是SOLID原則

SOLID原則分別是針對物件導向的五個設計原則取其第一個字母的縮略詞

  • Single-responsibility principle (SRP) 單一職責原理
  • Open–closed principle (OCP) 開閉原則
  • Liskov substitution principle (LSP) 里氏替換原則
  • Interface segregation principle (ISP) 介面隔離原則
  • Dependency inversion principle (DIP) 依賴反向原則

為什麼需要SOLID原則:

工程師的職責就是把指定的功能使用程式碼去實現。雖然很多時候迫於時間的壓力或是其他外部因素,可能都是先求有再求好。先求可以實現功能,再求可穩定運作且可維護。

一開始的時候,對於求有這件事情或許多工程師不會太難。但是對於求好這件事情就會感到比較困難。畢竟什麼是好,這個好的不同人有不同的想法。

但大抵而言,大家追求的好差不多就是這幾件事情:

  • 程式碼功能清晰
  • 程式碼架構清晰
  • 程式碼易於維護
  • 程式碼易於修改

針對求好這件事,可以參考SOLID原則,提出一點想法。

單一職責原理

一個功能類別應該只有單一職責

假設有一個功能是要寄信有啟用的客戶。

程式碼如下:

function sendMailToActiveClients(clients) {
   clients.forEach(client=>{
        if(client.isActive){
            sendMail(client)
        }
   })
}

上面的程式碼用白話文來說就是: 對客戶列表跑迴圈,如果客戶是有啟用的,則寄信給客戶

從白話文可以知道這個功能做了這幾件事情:

  • 尋找有啟用的客戶
  • 寄信給客戶

這個功能做了兩件事情,和單一職責原則不符合,應該讓一個功能只有一個職責,所以依照單一職責原則重新改寫一下程式碼:

function sendMailToActiveClients(clients) {
    const activeClients=getActiveClient(clients)
    activeClients.forEach(client=>{
        snedMail(client)
    })
}

function getActiveClient(clients) {
    const activeClient=clients.filter(client=>client.isActive)
    return activeClient
}

改寫過後的程式碼將尋找有啟用的客戶和寄信給客戶兩件事情分開。一次只做一件職責的事情

單一職責原則的優點

提升可讀性與維護性

因為一個功能只做一件事情,所以可以很清楚明白這個功能在做什麼事情。也因為只做一件事情,所以程式碼可以縮短許多,比較簡短也更容易閱讀。

更容易閱讀也意味著更容易維護,因為知道在做什麼,目的也很明確

減少修改影響的範圍

因為職責單一,功能也就單一,所以修改的時候可以更清楚影響的範圍在哪裡,影響的範圍也比較小。

如果職責不夠單一,裡面包含一個以上的功能,常常會發生很多不在預期範圍內的影響,例如改A功能影響B功能,修改好B功能後,反而換C、D功能壞掉。

只要職責更單一,就可以大幅降低修改的成本和影響