c++设计模式模块与系统

c++ 中lambda 本质就是一个匿名(没有名)的函数; 可以用一个数组元素存储一个函数的指针; 通过数组下标来使用函数;

高内聚低耦合

如何理解设计模式中的高内聚低耦合

  1. 高内聚: 用于指导如何组织和划分软件设计。

    **定义:**高内聚指的是在一个模块(如一个类或函数)中,所有的元素(如方法、属性等)都紧密地关联在一起,共同完成一个单一的任务或目标。简单来说,高内聚意味着模块内部的各个部分应该围绕一个单一的目标组织起来,而不是分散在多个不同的目标上。

重点强调是组合在一起完成一个功能。 这要求把控一个api足够单一完成某项功能的一部分。

当然有的api可以做成通用的,在不同功能内部使用。 这违反单一职责原则。 但同时只要他功能足够单一同时分布在不同功能中,也不违反高内聚。 重点强调功能单一。 它告诉功能类似的api 最好分开写多个api满足特定需求,而不要尝试一个api满足不同相似功能的需求。

2.低耦合 就很好理解。 功能与功能直接不要强相关, 即修改一个地方别的地方都要多很多修改。 修改一个功能影响很多其他功能, 影响的越多耦合性越大,反之越小。

可读性与可扩展性

代码的命名规则:

(变量)(函数)(类) (结构体)()命名 展示了代码的可读性。 让人一眼就能看懂的命名。

1.匿名函数

std::vector<std::function<int32_t()>> pos_func ={[&lineup]() ->int32_t { return lineup->GetPos1Hero(); } ,[&lineup]() ->int32_t { return lineup->GetPos2Hero(); } ,[&lineup]() ->int32_t { return lineup->GetPos3Hero(); } ,[&lineup]() ->int32_t { return lineup->GetPos4Hero(); } ,[&lineup]() ->int32_t { return lineup->GetPos5Hero(); } ,[&lineup]() ->int32_t { return lineup->GetPos6Hero(); } ,};int32_t source_hero = pos_func[request.pos - 1]();

2.模版类

template<typename ...Args>
class dispatcher;
template<typename Tag, typename Ret, typename ...Args>
class dispatcher<Tag, Ret(Args...)>
{
};static dispatcher<CopyType, std::unique_ptr<LogicCopy>(user_data_ptr, const copy_elem*, const copy_para_t&, const PackFightResultPara&)>g_copy_dispatcher;

3.工厂方法

// 抽象基类// 工厂1
// 工厂2
// 工厂3
创建对象 采用模版类根据类型创建对象

4.C++ 功能的模块和系统的设计

4.1模块设计原则

模块(Module)通常指的是一组相关功能的集合,这些功能共同完成某个特定任务。模块应该是独立的,具有清晰的接口和职责。

设计原则
  • 单一职责原则(SRP):一个模块应该只有一个职责,这样它更容易理解和修改。
  • 封装:将实现细节隐藏在模块内部,只暴露必要的接口。
  • 高内聚低耦合:模块内部的功能应该高度相关(高内聚),而模块之间的依赖关系应该尽量减少(低耦合)。

4.2系统设计原则

系统是多个模块的组合

设计原则
  • 分层设计:将系统划分为不同的层次(如数据访问层、业务逻辑层、表示层等),每个层次有明确的职责。
  • 依赖注入:通过依赖注入(Dependency Injection)来管理模块之间的关系,避免硬编码依赖。
  • 事件驱动设计:使用事件和消息传递来解耦模块之间的直接依赖。
实现方法
  • 工厂模式:使用工厂模式来创建和管理模块的实例。
  • 依赖注入容器:使用依赖注入容器来管理模块之间的依赖关系。
  • 事件系统:使用事件系统来解耦模块之间的直接调用。

设计上的平衡

设计一个系统

工厂基类,工厂类1,工厂类2,工厂类3

模版类: <类型,工厂对象指针>

全局静态模版类实例:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抓包之查看http basic auth认证方式

