上面,我們有一個名為 userService 的架構。它有兩個屬性:db,負責與關聯式資料庫通訊;amqpChannel,支援與 RabbitMQ 訊息服務通訊。

UserService 實作了一個名為 Create 的方法。在此方法中,我們將接收到的使用者資訊儲存在資料庫中,然後將資料發佈到 RabbitMQ。
可見userService中Create方法的職責不只是一個,而是兩個:在資料庫中儲存資訊和在RabbitMQ佇列中發布訊息。

這可能會導致幾個問題,例如:

在下面的程式碼中,我們修改結構以尊重 SRP。一探究竟:

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

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

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

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

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

再見,夥計們!

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

","image":"http://www.luping.net","datePublished":"2024-07-29T22:18:29+08:00","dateModified":"2024-07-29T22:18:29+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Princípios SOLID em GoLang - 單一職責原則 (SRP)

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

發佈於2024-07-29
瀏覽:985

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

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

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

(S) 單一職責原則:「一個模組必須有且只有一個改變的理由」
(O) 開放/封閉原則:「軟體工件必須對擴充開放,但對修改關閉」
(L)里氏替換原則:「衍生類別必須可以被其基底類別取代」
(一)介面隔離原則:「不應該強迫一個類別實現它不會使用的介面和方法」
(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 部落格 - 單一職責原則

版本聲明 本文轉載於:https://dev.to/waliqueiroz/principios-solid-em-golang-single-responsability-principle-srp-af5?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Hexabot 設定與視覺化編輯教學:建立您的第一個 AI 聊天機器人
    Hexabot 設定與視覺化編輯教學:建立您的第一個 AI 聊天機器人
    聊天機器人愛好者大家好!在本教程中,我們將引導您完成設定和使用開源 AI 聊天機器人建構器 Hexabot 的過程。我們將首先克隆 GitHub 儲存庫、安裝依賴項並為 Hexabot 配置環境變數。您還將學習如何使用 Docker 啟動專案、存取管理面板以及使用視覺化編輯器建立聊天機器人流程。 ...
    程式設計 發佈於2024-11-02
  • mysql_fetch_row()、mysql_fetch_assoc() 和 mysql_fetch_array():您應該選擇哪一個?
    mysql_fetch_row()、mysql_fetch_assoc() 和 mysql_fetch_array():您應該選擇哪一個?
    mysql_fetch_row()、mysql_fetch_assoc() 和mysql_fetch_array() 解釋背景:[&SQL&]如果您正在使用已棄用的MyMy擴充功能中,在從結果集中檢索資料的mysql_fetch_row()、mysql_fetch_assoc() 和mysql_fe...
    程式設計 發佈於2024-11-02
  • Next.js - 概述
    Next.js - 概述
    本文作為初學者友好的指南和使用 Next.js 的步驟。 Next.js 是一個用於建立 Web 應用程式的靈活框架。相反,它是一個建立在 Node.js 之上的 React 框架。 設定您的 Next.js 專案 要啟動新的 Next.js 項目,您需要在電腦上安裝 Node.js。 安裝 ...
    程式設計 發佈於2024-11-02
  • 如何在程式碼中使用 Unsplash 圖片
    如何在程式碼中使用 Unsplash 圖片
    身為從事新 SaaS 專案的開發人員,我需要直接透過 URL 連結一些 Unsplash 圖片。 最初,我看到一篇推薦使用 https://source.unsplash.com/ API 的文章(連結)。但是,此方法不再有效,僅從 URL 欄位複製連結並不能提供嵌入所需的直接圖像 URL。 h...
    程式設計 發佈於2024-11-02
  • 如何合併關聯數組、處理缺失鍵、填滿預設值?
    如何合併關聯數組、處理缺失鍵、填滿預設值?
    合併多個關聯數組並添加具有預設值的缺失列將關聯數組與不同的鍵集組合起來創建統一的數組可能具有挑戰性。這個問題探索了一種實現此目的的方法,所需的輸出是一個數組,其中鍵被合併,缺失的列用預設值填充。 為了實現這一點,建議結合使用 array_merge 函數精心設計的鍵數組:$keys = array(...
    程式設計 發佈於2024-11-02
  • 透過 testcontainers-go 和 docker-compose 來利用您的測試套件
    透過 testcontainers-go 和 docker-compose 來利用您的測試套件
    Welcome back, folks! Today, we will cover the end-to-end tests in an intriguing blog post. If you've never written these kinds of tests or if you stri...
    程式設計 發佈於2024-11-02
  • 以下是一些適合您文章的基於問題的標題:

**直接簡潔:**

* **如何在Windows控制台中正確顯示UTF-8字元? ** **
* **為什麼傳統方法無法顯示
    以下是一些適合您文章的基於問題的標題: **直接簡潔:** * **如何在Windows控制台中正確顯示UTF-8字元? ** ** * **為什麼傳統方法無法顯示
    在Windows 控制台中正確顯示UTF-8 字元使用傳統方法在Windows 控制台中顯示UTF-8 字元的許多嘗試均失敗正確渲染擴充字元。 失敗嘗試:一個使用 MultiByteToWideChar() 和 wprintf() 的常見方法被證明是無效的,只留下 ASCII 字元可見。此外,使用 ...
    程式設計 發佈於2024-11-02
  • ReactJS 的模擬介紹
    ReactJS 的模擬介紹
    ReactJS 19:重要部份 並發模式增強: ReactJS 19 中最大的改進是並發模式,它不僅在應用程式自身更新時保持UI 平滑和響應靈敏,而且還確保了無縫界面,尤其是在復雜的過渡(例如動畫)時。 改進的伺服器元件: 在 Python 的引領下,ReactJ...
    程式設計 發佈於2024-11-02
  • 首屆DEV網頁遊戲挑戰賽評審
    首屆DEV網頁遊戲挑戰賽評審
    我被要求對DEV團隊9月份組織的第一屆網頁遊戲挑戰賽提交的參賽作品進行評判,結果在10月初發布。 我們幾個月來一直在 DEV 上組織挑戰(迷你黑客馬拉松),併計劃宣布我們的第一個網頁遊戲挑戰。鑑於您在遊戲社群 和 dev.to 的專業知識和參與度,我們想知道您是否有興趣成為客座評審。 誰能對此說...
    程式設計 發佈於2024-11-02
  • 購買經過驗證的現金應用程式帳戶:安全可靠的交易
    購買經過驗證的現金應用程式帳戶:安全可靠的交易
    Buying verified Cash App accounts is not recommended. It can lead to security risks and potential account bans. If you want to more information just k...
    程式設計 發佈於2024-11-02
  • 為什麼 `std::function` 缺乏相等比較?
    為什麼 `std::function` 缺乏相等比較?
    揭開std::function 的等式可比性之謎難題:為什麼是std::&&]難題:為什麼是std:: function,現代C 程式碼庫的一個組成部分,不具備相等比較功能?這個問題從一開始就困擾著程式設計師,導致管理可呼叫物件集合的混亂和困難。 早期的歧義:在C 語言的早期草案中11 標準中,op...
    程式設計 發佈於2024-11-02
  • JavaScript 類型檢查 |程式設計教學
    JavaScript 類型檢查 |程式設計教學
    介紹 本文涵蓋以下技術技能: 在本實驗中,我們將探索一個 JavaScript 函數,該函數檢查提供的值是否屬於指定類型。我們將使用 is() 函數,它利用建構子屬性和 Array.prototype.includes() 方法來確定值是否屬於指定類型。本實驗將幫助您更了解 Jav...
    程式設計 發佈於2024-11-02
  • 使用 Streamlit 將機器學習模型部署為 Web 應用程式
    使用 Streamlit 將機器學習模型部署為 Web 應用程式
    介绍 机器学习模型本质上是一组用于进行预测或查找数据模式的规则或机制。简单地说(不用担心过于简单化),在 Excel 中使用最小二乘法计算的趋势线也是一个模型。然而,实际应用中使用的模型并不那么简单——它们通常涉及更复杂的方程和算法,而不仅仅是简单的方程。 在这篇文章中,我将首先构...
    程式設計 發佈於2024-11-02
  • ## utf8_unicode_ci 與 utf8_bin:哪一種 MySQL 排序規則最適合德國網站?
    ## utf8_unicode_ci 與 utf8_bin:哪一種 MySQL 排序規則最適合德國網站?
    為德語選擇最佳MySQL 排序規則為德語選擇最佳MySQL 排序規則在設計為德語受眾量身定制的網站時,支持像ä、 ü 和ß。當涉及特定於語言的要求時,排序規則的選擇起著重要作用。 字元集和排序規則對於字元處理,UTF-8 仍然是首選選項,提供廣泛的字元支援。至於排序規則,則需要考慮德語特定字元。 排...
    程式設計 發佈於2024-11-02
  • 異常處理基礎知識
    異常處理基礎知識
    Java中的例外處理由五個關鍵字管理:try、catch、 throw、throws和finally。 這些關鍵字構成了一個相互關聯的子系統。 要監視的指令位於 try 區塊內。 如果try區塊中發生異常,則會拋出異常。 程式碼可以使用catch捕獲並處理異常。 系統異常由Java執行時...
    程式設計 發佈於2024-11-02

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3