【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…