什么是整潔架構(gòu)?
在《Clean Architecture: A Craftsman’s Guide to Software Structure and Design》一書中,著名作家 Robert “Uncle Bob” Martin 提出了一種具有一些重要特性的體系結(jié)構(gòu),如框架、數(shù)據(jù)庫(kù)和接口的可測(cè)試性和獨(dú)立性。
整潔架構(gòu)的約束條件是:
- 獨(dú)立的框架。該體系結(jié)構(gòu)并不依賴于某些帶有特性的軟件庫(kù)的存在。這允許您使用這些框架作為工具,而不是將您的系統(tǒng)束縛在有限的約束中。
- 可測(cè)試的。業(yè)務(wù)規(guī)則可以在沒(méi)有 UI、數(shù)據(jù)庫(kù)、Web 服務(wù)器或任何其他外部元素的情況下進(jìn)行測(cè)試。
- 獨(dú)立的 UI 。UI 可以很容易地更改,而不會(huì)改變系統(tǒng)的其他部分。例如,可以用控制臺(tái) UI 替換 Web UI,而不需要更改業(yè)務(wù)規(guī)則。
- 獨(dú)立的數(shù)據(jù)庫(kù)。您可以將 Oracle 或 SQL Server 替換為 Mongo、BigTable、CouchDB 或其他數(shù)據(jù)庫(kù)。您的業(yè)務(wù)規(guī)則不綁定到數(shù)據(jù)庫(kù)。
- 獨(dú)立的任意外部代理。事實(shí)上,你的業(yè)務(wù)規(guī)則根本就不用了解外部的構(gòu)成。
了解更多請(qǐng)查看 : https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
因此,基于這些約束,每一層都必須是獨(dú)立的和可測(cè)試的。
從 Uncle Bob 的架構(gòu)中,我們可以將代碼分成 4 層:
- 實(shí)體: 封裝企業(yè)范圍的業(yè)務(wù)規(guī)則。Go 中的實(shí)體是一組數(shù)據(jù)結(jié)構(gòu)和函數(shù)。
- 用例: 這個(gè)層中的軟件包含應(yīng)用程序特定的業(yè)務(wù)規(guī)則。它封裝并實(shí)現(xiàn)了系統(tǒng)的所有用例。
- 控制器: 該層中的軟件是一組適配器,它將數(shù)據(jù)從最方便的用例和實(shí)體轉(zhuǎn)換為最方便的外部代理,例如數(shù)據(jù)庫(kù)或 Web。
- 框架和驅(qū)動(dòng)程序: 這個(gè)層通常由框架和工具(如數(shù)據(jù)庫(kù)、Web 框架等)組成。
使用 Golang 構(gòu)建整潔架構(gòu)
讓我們以 user 包為例:
在 entity.go 文件中,我們有自己的實(shí)體 :
在 repository.go 文件中我們定義存儲(chǔ)庫(kù)的接口,用于保存存儲(chǔ)實(shí)體。在這種情況下,存儲(chǔ)庫(kù)意味著 Uncle Bob 架構(gòu)中的框架和驅(qū)動(dòng)層。它的內(nèi)容是:
該接口可以在任何類型的存儲(chǔ)層中實(shí)現(xiàn),如 MongoDB、MySQL 等。在我們的例子中,我們使用 MongoDB 來(lái)實(shí)現(xiàn),就像在 mongodb.go 中看到的那樣:
service.go 文件表示 Uncle Bob 定義的用例層。在文件中,我們有 Service 接口和它的實(shí)現(xiàn)。Service 接口是:
最后一層,我們架構(gòu)中的 Controller 是在 api 的內(nèi)容中實(shí)現(xiàn)的:
在以下代碼中,從 api/main.go 中我們可以看看如何使用這些服務(wù):
現(xiàn)在我們可以輕松地創(chuàng)建包測(cè)試,比如:
使用整潔的體系結(jié)構(gòu),我們可以將數(shù)據(jù)庫(kù)從 MongoDB 更改為 Neo4j ,而不會(huì)破壞應(yīng)用程序的其他部分。這樣,我們可以在不損失質(zhì)量和速度的情況下開(kāi)發(fā)我們的軟件。
引用
- https://hackernoon.com/golang-clean-archithecture-efd6d7c43047
- https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
via: https://medium.com/@eminetto/clean-architecture-using-golang-b63587aa5e3f
作者:Elton Minetto 譯者:SergeyChang 校對(duì):polaris1119
本文由 GCTT 原創(chuàng)編譯,Go語(yǔ)言中文網(wǎng) 榮譽(yù)推出