淺析整潔架構之道(三) 明析分層原則

2021-02-14 御劍軒
1. 架構的分層概述

在我們開始之前,我們再次回到The Clean Architecture的這個概述圖上來。上篇文章筆者論述了The Clean Architecture整潔架構的基本理念,分層及黃金法則。



在這個概述圖上,The Clean Architecture按照環形區分為以下幾層:其實如果我們認真對比,會發現這個模型與DDD領域驅動思想有異曲同工之妙。後續筆者會再就DDD做專門的論述。2. 分層2.1 Entities

這一層為『實體』層,它應該是你系統業務的核心所在。

我們都知道,任何一個系統,最終本質上都是業務的支撐與反應。比如一個銀行交易系統,一定是先有銀行交易的業務,再有系統,系統的形式也可以多樣化,如WEB端,手機端,ATM機等。

如果基於這個場景來分析,那交易本身相關的業務邏輯,就應該放在Entities層,如轉帳,存錢,取錢等,這些屬於業務核心。你應該把這些業務的邏輯放在Entities這一層來實現。

業務是與系統無關的,一個業務一定可以有不同的系統承載形式,比如WEB,移動,桌面客戶端,或類似ATM等智能設備等

2.2 Use Cases

這一層為『用例』層,也就是你的系統的每一個用例在這一層都應當有對應的反應或映射。

需要明確它與Entites層的區別,很多人會搞混這兩層的差別。

最大的一個差別在於:

Entites關注的是核心業務,不關注系統用例

Use Cases更關注系統有哪些需求,它並不實現核心業務,它是調用核心業務來滿足用例上的需求。

再換言之,同一個業務,如銀行業務,它的核心業務層,也就是Entites應該是同一個,與具體的系統無關,不管你的系統是WEB承載,還是使用手機承載,或是ATM機來承載,它們應該共享同一個Entities

Use Cases層則不一樣,因為不同的系統,用例不盡相同,一個銀行業務的WEB端與ATM端,其功能與輸入輸出都存在較大的差別,所以它們的Use Cases層是不一樣,不同系統有自己的這一層。

這一層有個非常明顯的特徵,就是它應該非常薄,業務應該是由Entites來實現的。這一層還包含一些非業務的行為,如日誌,緩存,事務,分頁等,這些大多是系統級的需求,我們通常會把這些放在這一層來實現2.3 Interface Adapters這一層其實是與UI關聯比較緊密的,如果你是WEB,那這一層大多可能是MVC所在。如果你是WEB並且用的是Spring,那這一層就是Controller。如果你在移動端,那這一層就是ViewController或Activity。2.4 Frameworks and Drivers.比如你的資料庫是MYSQL,你是使用JPA或Mybatis來與資料庫打交道。再如,你使用了緩存,可能使用了Redis或EHCache來實現你的緩存。記住一個重要原則:實現細節是應該推遲到最後再考慮的當然,很多人會搞不清楚究竟怎麼樣才能把實現細節放到最後果來考慮,很多人可能從來沒有寫過類似的代碼,不清楚該如何實現。因為他們在思維上,討論一個業務時,會自然而然的想到資料庫,很難想像或理解如何做到先關注業務,後關注數據實現3 區分業務與系統需求在實際業務分析過程中,我們很容易將業務系統需求混淆,很難分的清這兩者。很多系統都會存在一個需求,記錄用例操作日誌,比如XX時間,XX做了什麼操作。大多數情況下,這是一個系統需求,因為本身大多數業務不存在這個行為,這是一個典型的因為系統帶來的行為的需求。因此,這一個邏輯大多數情況下你應該放在Use Cases層。但如果是類似銀行等系統,記錄用戶行為,如張三在10月1日09:10分存了1萬元錢這種並非系統帶來的,而是業務本身就一定需要記錄的,那這個需求應該放在Entities層來實現。所以,分析具體的需求是業務行為還是系統行為是非常重要的一件事。它決定的這一塊的邏輯放哪一層來實現。4 如何實現整潔架構與具體的技術無關,筆者在論述分層的過程中,未與任意具體的技術框架相關聯整潔架構與技術方向無關,這些原則適應於任何方向,包含後端,移動,WEB,甚至是ATM等類似設備的系統很多人會問,如何實現這樣的整潔架構,很多開發人員從未使用過或考慮過類似的架構,也沒有類似的經歷。其實,從筆者自己在各個技術方向的實踐經驗來看,基本上所有的面向對象語言都是非常容易做到上述的架構的實現。接下來,筆者會著重論述面向對象的基本原則,只要你能理解面向對象的基本原則,就會很輕鬆的理解如何實現整潔架構

