国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

整潔架構or整潔代碼?或許需要一個整潔的API!

原創(chuàng) 精選
開發(fā) 架構
在數(shù)據(jù)層,??Favorite?? 模型充當了與底層數(shù)據(jù)庫交互的角色,提供了對特定對象的操作接口。它封裝了所有與數(shù)據(jù)庫相關的細節(jié),如連接管理、查詢構建等,使得上層代碼可以專注于業(yè)務邏輯而非技術實現(xiàn)。

在軟件架構領域,網(wǎng)上討論最廣泛的架構之一是整潔架構(Clean Architecture)。它通過將項目劃分為多個層級,實現(xiàn)關注點分離,從而提升代碼的可維護性和可擴展性。

圖片圖片

每一層都遵循單一職責原則,確保每個類只負責一部分邏輯,不僅使系統(tǒng)結(jié)構更清晰,也極大地方便了單元測試的編寫與執(zhí)行。

整潔架構的核心理念可以概括為:

依賴關系向內(nèi)指向“業(yè)務核心”,外層可以依賴內(nèi)層,但內(nèi)層絕不可以反向依賴外層。

換句話說,沒有哪一層可以看到比它更高層的細節(jié)。它們可以引用自己的子層,但從不允許跨層依賴或反向耦合。

這種設計思想不僅適用于整體系統(tǒng)架構,在具體場景如 API 開發(fā)中同樣具有重要價值。那么,如何將 Clean Architecture 的理念應用到 API 端點的設計中?這就引出了“Clean API 架構”這一實踐模式:

圖片圖片

它將接口層、應用服務、領域邏輯和數(shù)據(jù)訪問等模塊清晰隔離,使 API 結(jié)構更加清晰、易于測試和長期演進。

1. 框架:從請求入口到架構分層

在現(xiàn)代 Web 系統(tǒng)中,任何一個 API 請求通常都需要經(jīng)過多個層級的處理——從負載均衡器、Web 服務器,到應用服務器,最終由具體的 API 或 Web 框架將請求路由到正確的代碼路徑。目前主流的開發(fā)框架如 Rails、Django 和 Spring Boot 等都提供了豐富的文檔支持和成熟的生態(tài)體系,是大多數(shù)開發(fā)者首選的技術棧。

然而,當請求真正進入框架并開始業(yè)務邏輯處理后,不同系統(tǒng)的設計路徑往往開始顯著分化。

以 Rails 為例,其采用經(jīng)典的 MVC(Model-View-Controller)架構,在小型項目中表現(xiàn)優(yōu)異,結(jié)構清晰且上手成本低。但對于大型、高可用性的 API 系統(tǒng)而言,這種模式逐漸顯露出局限性——控制器和模型容易膨脹為臃腫的“上帝類”,違背了單一職責原則,導致維護困難、測試復雜。

正因如此,在框架層級之下,我們所構建的整個系統(tǒng)設計更加注重解耦與可擴展性,并深受 Clean Architecture 的啟發(fā)。這套設計理念強調(diào)業(yè)務邏輯應獨立于外部依賴(如數(shù)據(jù)庫、UI、框架等),從而提升系統(tǒng)的可測試性和長期可維護性。

在本系列后續(xù)內(nèi)容中,我們將深入剖析我們是如何按照這一思想來組織各層級代碼的。

在每一層中,我們會定義一個或多個單一職責的支持類,它們只服務于當前層級,不引用上下層的具體實現(xiàn)。這種嚴格隔離不僅有助于代碼復用,也有效避免了層級混亂和過度耦合的問題。

此外,雖然我們在架構中使用了諸如 AWS EC2、SQS、RDS 和 ElastiCache 等云服務,但這些服務在我們的設計中被作為框架層的輔助工具類存在,而非核心業(yè)務邏輯的一部分。正如 Clean Architecture 所強調(diào)的那樣:業(yè)務規(guī)則不應依賴于基礎設施或數(shù)據(jù)存儲方式,而應保持完全的獨立。這也確保了我們的系統(tǒng)具備更強的可移植性與靈活性。

