【Linux】C++項目分層架構:核心三層與關鍵輔助

C++ 項目分層架構全指南:核心三層 + 關鍵輔助


一、核心三層架構

傳統的三層架構(或三層體系結構)是構建健壯系統的基石,包括以下三層:

1. 表現層(Presentation Layer)

負責展示和輸入處理,是與用戶互動的界面層。

  • 示例:命令行工具、Qt GUI、Web 前端、REST/HTTP 接口。
  • 職責:數據校驗、輸入解析、格式化輸出,不包含業務邏輯或直接訪問數據庫。
  • 注意:只能調用下一層,不得直接調用數據存取層。([Reddit][1])

2. 業務邏輯層(Business Logic Layer / Application Layer)

系統的“核心大腦”,實現核心算法和業務流程。

  • 示例:訂單處理、數據驗證、規則計算、緩存邏輯。
  • 職責:處理數據轉換、業務運作,通過調用數據層獲取/存儲數據。
  • 原則:不依賴 UI,也不直接操作數據庫,只依賴抽象接口。

3. 數據訪問層(Data Access Layer / DAL)

封裝對數據源(文件、數據庫、網絡等)的訪問。

  • 示例:SQLite/MySQL/PostgreSQL 訪問、ORM 封裝、文件讀寫、網絡 API 客戶端。
  • 職責:CRUD 和事務處理,向業務層提供數據模型。
  • 注意:DAL 應與具體數據源解耦,可使用抽象接口切換實現。

二、關鍵輔助層與模式

4. 實體 / 模型層(Domain / Entity Layer)

在 UI、業務與數據之間共享的輕量模型層。

  • 示例:User, Order, Product 等結構體/類。
  • 用法:由業務層和 DAL 共享,不依賴 UI 或存儲實現。([softwareengineering.stackexchange.com][2])

5. 接口 / 服務契約層(Interface / Contract Layer)

定義調用協議,使用抽象來實現跨層通信。

  • 示例:IUserRepository, IOrderService, ILogger
  • 優點:支持依賴注入與單元測試,具體實現可替換。

6. 工具與第三方集成層

支持日志、配置、工具集、跨層插件。

  • 示例:Logger, ConfigManager, Metrics, 插件如 Boost.Log, spdlog。
  • 層次:為所有層提供工具支持,不參與核心業務。

三、C++ 實現建議

模塊劃分

每層應作為獨立靜態/動態庫:

presentation/  
business/  
dataaccess/  
domain/  
interfaces/  
tools/

優點:各層獨立編譯、不同團隊并行開發、熱替換實現。

接口實現示例

// interfaces/IUserRepository.h
struct User { int id; std::string name; };class IUserRepository {
public:virtual ~IUserRepository() = default;virtual std::optional<User> GetById(int id)=0;virtual void Save(const User& u)=0;
};

業務操作樣例

// business/UserService.h
class UserService {std::shared_ptr<IUserRepository> repo_;
public:UserService(auto repo): repo_(repo){}User GetUser(int id) {if(auto u=repo_->GetById(id)) return *u;throw std::runtime_error("Not found");}
};

數據層示例(SQLite)

class SqliteUserRepository: public IUserRepository {sqlite::database db_;
public:SqliteUserRepository(const std::string& path): db_(path){}std::optional<User> GetById(int id) override { /* SQL查詢邏輯 */ }void Save(const User& u) override { /* SQL 插入/更新 */ }
};

應用層啟動與依賴注入

int main(){auto repo = std::make_shared<SqliteUserRepository>("users.db");UserService svc(repo);// 處理 CLI 或 HTTP 接口調用 svc
}

四、測試與插件增強

  • 單元測試:用 mock 替換數據層,測試業務邏輯。
  • 集成/端到端測試:啟動服務,使用真實或內存數據庫測試全流程。
  • 插件增強:如日志(spdlog)、配置(Boost.Program_options)、Metrics、監控(Prometheus -> Grafana)。

五、總結與最佳實踐

原則描述
單一職責每層專注職責,降低耦合。
依賴方向上層依賴下層,使用接口抽象其依賴。
可替換實現數據層可不換存儲,UI 可切換視圖方式。
可測試性接口 + 模擬讓單測成為可能。
模塊化構建分庫/分模塊,支持并行開發和CI。
日志與配置用統一工具支撐整個系統。

