上面,我們有一個名為 userService 的架構。它有兩個屬性:db,負責與關聯式資料庫通訊;amqpChannel,支援與 RabbitMQ 訊息服務通訊。
UserService 實作了一個名為 Create 的方法。在此方法中,我們將接收到的使用者資訊儲存在資料庫中,然後將資料發佈到 RabbitMQ。
可見userService中Create方法的職責不只是一個,而是兩個:在資料庫中儲存資訊和在RabbitMQ佇列中發布訊息。
這可能會導致幾個問題,例如:
在下面的程式碼中,我們修改結構以尊重 SRP。一探究竟:
請注意,我們已將職責分為三個不同的部分:儲存庫UserRepository 將使用者儲存到資料庫,發布者UserPublisher 將訊息傳送到RabbitMQ,以及服務UserService 協調這兩個操作。
這樣,每個組件負責特定的、獨立的任務,方便代碼的維護和演進,此外還允許這些部分中的每一個被替換或改進而不影響其他部分。例如,如果需要變更所使用的資料庫,只需更換儲存庫即可。如果需要改變傳播形式,只需更換發布者即可。
值得一提的是,執行兩個不同的任務和委派其執行之間存在細微的差異。在userService.Create的原始範例中,在一個地方執行了兩個操作,違反了單一責任原則。重構後,我們將執行委託給不同的結構體,Create 方法只負責協調這個流程。
為了在此範例中應用 SRP,我們最終也實施了其他一些 SOLID 原則:
在本系列的下一篇文章中,我將透過具體範例對它們進行更詳細的解釋。
再見,夥計們!
參考:
SOLID:物件導向設計的前 5 個原則
Clean Coder 部落格 - 單一職責原則
在軟體開發領域,SOLID原則告訴我們如何組織函數和數據,以便我們的程式碼:
術語 SOLID 是五個設計假設的縮寫,如下所述:
(S) 單一職責原則:「一個模組必須有且只有一個改變的理由」
(O) 開放/封閉原則:「軟體工件必須對擴充開放,但對修改關閉」
(L)里氏替換原則:「衍生類別必須可以被其基底類別取代」
(一)介面隔離原則:「不應該強迫一個類別實現它不會使用的介面和方法」
(D) 依賴倒置原則:「依賴抽象而非實現」
SOLID 是為物件導向程式設計而設計的,眾所周知,GoLang 並不是採用這種範式的語言。但是,我們可以使用它提供的資源來滿足 OOP 方法。例如,Go 沒有繼承支持,但這個想法可以透過其組合支持來補償。類似地,可以使用介面創建一種多態性。
在這篇文章(共 5 篇文章中的第一篇)中,我打算透過與我們日常遇到的情況接近的範例來詳細說明第一個原則。
我們已經知道這個術語的含義,現在是時候學習如何在 GoLang 中實現它了。
在這種語言中,我們可以將這一原則定義為“一個函數或類型必須有一項且僅有一項工作,以及一項且僅有一項責任”,讓我們看下面的程式碼:
上面,我們有一個名為 userService 的架構。它有兩個屬性:db,負責與關聯式資料庫通訊;amqpChannel,支援與 RabbitMQ 訊息服務通訊。
UserService 實作了一個名為 Create 的方法。在此方法中,我們將接收到的使用者資訊儲存在資料庫中,然後將資料發佈到 RabbitMQ。
可見userService中Create方法的職責不只是一個,而是兩個:在資料庫中儲存資訊和在RabbitMQ佇列中發布訊息。
這可能會導致幾個問題,例如:
在下面的程式碼中,我們修改結構以尊重 SRP。一探究竟:
請注意,我們已將職責分為三個不同的部分:儲存庫UserRepository 將使用者儲存到資料庫,發布者UserPublisher 將訊息傳送到RabbitMQ,以及服務UserService 協調這兩個操作。
這樣,每個組件負責特定的、獨立的任務,方便代碼的維護和演進,此外還允許這些部分中的每一個被替換或改進而不影響其他部分。例如,如果需要變更所使用的資料庫,只需更換儲存庫即可。如果需要改變傳播形式,只需更換發布者即可。
值得一提的是,執行兩個不同的任務和委派其執行之間存在細微的差異。在userService.Create的原始範例中,在一個地方執行了兩個操作,違反了單一責任原則。重構後,我們將執行委託給不同的結構體,Create 方法只負責協調這個流程。
為了在此範例中應用 SRP,我們最終也實施了其他一些 SOLID 原則:
在本系列的下一篇文章中,我將透過具體範例對它們進行更詳細的解釋。
再見,夥計們!
參考:
SOLID:物件導向設計的前 5 個原則
Clean Coder 部落格 - 單一職責原則
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3