2. 接口適配器層:連接外部世界與核心邏輯的橋梁

當一個請求穿越框架層,進入系統(tǒng)內(nèi)部時,接口適配器層便開始發(fā)揮作用。這一層的核心職責是將外部輸入轉(zhuǎn)化為內(nèi)部可理解的數(shù)據(jù)結(jié)構,并將應用邏輯的執(zhí)行結(jié)果以合適的格式返回給調(diào)用者。

在這一過程中,控制器(Controller)扮演著協(xié)調(diào)者的角色。它首先通過 Request 對象提取請求參數(shù),驗證其語法格式,并完成用戶身份認證等前置操作。隨后,控制器實例化相應的業(yè)務類,驅(qū)動數(shù)據(jù)在不同層級之間的流轉(zhuǎn),從而啟動真正的應用邏輯處理流程。

值得注意的是,控制器并不是接口適配器層中唯一負責業(yè)務流程的對象。我們還引入了 Jobs(任務),用于處理異步隊列相關的操作——這部分內(nèi)容將在后續(xù)章節(jié)中詳細展開。

為了確保系統(tǒng)的清晰分層與職責分離,控制器依賴于多個輔助類:

  • Validators(驗證器) 
    負責檢查輸入數(shù)據(jù)的合法性,確保進入系統(tǒng)的信息符合預期格式;
  • Presenters(展示器) 
    專注于輸出數(shù)據(jù)的格式化處理,為上層邏輯提供統(tǒng)一的數(shù)據(jù)視圖;
  • Response(響應)對象 
    則承擔最終輸出的封裝工作,能夠?qū)?shù)據(jù)轉(zhuǎn)換為 JSON、HAML 或其他客戶端可識別的格式返回。

此外,系統(tǒng)中還包含一種特殊的適配器——套接字中繼類(Socket Relay),它通過 WebSocket 等通信通道,實時將狀態(tài)變更推送給客戶端,實現(xiàn)雙向通信能力。

Request 類則是一個類型化的數(shù)據(jù)結(jié)構,聚合了當前請求所需的所有信息。與傳統(tǒng) HTTP 請求(通常是以鍵值對形式存在的 CGI 風格請求)不同,這種設計提供了更強的類型安全性和結(jié)構清晰性。

Response 類的功能類似于 Rails 中的渲染器,但它更加靈活,支持多種輸出格式,如 HAML、JSON 或自定義類型,便于構建多端兼容的 API 響應。

最后,參數(shù)提取器(Parameter Extractor) 從原始的 params 散列中提取數(shù)據(jù),并將其轉(zhuǎn)換為正確的類型,如整數(shù)、浮點數(shù)或字符串,為后續(xù)邏輯提供強類型的輸入保障。

整體而言,接口適配器層作為系統(tǒng)的“翻譯官”,在外部請求與內(nèi)部邏輯之間建立起高效、清晰的橋梁,是實現(xiàn) Clean Architecture 分層思想的重要一環(huán)。

3. 應用邏輯層:業(yè)務流轉(zhuǎn)的核心引擎

在 Clean API 架構中,應用邏輯層是整個系統(tǒng)真正開始處理業(yè)務需求的地方。它承接來自接口適配器層的請求,并協(xié)調(diào)數(shù)據(jù)驗證、權限控制、外部調(diào)用以及最終的業(yè)務執(zhí)行。

對于 GET 請求這類讀取型端點,請求一旦進入該層,首先由服務類(Service)進行處理。服務對象負責確保輸入?yún)?shù)的有效性,驗證用戶是否有權限訪問目標資源,并通過 Repo(用于數(shù)據(jù)庫操作) 或 Adapter(用于外部 API 調(diào)用) 從實體邏輯層獲取所需數(shù)據(jù)。

在數(shù)據(jù)獲取完成后,服務對象將結(jié)果封裝為一個由 Result 對象返回。這種設計不僅統(tǒng)一了成功與失敗的返回結(jié)構,也便于上層(如控制器)根據(jù)結(jié)果類型做出相應的響應決策。

