Clean架構中不好的部分 -James Hickey
Clean體系結構是設計軟體系統的常用方法。但是,有些問題可能會給您帶來弊大於利的後果……“Clean架構”是Bob Bob叔叔在他的書中自然地提出的一種軟體體系結構與架構模式。這是構造軟體程式碼的一種方法,它是六角形體系結構的一個示例。
埠和介面卡
六角形體系結構(也稱為“埠和介面卡”體系結構)的基本思想是,領域邏輯和域物件位於應用程式的“中心”。其他問題,如永續性,快取等,都被視為域程式碼的附件或“介面卡”。
通常,這是通過讓您的域程式碼將對這些基礎結構或應用程式級程式碼的任何需求公開為介面來完成的。
例如,這在概念上類似於我們如何設計計算機。計算機具有專用的核心用途,但允許外部裝置通過某種介面(USB埠,HDMI埠等)“插入”。
Clean架構原理
Clean體系結構有許多原則,我將在這裡總結:
- 獨立於框架
- 可測
- 獨立於UI
- 獨立於資料庫
- 獨立於任何外部機構
乍一看,我認為大多數軟體開發人員都會同意這些原則。來自Clean架構和域驅動設計的最重要原則是使域物件和域邏輯與其他問題分開。
DDD一書:
我們需要使域物件與系統中的其他功能脫鉤,因此我們可以避免將域概念與僅與軟體技術相關的其他概念混淆,或者避免在整個系統中完全看不到域。 |
如何傾向於從概念模式過渡到實施
大多數開發人員從思考這些原理到將其實現到實際軟體專案中的方式存在問題。
典型的結構是建立處理以下內容的專案或庫:
- 應用層
- 領域層
- 基礎設施層
- UI層
我們傾向於採用這些概念,並且“一對一”地將它們實現為專用的.NET專案,Java包等。我認為,這種從概念上的思維轉變成將其作為構建程式碼的特定“藍圖”的方式的做法是錯誤的。
在我曾任職的公司之一中,我引入了Clean體系結構,這是開始改進開發流程,開發速度和產品質量的許多方法之一。我們為新功能實施了Clean架構。雖然這是方式優於現有的公約和架構,但是最大的問題之一是上下文切換。
上下文切換
例如,如果您正在使用某個功能,並且需要處理資料訪問,域或應用程式邏輯的任何組合,則必須將上下文完全切換到另一個軟體專案中,變成一個完全不同的資料夾結構。
這似乎效率低下。
我決定將與特定功能相關的所有內容放到同一資料夾中,帶來的好處多於沒有。
在尊重依賴規則的同時,這個想法是遵循高度凝聚力原則的邏輯結論:在一起改變的事物應該在一起生活。但是,這是否會引起擔憂?應用層,領域和資料庫邏輯放在同一個地方?如果您瞭解高內聚和鬆散耦合的原理,那麼這應該不是問題。您仍然可以在概念上實現“埠和介面卡”,但是在每個單獨的功能內。例如,我採用的典型方法是這樣的:
從具有多個功能或產品的角度看待它,它看起來像這樣:
請注意,我已將“應用”和“領域”層合併在同一儲存資料夾中。
垂直切片
我是通過使用鬆散耦合和高內聚性的原理自行提出這種方法的。當我迷失於這種思維方式時,我遇到了通常被稱為“垂直切片”架構的事物。據我所知,吉米·博加德(Jimmy Bogard)負責編纂這種方法。
以我的經驗,這種方法比較簡單。在應用程式中新增或更改功能時,通常會觸及應用程式中的許多不同“層”。我正在更改使用者介面,向模型新增欄位,修改驗證等等。而不是跨層耦合,我們沿著切片垂直耦合。 最小化切片之間的耦合,並使切片中的耦合最大化。
https://jimmybogard.com/vertical-slice-architecture/
它不是從技術角度(例如域與基礎結構與應用程式邏輯)著眼於關注點分離,而是從反映業務域的功能的角度出發。同樣,毫無疑問,保持資料訪問與域邏輯分離是關鍵。
banq注:垂直切片類似微服務:
相關文章
- DDD聚合:樂觀併發 -James Hickey
- DDD本質是分而治之的分析方法 - James Hickey
- 領域驅動設計中的聚合是什麼? - James Hickey
- DDD聚合:一致性邊界 -James Hickey
- 否定洋蔥或clean架構的垂直切片架構 - Jimmy Bogard架構
- 建立微服務很容易,但是有幾點很難 - James Hickey微服務
- Flutter應用的Clean架構示例專案Flutter架構
- Clean Architecture - 清晰簡潔的Android 應用架構Android應用架構
- Spring Boot的Clean架構教程與原始碼 - BaeldungSpring Boot架構原始碼
- 清晰架構(Clean Architecture)的Go微服務—重大升級架構Go微服務
- 用Quarkus實現乾淨清晰的Clean架構 - Sourced Blog架構
- Clean架構能夠解決哪些問題? - jbogard架構
- 帶你動手實現 MVP+Clean架構!MVP架構
- 手把手寫一個Clean(+mvp+rxjava)架構的DemoMVPRxJava架構
- 人壽保險銷售平臺的領域驅動設計和事件風暴案例分享 -James Hickey事件
- 領域驅動設計和Clean架構之間的區別? - stackexchange架構
- 架構中的“大象”架構
- 奈飛Netflix如何在資料整合API領域使用六邊形架構與Clean架構切換到微服務架構? - Netflix TechBlogAPI架構微服務
- SVN中clean up的含義
- 單體架構&微服務架構&中臺服務架構架構微服務
- Wi-Fi訊號不好?混合組網架構是最佳選擇架構
- EdgeBoard中CNN架構的剖析CNN架構
- DNS在架構中的使用DNS架構
- Xilem:Rust中的UI架構RustUI架構
- 架構安全性設計、部分示例及原理分析架構
- Nestjs系列 Nestjs中的AOP架構JS架構
- C#中的微服務架構C#微服務架構
- 關於Clean Architecture在android中的應用Android
- 前端的Clean Architecture前端
- 為什麼大部分碼農做不了架構師?架構
- 如何架構一箇中後臺專案的前端部分(webpack + 介面配置篇)架構前端Web
- [20180309]不好的資料結構設計.txt資料結構
- 架構設計中的基本原則架構
- MongoDB中的分散式叢集架構MongoDB分散式架構
- 如何在敏捷中交付可靠的架構?敏捷架構
- 事件驅動架構EDA中的元件事件架構元件
- 混合雲中的事件驅動架構事件架構
- 設計Android應用程式架構的基本指南:MVP:第2部分Android架構MVP