插件式模块化软件框架的思想图解一(框架篇)

插件式模块化软件框架的思想图解一(框架篇)

  • Chapter1 插件式模块化软件框架的思想图解一(框架篇)
    • 一、前述
    • 二、模块化原则
      • 1、高度独立
      • 2、接口规范
    • 三、从管理需求出发
    • 四、框架雏形
    • 五、接口引用规定
    • 六、子模块与代码模板
    • 七、把优秀当作一种习惯
    • 八、信息交换方式
    • 九、模块编号和ID的唯一性
    • 十、框架总图
    • 十一、插件拔插(一键删除不留残余)
  • Chapter2 插件式模块化软件框架的思想图解二(案例篇)
    • 一、前言
    • 二、框架总图
    • 三、模块划分
    • 四、配置及资源文件目录结构设计
    • 五、对象的个性化派生设计
    • 六、源码文件目录结构设计
    • 七、数据交换机设计
    • 八、最终效果图
    • 九、后话


Chapter1 插件式模块化软件框架的思想图解一(框架篇)

原文链接:https://blog.csdn.net/guestcode/article/details/119701789

一、前述

模块化开发具有开发效率高、开发周期短等特点(其它优点不再赘述)。从本人20多年多个行业众多项目经历来说,无论是一个人开发、两个人开发,还是多人协同开发,模块化在实际应用中有非常高的实效性。

本文讨论的是开发期单体进程内源代码插件式框架思想。如果没有特别说明,本文提及的“插件”和”模块”是同一个实体概念、部分章节提及的“单元”和“子模块”是同一实体概念。

本文循序渐进讨论插件式框架思想,框架具体实现细节会因项目不同而有差别,本文不做具体阐述。

二、模块化原则

1、高度独立

要达到高度独立必须实行高度解耦。不仅要求模块代码、模块数据类型、配置文件部分高度独立,还要求模块代码文件高度独立在模块目录内,即模块专有的各类信息、源代码和代码文件均独立存在模块目录内部,不能分散在其它模块或框架内部。

在这里插入图片描述

2、接口规范

模块化设计就强调框架接口、模块接口的规范化。不管是C++还是其他语言,接口部分应该独立为一个单元文件,接口单元只保留接口相关的信息,并确保避免交叉引用。如果A模块使用B模块的接口,但B模块又引用到C模块的数据类型,那么B模块应该把C模块的类型做别名处理,保证A模块一次引用单元文件即可完成对B模块的使用操作。如果接口单元间出现交叉引用,那可能是模块功能划分不够合理。禁止跳过接口单元直接引用模块内部单元。

在这里插入图片描述

三、从管理需求出发

主导一个框架原形的不是技术基础,而是需求管理,因为在业务需求多变的情况下,如何从容快速应对变化是管理的根本问题。实际项目中,无论在开发初期,还是维护期,或者是后期的版本迭代,往往变的是业务模块,管理上就提出需求:仅变更或删除需求变动的部分。根据业务模块需求可分为:基本模块、功能模块(本文暂定名称)。基础模块是几乎不变动的业务逻辑部分,功能模块是最善变的业务需求部分。
在这里插入图片描述

四、框架雏形

框架分为:基础框架、业务框架。基础框架是通用的,和项目业务逻辑没有关系的。业务框架是和业务逻辑相关的,为业务模块提供基础的。

在这里插入图片描述

五、接口引用规定

在强调解耦高度独立的模块化系统中,它们的引用关系(依赖关系)就必须有硬性要求:“框架层”不能引用“业务模块层”(含基础模块和功能模块)、“业务基础模块层”不能引用“业务功能模块层”、“业务功能模块层”之间可以互相引用。

在这里插入图片描述

六、子模块与代码模板

无论单个业务模块的规模大小,每个业务模块可以根据功能划分为若干个子模块(单元文件)。因为我们都知道,不管单元文件还是函数方法,当它的代码行数超过一定数量的时候,共用的函数和变量就会随之增多,高度耦合的代码是不便于维护的。子模块的接口无需独立成单独文件,仅需考虑代码的私有和公共部分即可。当子模块形成一个既有定式的时候,我们就可以使用模板工具生成结构化的模块代码,那么模块开发工作就更加便捷了。

在这里插入图片描述

备注: 接口单元可能定义了公共的数据类型,所以接口单元有可能会被多个子模块引用。

在这里插入图片描述

七、把优秀当作一种习惯

说到模块化和子模块化的时候,随之而来的是增加接口代码的工作量问题,虽然代码量不多但还是增加了麻烦。先不说管理规范制度问题了,就说习惯问题:当习惯养成了以后,一切都是自然而然的事情。