而對于 POST、PUT 和 DELETE 等寫入型請求,應用邏輯的處理流程類似,但引入了異步機制以提升性能和可靠性。服務對象仍然負責驗證輸入、授權用戶,并準備寫入所需的數(shù)據(jù)。不同之處在于,這些變更操作會被包裝并提交到我們的任務隊列(基于 Amazon SQS)中排隊,交由后臺的作業(yè)(Job)或異步服務來執(zhí)行真正的數(shù)據(jù)寫入操作。這種方式既減輕了主流程的壓力,也增強了系統(tǒng)的容錯能力和可擴展性。

此外,作業(yè)還承擔著觸發(fā)副作用的職責。例如,在數(shù)據(jù)持久化完成之后,作業(yè)可以通過 Relay 模塊向客戶端發(fā)送 WebSocket 消息,實時通知狀態(tài)變更,實現(xiàn)前后端之間的即時反饋。

值得一提的是,在本架構中,Service 類還會組合一組專門的 Validator 類,對請求內(nèi)容進行語義級別的驗證。這意味著我們在系統(tǒng)中構建了雙層驗證機制

  • 語法驗證發(fā)生在請求層,確保傳入的數(shù)據(jù)格式正確;
  • 語義驗證則在應用邏輯層進行,確保數(shù)據(jù)在業(yè)務規(guī)則下是合理且合法的。

這種分層驗證策略顯著提升了系統(tǒng)的健壯性,避免了無效或非法數(shù)據(jù)對核心業(yè)務邏輯造成干擾,同時也使代碼更具可測試性和可維護性。

4. 實體邏輯層:業(yè)務規(guī)則與數(shù)據(jù)交互的核心

實體邏輯層(Entity Logic Layer) 是系統(tǒng)中最具通用性和復用價值的部分。它不僅服務于當前 API 端點,也為其他多個接口和業(yè)務流程提供基礎能力支撐。這一層承載了系統(tǒng)的核心業(yè)務規(guī)則以及與外部存儲系統(tǒng)的交互邏輯。

在這一層級中,我們實現(xiàn)對持久化數(shù)據(jù)庫(如 MySQL 或 PostgreSQL)的訪問,封裝了數(shù)據(jù)的讀取、寫入和轉(zhuǎn)換邏輯;同時,Adapter 類 則負責對接各類外部服務 API,例如 AWS 提供的 S3(對象存儲)、ElastiCache(緩存服務)等,使得系統(tǒng)能夠靈活集成多種基礎設施資源。

與上層(如應用邏輯層)中為特定端點定制的服務類不同,實體邏輯層中的類設計強調(diào)高內(nèi)聚、低耦合廣泛復用性。它們通常不依賴于具體的請求或業(yè)務場景,而是圍繞領域模型構建穩(wěn)定的數(shù)據(jù)訪問和業(yè)務處理能力。

簡而言之,實體邏輯層是整個 Clean API 架構中最接近“不變”的部分——它屏蔽了外部變化的影響,確保系統(tǒng)核心邏輯穩(wěn)定可靠,同時也為上層模塊提供了統(tǒng)一、可測試、可替換的數(shù)據(jù)交互接口。

5. 數(shù)據(jù)層:存儲抽象與適配的關鍵一環(huán)

數(shù)據(jù)層(Data Layer) 是整個 Clean API 架構中最底層的一環(huán),其核心職責是為上層模塊提供統(tǒng)一的數(shù)據(jù)訪問接口,并屏蔽具體存儲實現(xiàn)的細節(jié)。理想情況下,這一層應保持高度簡潔和可替換,專注于連接數(shù)據(jù)庫、緩存、文件系統(tǒng)或其他持久化機制。

