首頁 後端開發 Golang Princípios SOLID em GoLang - 單一職責原則 (SRP)

Princípios SOLID em GoLang - 單一職責原則 (SRP)

Jul 29, 2024 pm 12:07 PM

在軟體開發的世界中,SOLID 原則告訴我們如何組織函數和數據,以便我們的程式碼:

  • 容忍變化
  • 簡單易懂
  • 成為可在許多軟體系統中使用的組件的基礎

術語「SOLID」是五個設計假設的縮寫,如下所述:

(S) 單一職責原則:「一個模組必須有一個且只有一個改變的理由」
()開放/封閉原則:「軟體工件必須對擴充開放,但對修改關閉」
(L) 里氏替換原則:「衍生類別必須可以被其基底類別取代」
(I) 介面隔離原則:「不應強迫類別實作它不會使用的介面與方法」
(D) 依賴倒置原則:「依賴抽象而不是實現」

SOLID 和 Go 語言

Princípios SOLID em GoLang - Single Responsability Principle (SRP)

SOLID 是為物件導向程式設計而設計的,眾所周知,GoLang 並不是採用這種範式的語言。但是,我們可以使用它提供的資源來滿足 OOP 方法。例如,Go 沒有繼承支持,但這個想法可以透過其組合支持來補償。類似地,可以使用介面創建一種多態性。

在這篇文章(共 5 篇文章中的第一篇)中,我打算透過與我們日常遇到的情況接近的範例來詳細說明第一個原則。

單一職責原則(SRP)

我們已經知道這個術語的含義,現在是時候學習如何在 GoLang 中實現它了。
在這種語言中,我們可以將這一原則定義為“一個函數或類型必須有一項且僅有一項工作,以及一項且僅有一項責任”,讓我們看下面的程式碼:

上面,我們有一個名為 userService 的結構。它有兩個屬性:db,負責與關係資料庫通信,以及 amqpChannel

,它支援與 RabbitMQ 訊息服務通訊。


UserService 實作了一個名為 Create 的方法。在此方法中,我們將接收到的使用者資訊儲存在資料庫中,然後將資料發佈到 RabbitMQ。

可見userService中Create方法的職責不只是一個,而是兩個:在資料庫中儲存資訊和在RabbitMQ佇列中發布訊息。

這可能會導致幾個問題,例如:
  • 難以維護:如果其中一項需求發生變化,例如使用者資料的序列化方式,你將不得不修改Create方法的邏輯,即使這與你的主要職責無關,即將資料保存到資料庫中。
  • 測試難度:由於 Create 方法有兩個不同的職責,您必須為每個方法建立測試,這可能很困難且費力。
  • 不必要的耦合:將使用者資料發佈到 RabbitMQ 佇列的邏輯完全獨立於將該資料儲存到資料庫的邏輯。在同一個方法中混合這兩個職責會產生不必要的耦合。

在下面的程式碼中,我們修改了結構以遵守 SRP。看看:

請注意,我們已將職責分為三個不同的部分:儲存庫UserRepository 將使用者儲存到資料庫,發布者UserPublisher 向RabbitMQ 發送訊息,以及服務UserService 協調這兩個操作。

這樣,每個組件都負責特定的、獨立的任務,方便代碼的維護和演化,並且允許每個部分被替換或改進而不影響其他部分。例如,如果需要變更所使用的資料庫,只需更換儲存庫即可。如果需要改變溝通方式,只需更換發布者即可。

值得注意的是,執行兩個不同的任務和委託執行之間存在細微的差異。在原來的 userService.Create 範例中,在一個地方執行了兩個操作,違反了單一責任原則。重構後,我們將執行委託給不同的結構體,Create 方法只負責協調這個流程。

為了在這個範例中應用 SRP,我們最終也實作了其他一些 SOLID 原則:

  • 介面隔離原則 (ISP):每個介面代表一個職責。 UserRepository 和 UserPublisher 都是只有一個方法的接口,每個方法代表一個職責。
  • 依賴倒置原則(DIP):userService 結構依賴抽象(介面)而不依賴於具體實現,也就是說,它不知道UserRepository 和UserPublisher 的具體實現,只知道他們實現的接口。
  • 開放/封閉原則 (OCP):程式碼開放用於擴展,因為可以輕鬆添加新的儲存庫或發布者,而無需修改 userService。

在本系列的下一篇文章中,我將透過具體範例對它們進行更詳細的解釋。

再見,夥伴們!

參考文獻:
SOLID:物件導向設計的前 5 個原則
Clean Coder 部落格 - 單一職責原則

以上是Princípios SOLID em GoLang - 單一職責原則 (SRP)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
<🎜>掩蓋:探險33-如何獲得完美的色度催化劑
2 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1677
14
CakePHP 教程
1430
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
Golang vs. Python:性能和可伸縮性 Golang vs. Python:性能和可伸縮性 Apr 19, 2025 am 12:18 AM

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

Golang和C:並發與原始速度 Golang和C:並發與原始速度 Apr 21, 2025 am 12:16 AM

Golang在並發性上優於C ,而C 在原始速度上優於Golang。 1)Golang通過goroutine和channel實現高效並發,適合處理大量並發任務。 2)C 通過編譯器優化和標準庫,提供接近硬件的高性能,適合需要極致優化的應用。

開始GO:初學者指南 開始GO:初學者指南 Apr 26, 2025 am 12:21 AM

goisidealforbeginnersandsubableforforcloudnetworkservicesduetoitssimplicity,效率和concurrencyFeatures.1)installgromtheofficialwebsitealwebsiteandverifywith'.2)

Golang vs.C:性能和速度比較 Golang vs.C:性能和速度比較 Apr 21, 2025 am 12:13 AM

Golang適合快速開發和並發場景,C 適用於需要極致性能和低級控制的場景。 1)Golang通過垃圾回收和並發機制提升性能,適合高並發Web服務開發。 2)C 通過手動內存管理和編譯器優化達到極致性能,適用於嵌入式系統開發。

Golang vs. Python:主要差異和相似之處 Golang vs. Python:主要差異和相似之處 Apr 17, 2025 am 12:15 AM

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。Golang以其并发模型和高效性能著称,Python则以简洁语法和丰富库生态系统著称。

Golang和C:性能的權衡 Golang和C:性能的權衡 Apr 17, 2025 am 12:18 AM

Golang和C 在性能上的差異主要體現在內存管理、編譯優化和運行時效率等方面。 1)Golang的垃圾回收機制方便但可能影響性能,2)C 的手動內存管理和編譯器優化在遞歸計算中表現更為高效。

表演競賽:Golang vs.C 表演競賽:Golang vs.C Apr 16, 2025 am 12:07 AM

Golang和C 在性能競賽中的表現各有優勢:1)Golang適合高並發和快速開發,2)C 提供更高性能和細粒度控制。選擇應基於項目需求和團隊技術棧。

Golang vs. Python:利弊 Golang vs. Python:利弊 Apr 21, 2025 am 12:17 AM

Golangisidealforbuildingscalablesystemsduetoitsefficiencyandconcurrency,whilePythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.Golang'sdesignencouragesclean,readablecodeanditsgoroutinesenableefficientconcurrentoperations,t

See all articles