在这里插入图片描述

八、信息交换方式

框架向模块推送消息:模块需向框架订阅消息,框架向模块推送消息(消息参数不能完全传递信息的情况下,模块可以向框架获取消息详细内容)。模块与模块的信息交换是通过数据交换机完成,可以避免模块单元相互引用,并且达到解耦要求(每个模块都有独立的数据存储单元,交换机仅是事件驱动和信息传递无存储功能)。当然并非100%的模块能走数据交换通道,按82法则,即使有20%的模块需要直接引用模块接口单元,在模块化要求下它们直接的依赖关系已经大大减少。

在这里插入图片描述

九、模块编号和ID的唯一性

对于独立模块内部定义的各类ID,又如何保证它具有全局唯一性?模块编号(模块ID)可以解决这个问题。模块编号是全局统筹具有全局唯一性的数值,基于模块编号乘以某个基数或者以字节为单位来移位,我们就可以在模块内部独立生成不同类型具有全局唯一性的ID。对外公开的ID在模块接口单元定义,模块内部使用的ID在模块类型定义单元定义。框架和模块接口对唯一性ID的注册均进行合法性检查。

在这里插入图片描述

十、框架总图

我们需要对需求进行共性和个性分析,以得出清晰的脉络关系。基础模块层从业务框架层派生了基础模块层的对象和接口(下图中⑴处),各个基础模块直接引用本层派生的接口。功能模块层从基础模块层派生了功能模块层的对象和接口(下图中⑵处),各个功能模块直接引用本层派生的接口。另外功能模块的子模块还可以从本层再派生功能对象(下图中⑶处),实现了极强个性化的需求。

在这里插入图片描述
在这里插入图片描述

十一、插件拔插(一键删除不留残余)

插件拔除能确保模块无残余: 当版本迭代的时候,一键删除“模块代码文件总目录”和“模块配置文件总目录”即可;单独拔除某个模块的时候,一键删除该模块的“代码文件目录”和“配置文件目录”即可(有引用关系的则再解除引用部分即可)。插件插入时把模块目录加入到项目目录中即可。插件式模块化框架大大提高了开发效率和缩短了开发周期。
在这里插入图片描述

姐妹篇《插件式模块化软件框架的思想图解二(案例篇)》:

Chapter2 插件式模块化软件框架的思想图解二(案例篇)

原文链接:https://blog.csdn.net/guestcode/article/details/119981524

一、前言

本人推崇模块化设计,不是基于技术深度,而是基于管理高度(如何在多变的项目需求中提高开发效率、缩短开发周期)。本文将通过一个《火车在途实时信息系统》的火车实时和历史轨迹显示部分的简要阐述来“插件式模块化软件框架思想”的理解和应用(实际项目设计要复杂得多)。

本文涉及项目截图均已向社会公众公开,本文仅阐述行业惯例或通用做法部分,不涉及商业秘密和专利核心技术。

阅读本文前最好先阅读本人上一篇博文《插件式模块化软件框架的思想图解一(框架篇)》:

插件式模块化软件框架的思想图解一(框架篇)(码客卢益贵)_ygluu的博客-CSDN博客

二、框架总图

为保证文章完整性,借用《框架篇》的框架总图。

在这里插入图片描述

三、模块划分

按业务需求的功能大类划分,功能模块划分好了,再去设计基础模块如何为功能模块提供服务,再深入设计“业务框架”。我把项目划分为“实时监控模块(MonitorRealTime)”和“历史数据查询模块(QueryHistory)”等若干模块(命名是为了排序需要,无关英文语法),仅举例两个模块就不作图了。

实时监控和历史轨迹都要显示火车头和轨迹信息,具体业务需求是:实时监控时火车轨迹图标是红色,历史查询时轨迹图标是蓝色,两个模块的火车头图标颜色相同。

四、配置及资源文件目录结构设计

配置及资源文件有:电子地图图层文件、素材图标文件、参数配置文件等。电子地图资源的加载需要依赖一个叫“GisMap.cfg”的配置文件,加载一个资源文件需要配置一行相关参数。原Gis系统的要求是统一配置在一个多行文件里,我做了特别处理:按模块需求分多个文件配置。

基础图层的配置信息放在公共目录处:/ResCfgs/Comm/TrainGisMap/GisMap.cfg。火车头图标的配置信息放在基础模块目录处:/ResCfgs/MuduleBase/TrainGisMap/TrainHead.cfg。红色和蓝色轨迹图标的配置信息放在功能模块目录处:/ResCfgs/MuduleFunc/MonitorRealTime/TraceRed.cfg、/ResCfgs/MuduleFunc/QueryHistory/TraceBlue.cfg。