為了實現(xiàn)跨平臺一致性,我們在不同技術棧中(例如 Android 或 iOS 開發(fā))也為數(shù)據(jù)存儲層建立了統(tǒng)一接口。通過依賴注入(Dependency Injection) 技術,我們可以在測試時輕松替換真實的數(shù)據(jù)源為內(nèi)存中的模擬實現(xiàn)(Mock)。例如,在本地運行單元測試時,可以使用基于 SQLite 的內(nèi)存數(shù)據(jù)庫代替實際的文件系統(tǒng)或遠程服務,從而提高測試效率并減少外部依賴的影響。

在 Web 服務器環(huán)境中,我們通常將云服務(如 Redis、Memcached、MySQL 等)抽象為單例對象,并根據(jù)部署環(huán)境動態(tài)指向不同的實際資源。例如,在開發(fā)階段,這些服務可以指向本地運行的 Docker 容器;而在生產(chǎn)環(huán)境中,則連接真實的云服務實例。

支撐數(shù)據(jù)層的各類存儲系統(tǒng)——如 MySQL 和 Postgres——通常以進程級別的單例形式存在,并通過依賴注入或配置管理進行初始化和替換。像 ActiveRecord 這樣的 ORM 會維護自己的連接池,而 Redis 和 Memcached 等服務也需要類似的全局訪問控制機制來管理連接資源。

對于基于 HTTP 的無狀態(tài)服務(如 S3、DynamoDB 等),我們通常采用模擬雙(Instance Doubles)或覆蓋連接參數(shù)的方式來隔離外部環(huán)境。這使得測試過程更加可控,同時也能保證代碼邏輯在不同環(huán)境下的一致性。

總之,數(shù)據(jù)層不僅是系統(tǒng)與外部世界交互的橋梁,更是實現(xiàn)可測試性、可維護性和可擴展性的關鍵所在。通過良好的抽象設計與靈活的注入策略,它確保了我們的業(yè)務邏輯不受底層存儲細節(jié)的牽制,真正做到“一次編寫,多環(huán)境運行”。

6. 這是否過度設計?讓我們通過一個簡單的示例來探討

為了更好地理解各層架構的實際應用,我們來看一個最基礎的 API 示例:將文件添加到收藏夾。即使在這樣一個看似簡單的操作中,每一層的設計理念依然得到了體現(xiàn)。

假設我們要創(chuàng)建一個允許用戶將某個文件添加到其收藏夾的功能。在這個過程中,盡管表面上看只需要一個簡單的數(shù)據(jù)庫操作,但實際上,這個功能隱式地依賴于我們之前定義的每一層架構。

請求(Request)

請求參數(shù)直接從 HTTP 請求中提取,包含 target_id(目標文件的ID)和 creator_id(執(zhí)行該操作的用戶ID)。這些未經(jīng)處理的原始參數(shù)構成了一個隱式的請求對象。

Params: { "target_id": 123, "creator_id": 456 }

控制器(Controller)

由于此場景下沒有復雜的驗證或表示邏輯需求,因此無需專門編寫控制器代碼。這意味著我們可以跳過這一步驟,直接進入服務層處理業(yè)務邏輯。

服務(Service)

服務層在此處承擔了主要職責,它接收來自請求的 target_id和 creator_id,并查找或創(chuàng)建相應的領域?qū)ο?nbsp;Favorite。這一過程確保了輸入的有效性和用戶的授權狀態(tài),并協(xié)調(diào)后續(xù)的數(shù)據(jù)處理步驟。

實體邏輯(Entity Logic)

實體邏輯層負責與持久化存儲交互,這里使用了一個特殊的 ActiveRecord 方法 first_or_create 來檢查是否存在符合條件的記錄,若不存在則創(chuàng)建新記錄。這種方法不僅簡化了數(shù)據(jù)訪問邏輯,還保證了數(shù)據(jù)的一致性。

數(shù)據(jù)(Data)

在數(shù)據(jù)層,Favorite 模型充當了與底層數(shù)據(jù)庫交互的角色,提供了對特定對象的操作接口。它封裝了所有與數(shù)據(jù)庫相關的細節(jié),如連接管理、查詢構建等,使得上層代碼可以專注于業(yè)務邏輯而非技術實現(xiàn)。