写在前面 在这篇文章中我们看了http basic auth的认证方式&#xff0c;本文通过wireshark抓包的方式来验证http协议的交互过程。 1&#xff1a;正文 首先wireshark抓取本机回环地址&#xff08;具体看你服务情况&#xff0c;决定哪个网卡&#xff0c;我本地是运行在127的&am…

网络安全(1)_对称加密和非对称加密

1 网络安全概述 1.1 计算机网络面临的安全威协 &#xff08;1&#xff09;截获&#xff1a;攻击者从网络上窃听他人的通信内容&#xff0c;通常把这类攻击称为“截获”。在被动攻击中&#xff0c;攻击者只是观察和分析某一个协议数据单元&#xff08;PDU&#xff09;而不干扰信…

vmware中所有虚拟机都ping不通时解决方案

文章目录 1、报错内容&#xff1a;2、 报错原因&#xff1a;3、解决方案&#xff1a; 1、报错内容&#xff1a; 2、 报错原因&#xff1a; DNS解析错误。 一个虚拟机ping不通可能是网关配置问题&#xff0c;但我的网关配置也都没问题&#xff0c;而且我的所有虚拟机都ping不通…

智慧防汛平台在城市生命线安全建设中的应用

随着城市化进程的加快&#xff0c;城市基础设施的复杂性和互联性不断增强&#xff0c;城市生命线的安全管理面临前所未有的挑战。智慧防汛平台作为城市生命线安全建设的重要组成部分&#xff0c;通过现代信息技术提升城市防汛应急管理的智能化水平&#xff0c;保障城市安全。 …

自己整理的的java面试题

IO 按照流的流向分类&#xff1a;输入流和输出流 按照操作单元分类&#xff1a;可以分为字节流和字符流 按照流的角色划分&#xff1a;节点流和处理流 所有输入流的基类&#xff1a;InputStream/Reader 字节流/字符流 所有输出流的基类&#xff1a;OutputStream/Reader 字…

Android数据存储——文件存储、SharedPreferences、SQLite、Litepal

数据存储全方案——详解持久化技术 Android系统中主要提供了3中方式用于简单地实现数据持久化功能&#xff0c;即文件存储、SharedPreference存储以及数据库存储。除了这三种方式外&#xff0c;还可以将数据保存在手机的SD卡中&#xff0c;不给使用文件、SharedPreference或者…

DroneCAN 最新开发进展,Andrew在Ardupilot开发者大会2024的演讲

本文是Andrew演讲的中文翻译&#xff0c;你可以直接观看视频了解演讲的全部内容&#xff0c;此演讲视频的中文版本已经发布在Ardupilot社区的Blog板块&#xff0c;你可以在 Arudpilot官网&#xff08;https://ardupilot.org) 获取该视频&#xff1a; 你也可以直接通过Bilibili链…

(vue)启动项目报错The project seems to require pnpm but it‘s not installed

(vue)启动项目报错The project seems to require pnpm but it’s not installed 原因 该错误信息表明你的项目需要使用 pnpm 作为包管理工具&#xff0c;但系统中尚未安装 pnpm。 解决方法 【1】删除pnpm.lock 【2】npm install -g pnpm 之后再重新启动 yarn报错&#xff0…

【R安装】VSCODE安装及R语言环境配置

目录 VSCODE下载及安装VSCODE上配置R语言环境参考 Visual Studio Code&#xff08;简称“VSCode” &#xff09;是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的&#xff0c;针对于编写现代Web和云应用的跨平台源代码编辑器&…

微信小游戏/抖音小游戏SDK接入踩坑记录

文章目录 前言问题记录1、用是否存在 wx 这个 API 来判断是微小平台还是抖小平台不生效2、微小支付的参数如何获取?3、iOS 平台不支持虚拟支付怎么办?微小 iOS 端支付时序图:抖小 iOS 端支付:4、展示广告时多次回调 onClose5、在使用单例时 this 引起的 bug6、使用 fetch 或…

Python 3 教程第24篇(输入和输出)