推薦學習資源

  • “Pattern?Oriented Software Architecture” — 深入理解分層模式。([modernescpp.com][3])
  • C++《Clean Architecture》或類似系列,關注 DDD + Clean/Cleaner 層。
  • Reddit r/cpp 討論,如 “Write functions that operate only on inputs” 等優良實踐。([Reddit][4])

Pattern?Oriented Software Architecture(POSA)


什么是 POSA?

“Pattern?Oriented Software Architecture” 是一套由 Frank Buschmann 等人于 1996–2007 期間陸續出版的系列著作,旨在從體系結構視角系統化地闡述軟件模式(patterns)([Wikipedia][1])。這一系列共五卷,主題覆蓋:

  1. Vol.1 A System of Patterns – 大型系統的結構、設計和細節習慣;
  2. Vol.2 Patterns for Concurrent and Networked Objects – 并發與分布式對象設計;
  3. Vol.3…Vol.5 – 專注資源管理、分布式系統語言與其它領域([Wikipedia][1])。

為什么值得一讀?
1. 跨層次的架構洞察

Vol.?1 則特別出色,不僅提供了從高層架構模式(如 MVC、Microkernel)到中低層設計模式,再到代碼級別 idioms(習慣用法),構成了一個完整的“模式體系”,適用于不同抽象層級。

2. 實踐中提煉的經驗

書中提到的模式并非理論堆砌,而是作者從實際項目中提煉出的“久經考驗”的模式([daneshjavaji.files.wordpress.com][2])。ACCUI 評論指出 Volume?2 是“更重要的貢獻,值得成為標準參考”([accu.org][3])。

3. 深受好評的經典著作
  • ACCU 評論稱其為“重要作品,值得進入典型參考書目”;
  • JavaWorld 評論指出其“對應用架構師而言是最佳模式集”;
  • GoodReads 上評分 ~3.9/5,用戶評價整體積極。

如何使用這套書?
  • Vol.1 是起點,適合學習系統結構和模式之間如何互聯。
  • Vol.2–Vol.4 可根據項目特性選取,比如需要并發/網絡,就讀 Vol.?2;資源密集型系統則看 Vol.?3,分布式系統重點看 Vol.?4。
  • Volume?5 可作為“模式語言及其原理”背景閱讀。

實踐建議
階段做什么
學習先看 Volume?1,熟悉架構模式與結構 idioms
項目定制在系統或模塊初期選定合適模式
針對性閱讀根據并發、資源或分布式需求選讀相關卷
擴展搭配《Design Patterns (GoF)》深入設計細節([Goodreads][4], [Wikipedia][1], [Wikipedia][5])

小結

“Pattern?Oriented Software Architecture” 系列是從架構層面系統介紹模式的經典著作,適合想在 C++、Java 等語言中構建大型、可擴展系統的開發者。它提供:

  • 理論與實踐結合的模式體系
  • 系統化的跨層架構思考
[1]: https://en.wikipedia.org/wiki/Pattern-Oriented_Software_Architecture?utm_source=chatgpt.com "Pattern-Oriented Software Architecture"
[2]: https://daneshjavaji.files.wordpress.com/2018/02/sznikak_jegyzet_pattern-oriented-sa_vol1.pdf?utm_source=chatgpt.com "[PDF] Wiley - Pattern-Oriented Software Architecture - WordPress.com"
[3]: https://accu.org/bookreviews/2000/glassborow_1219/?utm_source=chatgpt.com "REVIEW - Pattern-Oriented Software Architecture"
[4]: https://www.goodreads.com/series/97027-pattern-oriented-software-architecture?utm_source=chatgpt.com "Pattern-Oriented Software Architecture Series by Frank Buschmann"
[5]: https://en.wikipedia.org/wiki/Design_Patterns?utm_source=chatgpt.com "Design Patterns"[1]: https://www.reddit.com/r/cpp/comments/cfzt1u/backend_architecture_with_c/?utm_source=chatgpt.com "Backend architecture with C++ : r/cpp - Reddit"
[2]: https://softwareengineering.stackexchange.com/questions/339597/3-tier-data-access-layer-usage?utm_source=chatgpt.com "3-tier data access layer usage - Software Engineering Stack Exchange"
[3]: https://www.modernescpp.com/index.php/layers/?utm_source=chatgpt.com "Layers – MC++ BLOG - Modernes C++"
[4]: https://www.reddit.com/r/cpp/comments/uu3vn4/c_design_patterns_and_architecture_for_building/?utm_source=chatgpt.com "C++ design patterns and architecture for building computational ..."

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88577.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88577.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88577.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【機器學習】保序回歸平滑校準算法