这样,资源配置部分也满足了模块高度独立的原则要求(关于模块化原则和业务模块共性与个性划分请参阅《框架篇》),确保了模块配置文件目录删除不留残余(这在版本迭代时不会导致代码残余积累,也不会因为误删导致系统崩溃)。

在这里插入图片描述

五、对象的个性化派生设计

根据模块需求,对对象进行了个性化划分,作为最上层(图形最底层)的功能模块对象,即使这个模块删除了不会影响该对象父类被其他模块使用,也不会因为删除而留有残余在父类。
在这里插入图片描述

六、源码文件目录结构设计

目录设计思想(模块目录独立)可参考《框架篇》的模块化原则和目录总图。

在这里插入图片描述

七、数据交换机设计

类似消息中心有订阅、通知功能,但和消息中心不同,消息中心是简报形式,数据交换机是大数量的信息交换中心。

我们处理的数据有GPS轨迹数据和火车黑匣子数据,每项数据的都用唯一字符串Key来定义,向数据交换机注册数据类型的时候,数据交换机会转换成整形值,避免了高频情况下字符串处理的低效率问题。

在这个机制下,GPS和黑匣子这两个数据处理模块的代码任何一个或者全部移除,都不会导致系统崩溃,也就是当数据消费模块(持久化和监控模块)主动向数据交换机获取数据的时候返回结果是0而已。

在中后期的持续调研中发现,火车安装的黑匣子有多个厂家的且同一个厂家还有不同型号,于是我们基于原有的模块接口标准,在不改变原来的任何代码情况下,针对不同型号的黑匣子做了N个型号的黑匣子数据处理模块(插件),系统在运行时自动识别黑匣子型号并自动插入相应的数据处理模块(插件),并且可以进行热拔插(切换)不影响系统运行。

在这里插入图片描述

八、最终效果图

在这里插入图片描述

实时监控图(红色轨迹)

在这里插入图片描述

历史数据查询图(蓝色轨迹)

九、后话

插件模块化不一定适用所有项目或者项目中的所有功能,但按82法则,满足80%的业务需求就足够了。先不说后期维护,在多人协同开发时,制定接口规范之后个人就可以独立自主开发,在开发期能避免更多的沟通成本。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用ChatGPT-o1搞定论文写作!完整的8步指南

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 使用ChatGPT辅助论文写作可以显著提升效率和质量,关键在于正确的方法和对学术规范的遵守。以下将详细说明完整步骤,并提供ChatGPT的具体操作指南。 1. 确定研究…

LabVIEW继电器视觉检测系统

随着制造业的自动化与高精度要求不断提升,传统的人工检测方法逐渐难以满足高效和高精度的需求。特别是在航空航天、医疗设备等高端领域,密封继电器推动杆部件的质量直接影响到设备的性能与可靠性。LabVIEW自动化视觉检测系统,能对推动杆部件进…

SYN590RH

一般描述 SYN590RH是SYNOXO全新开发设计的一款宽电压范围,低功耗,高性能,无需外置AGC电容,灵敏度达到典型-110 dBm,400MHz~450MHz频率范围应用的单芯片ASK或00 K射频接收器。 SYN590RH是一款典型的即插即用型单片高…

网络编程_day6

目录 【0】复习 并发服务器实现思路梳理 多进程 多线程 IO多路复用select 【1】setsockopt:设置套接字属性 socket属性 设置地址重用 【2】超时检测 必要性 超时检测的设置方法 1. 通过函数自带的参数设置 2. 通过设置套接字属性进行设置 3. alarm函数与sigaction函…

Python Matplotlib:基本图表绘制指南

Python Matplotlib:基本图表绘制指南 Matplotlib 是 Python 中一个非常流行的绘图库,它以简单易用和功能丰富而闻名,适合各种场景的数据可视化需求。在数据分析和数据科学领域,Matplotlib 是我们展示数据的有力工具。本文将详细讲…

在VS中安装chatGPT

2、在VSCode中打开插件窗口 3、输入ChatGPT 4、这里有个ChatGPT中文版,就它了 5、安装 6、这时候侧边栏多了一个chatGPT分页图标,点击它 7、打个招呼 8、好像不行 9、看一下细节描述 10、根据要求按下按下快捷键 Ctrl Shift P 11、切换成国内模式 12、…

使用 ADB 在某个特定时间点点击 Android 设备上的某个按钮

前提条件 安装 ADB:确保你已经在计算机上安装了 Android SDK(或单独的 ADB)。并将其添加到系统环境变量中,以便你可以在命令行中运行 adb。 USB调试:确保 Android 设备已启用 USB 调试模式。这可以在设备的“设置” -…