Python3 输入和输出 在前面几个章节中&#xff0c;我们其实已经接触了 Python 的输入输出的功能。本章节我们将具体介绍 Python 的输入输出。 输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数。 第三种方式是使用文件对象的 write() 方法&#xff0c;标准输…

ChatGPT的应用场景:开启无限可能的大门

ChatGPT的应用场景:开启无限可能的大门 随着人工智能技术的快速发展,自然语言处理领域迎来了前所未有的突破。其中,ChatGPT作为一款基于Transformer架构的语言模型,凭借其强大的语言理解和生成能力,在多个行业和场景中展现出了广泛的应用潜力。以下是ChatGPT八个最具代表…

尚硅谷学习笔记——Java设计模式(一)设计模式七大原则

一、介绍 在软件工程中&#xff0c;设计模式&#xff08;design pattern&#xff09;是对软件设计中普遍存在&#xff08;反复出现&#xff09;的各种问题&#xff0c;提出的解决方案。我们希望我们的软件能够实现复用性、高稳定性、扩展性、维护性、代码重用性&#xff0c;所以…

【iOS】知乎日报总结

文章目录 前言首页网络请求轮播图上滑加载图片请求 文章详情页WKWebView的使用点赞、收藏持久化——FMDB的使用 其他问题沙盒问题单元格点击其他 总结 前言 在系统学习了OC语言和UI控件后&#xff0c;知乎日报是第一个比较大的项目&#xff0c;耗时一个多月时间&#xff0c;里面…

网安瞭望台第6期 :XMLRPC npm 库被恶意篡改、API与SDK的区别

国内外要闻 XMLRPC npm 库被恶意篡改&#xff0c;窃取数据并部署加密货币挖矿程序 网络安全研究人员发现了一起在 npm 包注册表上活跃了一年多的软件供应链攻击。名为 0xengine/xmlrpc 的 npm 包最初是一个无害的库&#xff0c;基于 JavaScript&#xff0c;用于 Node.js 的 XML…

双向链表

目录 链表的分类 概念 双向链表的实现 ① 结构 ② 初始化 ③ 打印 ④ 插入数据 ⑤ 删除数据 ⑥ 查找数据 ⑦ 在pos位置之前插入数据 ⑧ 删除pos位置的数据 ⑨ 销毁链表 总结 链表的分类 虽然有这么多的链表的结构&#xff0c;但是我们实际中最常⽤还是两种结构&…

怎么样才算得上熟悉高并发编程?

提到并发编程很多人就会头疼了&#xff1b;首先就是一些基础概念&#xff1a;并发&#xff0c;并行&#xff0c;同步&#xff0c;异步&#xff0c;临界区&#xff0c;阻塞&#xff0c;非阻塞还有各种锁全都砸你脸上&#xff0c;随之而来的就是要保证程序运行时关键数据在多线程…

PyCharm中Python项目打包并运行到服务器的简明指南

目录 一、准备工作 二、创建并设置Python项目 创建新项目 配置项目依赖 安装PyInstaller 三、打包项目 打包为可执行文件 另一种打包方式&#xff08;使用setup.py&#xff09; 四、配置服务器环境 五、上传可执行文件到服务器 六、在服务器上运行项目 配置SSH解释…

clickhouse 分片键的重要性

文章目录 背景反思为啥出现问题为啥默认的语义是local 背景 问题背景 详细内容可以看这个 反思为啥出现问题 为啥会出现链接里出现的问题&#xff0c;对于goal join 和 join 语义不一样的问题&#xff0c;那是因为分片键设计不合理的情况 如果表a和表b 都是user_id 作分片键…

S4 UPA of AA :新资产会计概览

通用并行会计&#xff08;Universal Parallel Accounting&#xff09;可以支持每个独立的分类账与其他模块集成&#xff0c;UPA主要是为了支持平行评估、多货币类型、财务合并、多准则财务报告的复杂业务需求 在ML层面UPA允许根据不同的分类账规则对物料进行评估&#xff0c;并…