通過這個簡單的例子可以看出,即使是看似微不足道的功能,Clean API 的分層設計也能夠提供清晰的結(jié)構劃分,確保每個部分專注于自己的職責。這樣的設計雖然初看起來可能顯得有些復雜,但它極大地提高了代碼的可維護性、測試性和擴展性。隨著系統(tǒng)規(guī)模的增長,這種架構的優(yōu)勢將會更加明顯。

責任編輯:武曉燕 來源: 喔家ArchiSelf
相關推薦

2012-08-01 09:38:17

代碼整潔

2012-08-01 09:23:31

代碼

2021-01-06 14:42:09

前端Typescript代碼

2022-09-14 09:27:49

CSS架構代碼

2020-12-09 10:49:33

代碼開發(fā)GitHub

2021-03-07 09:19:31

React代碼整潔代碼的實踐

2011-12-02 10:19:24

CSS

2025-01-14 00:01:01

2019-10-11 10:44:30

Go語言數(shù)據(jù)庫軟件

2022-04-18 09:41:14

Go架構設計

2011-06-03 15:06:30

CSS

2025-01-02 14:56:42

開源.NET開發(fā)

2011-06-03 15:21:51

CSS

2023-08-17 10:12:04

前端整潔架構

2021-06-09 08:09:05

架構軟件整潔

2014-03-18 16:12:00

代碼整潔編寫代碼

2015-06-17 14:24:48

優(yōu)秀程序員整潔代碼

2022-08-08 13:24:28

整潔架構架構前端

2012-07-10 13:57:19

Web前端

2020-09-23 10:09:43

Dockerfile
點贊
收藏

51CTO技術棧公眾號