一文了解Linux内核I2C子系统,驱动苹果MFI加密芯片

版本 日期 作者 变更表述 1.0 2024/10/27 于忠军 文档创建 背景:由于苹果有一套MFI IAP2的蓝牙私有协议,这个协议是基于BR/EDR的RFCOMM自定义UUID来实现IAP2协议的通信,中间会牵扯到苹果加密芯片的I2C读取,所以我们借此机…

Windows 部署非安装版Redis

1.下载Redis https://github.com/microsoftarchive/redis/releases 选择下载zip包,如Redis-x64-3.0.504.zip,并解压 2.启动非安装版redis服务 进入到redis目录,打开cmd 执行命令 redis-server.exe redis.windows.conf 3.登录redis客户端…

多个玩家在线游戏

这张图片列出了多人游戏的两种主要网络架构类型: 1. Peer-to-Peer (P2P): 点对点网络,其中每个玩家的游戏客户端直接与其他玩家的游戏客户端通信。这种架构通常用于小型或中型规模的多人游戏。 2. Client-Server: 客户端-服务器…

JavaIO流操作

目录 简介 字节输入流 获取字节输入流 读 关闭输入流 字节输出流 获取字节输出流 写 换行符 刷新 关闭输出流 字符流输入流 获取字符输入流 读 关闭输入流 字符输出流 获取字符输出流 写 换行符 刷新 关闭输出流 简介 IO流分为两大派系: …

并查集与LRUCache(Java数据结构)

前言: 学习过二叉树之后就应该知道了如何构建一颗二叉树,双亲结点和孩子节点的关系,甚至可以放在顺序表中去构建一棵二叉树! 接下来我们要以另一种方式去组织一棵树: 如何表示一棵树之间的关系?(这棵…

Nature Communications|基于深度学习的HE染色组织向特殊染色的转换

工作速览 病理学是通过视觉检查组织切片来进行的,这些切片通常用组织化学染色法染色。虽然苏木精和伊红(H&E)染色最为常用,但特殊染色可以为不同的组织成分提供额外的对比度。 **在这里,作者展示了从H&E染色…

阿里国际2025届校园招聘 0826算法岗笔试

目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间:2024/08/26 🔄 输入输出:ACM格式 ⏳ 时长:100min 本试卷分为单选,多选,编程三部分,这里只展示编程题。 1. 第一题 题目描述 小红有一个大小为 n …

goframe开发一个企业网站 模版界面5

html或者说是模板的控制 以下是是系统的设置 server:address: ":8000"serverRoot: "resource/public" #这里要加上,为以后的静态文件的引入准备openapiPath: "/api.json"swaggerPath: "/swagger"cookieMaxAge: "365…

适配器模式:类适配器与对象适配器

适配器模式是一种结构性设计模式,旨在将一个接口转换成客户端所期望的另一种接口。它通常用于解决由于接口不兼容而导致的类之间的通信问题。适配器模式主要有两种实现方式:类适配器和对象适配器。下面,我们将详细探讨这两种方式的优缺点及适…

如何在Linux系统中使用Ansible进行自动化部署

如何在Linux系统中使用Ansible进行自动化部署 Ansible简介 安装Ansible 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 Ansible的基本概念 Inventory文件 Playbooks Modules 创建Inventory文件 编写第一个Playbook 创建Playbook文件 运行Playbook 使用Handlers 编写包…

Spring Boot 3.x 整合 Druid 数据库连接池(含密码加密)

Spring Boot 3.x 整合 Druid 数据库连接池(含密码加密) 1. 为什么需要数据库连接池? 在传统的数据库连接中,每一次与数据库连接都会消耗大量的系统资源和时间。数据库连接池会提前创建一定数量的数据库连接保存在池中&#xff0…

【论文#码率控制】Rate Control for H.264 Video With Enhanced Rate and Distortion Models

目录 摘要1.前言2.编码器框架3.增强RD模型3.1 头部比特的速率模型3.2 源比特的码率模型3.3 失真模型3.4 块类型的确定 4.面向H264 Baseline Profile的码率控制算法5.实验结果6.结论和未来工作 《Rate Control for H.264 Video With Enhanced Rate and Distortion Models》 Auth…

vue和django接口联调

vue访问服务端接口 配置跨域 前端跨域 打开vite.config.js,在和resolve同级的地方添加配置。 proxy代表代理的意思 "/api"是以/api开头的路径走这个配置 target代表目标 changeOrigin: true,是开启跨域请求 rewrite是编辑路径。 (path) > pa…