保序回歸平滑校準算法&#xff08;SIR&#xff09;通過分桶合并線性插值解決廣告預估偏差問題&#xff0c;核心是保持原始排序下糾偏。具體步驟&#xff1a;1&#xff09;按預估分升序分桶&#xff0c;統計每個分桶的后驗CTR&#xff1b;2&#xff09;合并逆序桶重新計算均值&a…

項目開發日記

框架整理學習UIMgr&#xff1a;一、數據結構與算法 1.1 關鍵數據結構成員變量類型說明m_CtrlsList<PageInfo>當前正在顯示的所有 UI 頁面m_CachesList<PageInfo>已打開過、但現在不顯示的頁面&#xff08;緩存池&#xff09; 1.2 算法邏輯查找緩存頁面&#xff1a;…

60 美元玩轉 Li-Fi —— 開源 OpenVLC 平臺入門(附 BeagleBone Black 驅動簡單解析)

60 美元玩轉 Li-Fi —— 開源 OpenVLC 平臺入門&#xff08;附 BeagleBone Black 及驅動解析&#xff09;一、什么是 OpenVLC&#xff1f; OpenVLC 是由西班牙 IMDEA Networks 研究所推出的開源可見光通信&#xff08;VLC / Li-Fi&#xff09;研究平臺。它把硬件、驅動、協議棧…

Python性能優化

Python 以其簡潔和易用性著稱,但在某些計算密集型或大數據處理場景下,性能可能成為瓶頸。幸運的是,通過一些巧妙的編程技巧,我們可以顯著提升Python代碼的執行效率。本文將介紹8個實用的性能優化技巧,幫助你編寫更快、更高效的Python代碼。   一、優化前的黃金法則:先測…

easyui碰到想要去除頂部欄按鈕邊框

只需要加上 plain"true"<a href"javascript:void(0)" class"easyui-linkbutton" iconCls"icon-add" plain"true"onclick"newCheck()">新增</a>

C++字符串詳解:原理、操作及力扣算法實戰

一、C字符串簡介在C中&#xff0c;字符串的處理方式主要有兩種&#xff1a;字符數組&#xff08;C風格字符串&#xff09;和std::string類。雖然字符數組是C語言遺留的底層實現方式&#xff0c;但現代C更推薦使用std::string類&#xff0c;其封裝了復雜的操作邏輯&#xff0c;提…

CMU15445-2024fall-project1踩坑經歷

p1目錄&#xff1a;lRU\_K替換策略LRULRU\_K大體思路SetEvictableRecordAccessSizeEvictRemoveDisk SchedulerBufferPoolNewPageDeletePageFlashPage/FlashAllPageCheckReadPage/CheckWritePagePageGuard并發設計主邏輯感謝CMU的教授們給我們分享了如此精彩的一門課程&#xff…

【C語言進階】帶你由淺入深了解指針【第四期】:數組指針的應用、介紹函數指針

前言上一期講了數組指針的原理&#xff0c;這一期接著上一期講述數組指針的應用以及數組參數、函數參數。首先看下面的代碼進行上一期內容的復習&#xff0c;pc應該是什么類型&#xff1f;char* arr[5] {0}; xxx pc &arr;分析&#xff1a;①首先判斷arr是一個數組&#x…

在HTML中CSS三種使用方式

一、行內樣式在標簽<>中輸入style "屬性&#xff1a;屬性值;"。(中等使用頻率)不利于CSS樣式的復用&#xff1b;違背了CSS內容和樣式分離的設計理念&#xff0c;后期難以維護。<p style"color: red">這是div中的p元素</p>二、內部樣式在…

汽車功能安全-軟件單元驗證 (Software Unit Verification)【用例導出方法、輸出物】8