少妇精品久久久一区二区| 欧美www.| 国产成人综合亚洲91猫咪| av免费精品一区二区三区| 日韩成人久久| 九九视频这里只有精品| 日韩电影免费观看高清完整版在线观看| 欧美精品aⅴ在线视频| 天堂视频福利| 中文字幕在线免费不卡| 欧美在线观看视频免费| 亚洲影音一区| 国产精品一区二区a| 亚洲综合日韩| 日韩欧美三级一区二区| 国产一区二区三区美女| 免费毛片网站在线观看| 一区二区三区高清在线| 中文字幕中文字幕在线中高清免费版| 精品国产乱码久久久久久夜甘婷婷| 日本www高清视频| 日韩高清不卡一区二区| 国产成人免费av| 日本高清久久| 久久全球大尺度高清视频| 日韩欧美中文字幕一区二区三区| 色悠悠久久久久| 久久久国产精品网站| 最近2019中文字幕大全第二页| sm捆绑调教国产免费网站在线观看| 亚洲成a人片在线观看中文| 成人福利免费网站| 中文字幕一区二区三区不卡 | 最近中文字幕免费mv| 国产在线精品一区二区三区不卡| 亚洲精品无人区| 成人av片在线观看| 中文字幕av不卡在线| 亚洲成人综合网站| 国产成人97精品免费看片| 久久精品国产亚洲夜色av网站| 国产精品麻豆va在线播放| 欧美mv日韩| 日韩精品最新在线观看| 99国内精品久久| 2020中文字字幕在线不卡| 激情懂色av一区av二区av| 欧美vide| 亚洲人成毛片在线播放| 麻豆国产一区| 亚洲va久久久噜噜噜| 国产一本一道久久香蕉| 超清福利视频| 亚洲国内高清视频| 国内毛片久久| 日韩欧美国产二区| 亚洲欧美中文在线视频| 中文字幕综合网| 在线观看你懂| 欧美日韩1234| 91麻豆免费在线视频| 中文字幕亚洲欧美在线不卡| 欧美大片黄色| 国产999精品久久久影片官网| 日韩不卡一区二区| 久草一区二区| 亚洲一区中文| 亚洲无线看天堂av| 波多野结衣xxxx| 国产自产女人91一区在线观看| 悠悠色在线精品| 国产精品美女久久久久久不卡| 国产大片精品免费永久看nba| 久久精品视频一区二区三区| 欧美久久精品| 亚洲精美视频| 麻豆精品网站| 欧美一区二区激情| 久久久99久久| 欧美日韩免费做爰大片| 亚洲国产精品成人精品| 草民电影神马电影一区二区| 欧美高跟鞋交xxxxhd| 奇米狠狠一区二区三区| 国产一区二区三区av在线| 国产成人亚洲综合a∨婷婷| 黄色在线视频网| 欧洲人成人精品| 户外露出一区二区三区| 国产精品极品尤物在线观看| 久久综合图片| 中文字幕在线观看第三页| 在线免费观看成人短视频| 天天综合网站| 成人国产精品色哟哟| 国产美女在线精品| 在线黄色.com| 丝袜情趣国产精品| 性欧美69xoxoxoxo| 18禁网站免费无遮挡无码中文| 精品久久久久久国产| 二区三区不卡| 国产一区二区丝袜| 91亚洲精华国产精华精华液| 国模精品一区二区| 欧美激情视频一区二区三区不卡| 国产综合网站| 嫩草影院国产精品| 精品88久久久久88久久久| 综合综合综合综合综合网| 亚洲五月六月| 色一情一伦一子一伦一区| 成人搞黄视频| 亚洲天堂第一区| 欧美在线观看一二区| 国产精品男女| 国产成人艳妇aa视频在线 | 精品久久中文字幕| 日韩久久一区二区三区| 国产高清一区视频| 亚洲男女一区二区三区| 日韩欧美另类一区二区| 99久久综合狠狠综合久久止| 国产欧美日本一区视频| 水蜜桃在线视频| 免费观看成人高| 欧美性猛交视频| 久久超级碰碰| 妺妺窝人体色www在线小说| 亚洲第一页自拍| 韩国久久久久| 免费黄色片在线观看| 国产精品综合不卡av| 亚洲欧美影音先锋| 日韩伦理一区二区| 超级碰在线观看| 精品成人a区在线观看| 亚洲在线视频| 在线观看免费高清完整| 成人午夜激情网| 亚洲一区二区三区四区五区黄 | 好吊色欧美一区二区三区视频| 亚洲欧美日韩系列| 亚洲无线观看| 天堂8在线天堂资源bt| 亚洲国产女人aaa毛片在线| 国产亚洲福利| 日本韩国在线视频爽| 国产综合 伊人色| 欧美男男青年gay1069videost| 欧美不卡视频| 免费在线稳定资源站| 成人免费视频在线观看超级碰| 亚洲自拍偷拍图区| 欧美激情电影| 青青草在线视频免费观看| 91在线高清视频| 欧美三级午夜理伦三级中视频| 欧美体内she精视频在线观看| 人成免费电影一二三区在线观看| 国产精品高精视频免费| 亚洲第一成年网| 香蕉视频官网在线观看日本一区二区| 五月天婷婷综合社区| 国产精品视频自在线| 色偷偷成人一区二区三区91| 精品91视频| 亚洲无线看天堂av| 91看片淫黄大片91| 九九热视频这里只有精品| 亚洲欧洲在线观看av| 成人久久一区| 97人人在线| 激情五月五月婷婷| 久久成人国产精品| 亚洲免费av在线| 欧美 日韩 国产精品免费观看| 九九在线视频| 色婷婷精品国产一区二区三区| 国产午夜精品久久久| 久久中文娱乐网| 精品国产一区二区三区噜噜噜| 免费毛片在线| 一区二区三区四区国产| 日韩视频免费看| 亚洲码国产岛国毛片在线| 女生裸体视频一区二区三区| 欧洲黄色一区| 国产综合中文字幕| 国产精品高潮在线| 精品国产乱码久久久久久老虎| 成人18精品视频| 国产在线日韩精品| 伊人电影在线观看| 久久久久久久久久福利| 国产在线精品播放| 亚洲国产精品高清久久久| 中文字幕在线一区二区三区| 亚洲国产二区| 久久国际精品|