相關焦點

  • 六邊形架構和分層架構的區別
    作為一個後端程式設計師,MVC三層架構的模式相信大家都不會陌生,三層分別從上而下排布,只能由上層調用下層。一般越往下層越通用,越上層越細節。這些優化的動作,通常不會改變原有的業務邏輯。
  • 【《代碼整潔之道》精讀與演繹】之五 整潔類的書寫準則
    《代碼整潔之道》這本書提出了一個觀點:代碼質量與其整潔度成正比,乾淨的代碼,既在質量上可靠,也為後期維護、升級奠定了良好基礎。書中介紹的規則均來自作者多年的實踐經驗,涵蓋從命名到重構的多個編程方面,雖為一「家」之言,然誠有可資借鑑的價值。  但我們知道,很多時候,理想很豐滿,現實很骨感,也知道人在江湖,身不由己。
  • <讀書筆記> 代碼整潔之道
    概述本文引用地址:http://www.eepw.com.cn/article/201608/294841.htm  1、本文檔的內容主要來源於書籍《代碼整潔之道》作者Robert C.Martin,屬於讀書筆記。
  • 《代碼整潔之道》:5大基本要點
    全文共3257字,預計學習時長10分鐘評論區常常有小夥伴推薦羅伯特·C·馬丁的《代碼整潔之道(Clean Code)》。今天我們就來了解一下這本書,它值不值得一看?關於此書《代碼整潔之道》出版於2008年,近年來,一直被列為「亞馬遜最暢銷的五本書」之一。本書作者被親切地稱為「Bob叔叔」,他也是《敏捷宣言》的原作者之一,資歷非常豐富。本書在Goodreads上平均評分為4.4(評分人數超13,000)。可以說,這是一本程式設計師的必讀書。
  • 提綱挈領,弄清Flink的分層架構
    我們知道,Flink是一個分層架構的系統,每一層所包含的組件都提供了特定的抽象,用來服務於上層組件。Flink分層的組件棧如下圖所示:Flink生態圈核心組件棧掌握了Flink的分層架構,後面的學習就可以圍繞每個層級的核心內容來學習或研究。
  • 數據倉庫系統架構和數倉分層體系介紹
    一、數據倉庫體系架構 公司藉助的第三方數據平臺,在此平臺之上建設數據倉庫。因為第三方平臺集成了很多東西,所以省去了不少功夫。 數據倉庫的體系架構,無外乎就是數據源、數據採集方式、計算存儲系統、數據應用層,這幾個方面。
  • 你了解分層架構嗎?給被PetShop「毒害」的朋友
    【IT168 技術文章】    筆者在仔細閱讀了大量這方面文章後,認為許多朋友在分層架構的理解上存在兩個比較大的偏頗:    1.沒有從本質角度去理解分層的內涵,而只是了解其表象。    2.對分層架構的理解過於狹隘,只是少數概念,而又不夠深入。
  • 《代碼整潔之道》精讀與演繹】之四 優秀代碼的格式準則
    《代碼整潔之道》這本書提出了一個觀點:代碼質量與其整潔度成正比,乾淨的代碼,既在質量上可靠,也為後期維護、升級奠定了良好基礎。書中介紹的規則均來自作者多年的實踐經驗,涵蓋從命名到重構的多個編程方面,雖為一「家」之言,然誠有可資借鑑的價值。  但我們知道,很多時候,理想很豐滿,現實很骨感,也知道人在江湖,身不由己。
  • 你的數據倉庫既要有「維度模型設計」也要看「分層架構」
    維度模型設計和分層架構都是數據倉庫必不可缺的。維度建模以分析決策的需求出發構建模型,構建的數據模型為分析需求服務,因此它重點解決用戶如何更快速完成分析需求,同時還有較好的大規模複雜查詢的響應性能。而分層架構的設計的主要是為在管理數據的時候,能對數據有一個更加清晰的掌控。
  • JavaScript 代碼整潔之道(中)
    (SRP)正如《代碼整潔之道》所說,「不應該有超過一個原因來改變類」。(ISP)JavaScript 中沒有接口,所以實行這個原則不能像其它語言那樣嚴格。(DIP)這個原則說明了兩個基本問題:1.extends Mammal {    constructor(age, furColor, languageSpoken) {        super(age, furColor);        this.languageSpoken = languageSpoken;    }    speak() {}}使用方法鏈在這裡我的意見與《代碼整潔之道
  • 《代碼整潔之道》精讀與演繹】之一 讓代碼比你來時更乾淨
    本文引用地址:http://www.eepw.com.cn/article/201608/295974.htm  ——《代碼整潔之道》作者 RobertC.Martin,於SD West 2007技術大會  一、系列文章前言  敲完上面這段文字的時候,心裡在想,一個剛踏入編程生涯的新人
  • 《代碼整潔之道(Clean Code)》讀書筆記
    如果需要三個或者三個以上的參數,就說明一些參數應該封裝為類了7. 無副作用1. 比如違反製作一件事,藏起來做了其他的事2. 避免使用輸出參數,可以使用類調用,this 也有輸出函數的意味8.注釋可以用來放大某種看似不合理之物的重要性8. 公共 API 注釋4. 壞注釋1. 喃喃自語。應該過程需要就添加注釋,是無畏之舉2. 多餘的注釋。代碼清晰明了,讀注釋比讀代碼花的時間長3.
  • 想要進階軟體架構師,這5本書才是最好的
    需要讀哪些書,或者有什麼資源,需要考什麼證書麼以及成為一個軟體架構師需要多少經驗等問題。本文就從軟體架構師的角度選擇了5本最好的並且是必讀的書籍因為架構是一個非常廣的主題,它和你如今所處的工作領域息息相關,因此這些書並不能涉及到軟體設計相關的方方面面,但是卻會為你提供構建一個安全和可維護軟體所需的基本工具和技術。
  • 圍觀致遠 | 「因材施教」,架構英語閱讀分層模式
    建鄴區第五盟區江心洲中學、中華上新河中學、南京市致遠初級中學三所學校的初中英語教師們參加本次研討活動,盟區負責人周志健校長親臨課堂並參加研討,為各位老師解答疑問,並對關於如何實行閱讀課能力分層問題做了深入的交流。研討結束後,老師們更加清晰地把握住按學生能力進行閱讀分層的方向,也都表示在今後的課堂閱讀教學中會積極落實「分層教學」。
  • 淺析貪吃小站進口乾果零食加盟店的成功之道
    淺析貪吃小站進口乾果零食加盟店的成功之道 來源:榕城網時間:2020-11-27 17:37:13 貪吃小站營運副總裁朱建勇,跟小編分享了貪吃小站的連鎖經營之道。  小編了解到,作為銷售零食的企業,貪吃小站秉承為消費者負責的態度,堅持嚴把商品的品質關,所有商品在與消費者見面之前,都將進行六層嚴格的質量把關。任何的新產品上市前,都需要經過試吃,收集顧客的對產品口味和口感的感受,進行口味調整並定製,確保滿足絕大部分消費者的需求。
  • 設計的五大原則-SOLID
    1.背景最近在讀《架構整潔之道》這一本書,這本書的確寫得不錯,最近也沒有更新文章,一方面再忙工作,另一方面也再啃一些書。當然文章還是得更新,《架構整潔之道》裡面有些有意思的內容我會提取出來外加自己的思考。在這本書裡面的第三章介紹了設計原則,這部分我覺得對於大家的平時工作都比較有用。2.
  • 軟體設計原則之依賴反轉(Dependency inversion principle,DIP)
    該原則規定:高層模塊不應該依賴低層模塊,二者都應該依賴抽象接口抽象接口不應該依賴於具體實現,而具體實現則應該依賴於抽象接口常規應用的分層架構,策略層會依賴方法層,業務邏輯層會依賴數據存儲層。這種高層模塊依賴低層模塊的分層架構有什麼缺點呢?3 傳統分層架構缺陷3.1 維護困難高層模塊通常是業務邏輯和策略模型,是一個軟體的核心。正是高層模塊使一個軟體區別於其他軟體,而低層模塊則更多的是框架細節。若高層模塊依賴低層,就是業務邏輯依賴技術細節,技術細節改變將影響業務邏輯。
  • 對一些架構設計原則的反思
    在架構設計的領域,⼈們總結出了很多原則。這些原則的⽤語⼤都很簡略,容易傳播。但是提出這些原則的⼈,往往不會告訴你,為什麼應該是這樣的原則。哪怕說了背景,過了⼀段時間,聽的⼈可能已經不知道原則提出⼈的初衷。⽽且這些原則,粗看起來是很有道理,可是在實踐中,卻往往不是這麼回事,那麼就淪為⼼靈雞湯了。在看這些原則的時候,每個⼈都要形成⾃⼰的判斷能⼒,不要⼈雲亦云才好。
  • 優化代碼-Web服務分層設計概念與參考模型
    我們都希望自己的代碼寫的好看猶如你的外表,但面對複雜業務需求和多人協同時,如果沒有一套基本的原則規範,很難確保不迷失方向。本文就如何寫好代碼的問題,試圖整理出一套規範。什麼是分層設計簡單的理解就是,把系統的邏輯功能按照某些原則抽象出幾個層次,層次內保持高類聚,層次間保持低耦合,整個系統達到概念清晰,邊界清晰,最終功能穩定。
  • 架構設計:業務邏輯和技術分離
    硬是要給一個概述,我認為架構就是對系統中的實體以及實體之間的關系所進行的抽象描述。 架構始於建築,是因為人類發展(原始人自給自足住在樹上,也就不需要架構),分工協作的需要,將目標系統按某個原則進行切分,切分的原則,是要便於不同的角色進行並行工作。 2.