文章目錄1 軟件單元驗證用例導出方法2 測試用例完整性度量標準3 驗證環境要求4 軟件單元驗證的工作產品1 軟件單元驗證用例導出方法 為確保軟件單元測試的測試案例規范符合9.4.2要求&#xff0c;應通過表8所列方法開發測試用例。 表8 軟件單元測試用例的得出方法&#xff1a; …

MySQL內置函數(8)

文章目錄前言一、日期函數二、字符串函數三、數學函數四、其它函數總結前言 其實在之前的幾篇中我們也用到了內置函數&#xff0c;現在我們再來系統學習一下它&#xff01; 一、日期函數 函數名稱描述current_date()獲取當前日期current_time()獲取當前時間current_timestamp(…

蒼穹外賣項目日記(day04)

蒼穹外賣|項目日記(day04) 前言: 今天主要是接口開發, 涉及的新東西不多, 需要注意的只有多表聯查和修改的邏輯,今日難點: 1.菜品的停起售狀態設置 2.套餐的停起售狀態設置 3.動態sql中的 useGeneratedKeys 與 keyProperty 兩個參數 一. 菜品的停起售狀態設置 ? 在菜品的停售中…

React之旅-05 List Key

每個React的初學者&#xff0c;在調試程序時&#xff0c;都會遇到這樣的警告&#xff1a;Warning: Each child in a list should have a unique "key" prop. 如下面的代碼&#xff1a; const list [Learn React, Learn GraphQL];const ListWithoutKey () > (&l…

[特殊字符] 人工智能技術全景:從基礎理論到前沿應用的深度解析

&#x1f680; 人工智能技術全景&#xff1a;從基礎理論到前沿應用的深度解析 在這個AI驅動的時代&#xff0c;理解人工智能的核心技術和應用場景已成為技術人員的必備技能。本文將帶你深入探索AI的發展脈絡、核心技術差異以及在各行業的創新應用。 文章目錄&#x1f680; 人工…

Go語言教程-環境搭建

前言 Go&#xff08;又稱 Golang&#xff09;是由 Google 開發的一種 開源、靜態類型、編譯型 編程語言&#xff0c;于 2009 年正式發布。它旨在解決現代軟件開發中的高并發、高性能和可維護性問題&#xff0c;尤其適合 云計算、微服務、分布式系統 等領域。 Go 語言國際官網…

windows指定某node及npm版本下載

下載并安裝 nvm-windowshttps://github.com/coreybutler/nvm-windows/releases&#xff08;選擇 nvm-setup.zip&#xff09;。打開命令提示符&#xff08;管理員權限&#xff09;&#xff0c;安裝 Node.js v16.15.0&#xff1a; nvm install 16.15.0 nvm use 16.15.0 驗證node版…

每天一個前端小知識 Day 28 - Web Workers / 多線程模型在前端中的應用實踐

Web Workers / 多線程模型在前端中的應用實踐&#x1f9e0; 一、為什么前端需要多線程&#xff1f; 單線程 JS 的瓶頸&#xff1a;瀏覽器主線程不僅負責執行 JS&#xff0c;還要負責&#xff1a; UI 渲染&#xff08;DOM/CSS&#xff09;用戶事件處理&#xff08;點擊、輸入&am…

python:ImportError: cannot import name ‘ParameterSource‘ from ‘click.core‘

瀏覽器訪問網站拋錯&#xff1a;ImportError: cannot import name ParameterSource from click.core (E:\environment\python\Lib\site-packages\click\core.py)問題分析&#xff1a;1. click 版本問題ParameterSource 可能是在某個特定版本的 click 庫中引入的&#xff0c;而你…

flink 去重

LOCALTIMESTAMP as time_stamp ts as case when time is null then CURRENT_TIMESTAMP else TO_TIMESTAMP_LTZ(time, 0) end , watermark for ts as ts - interval ‘60’ second PARTITION BY 的都有回撤流 group by 的沒有回撤流 因為算的是指標 開窗又慢 SELECT * FROM (…

【音視頻】TS協議解析

參考博客&#xff1a;https://blog.csdn.net/rell336/article/details/38109621?utm_mediumdistribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_sourcedistribute.pc_relevant_t0.none-task-blog-BlogCommendFromMac…