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

软件架构及几种典型框架 什么是软件架构?什么是软件框架?很多时候,我们常常会混用架构和框架这两个词。实际上,广义上的架构和框架在概念上有很大的不同,架构给人的感觉,包容上更大,所以实际上架构是包含了框架的概念的。广义的架构应为一个系统的架构,不仅仅涉及软件中的技巧,更有系统的观念与视角在其中;不仅要考虑代码的因素,更要布局非代码的因素;不仅仅有技术的内容,更有管理的内容在其中。而为了便于讨论,这里的架构很多时候是指狭义上的纯技术上的架构,我们根据表达需要,将其与框架混用。 就单纯的框架而言,其核心是抽象。抽象就是统...... 阅读详情
AI摘要

本文探讨了模块化和插件式软件框架的设计原则,强调高度独立、接口规范,并通过实例展示了如何从需求管理出发构建框架,包括模块编号、ID唯一性、信息交换机制及插件的无缝插拔。

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

关键字:插件化 模块化 软件框架 C++ Golang Rust Delphi

目录

一、前述

二、模块化原则

1、高度独立

2、接口规范

三、从管理需求出发

四、框架雏形

五、接口引用规定

六、子模块与代码模板

七、把优秀当作一种习惯

八、信息交换方式

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

十、框架总图

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


一、前述

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

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

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

二、模块化原则

1、高度独立

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

2、接口规范

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

三、从管理需求出发

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

四、框架雏形

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

五、接口引用规定

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

六、子模块与代码模板

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

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

七、把优秀当作一种习惯

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

八、信息交换方式

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

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

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

十、框架总图

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

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

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

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

插件式模块化软件框架的思想图解二(案例篇)(码客卢益贵)_ygluu的博客-优快云博客

Android插件化主流框架和实现原理 只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取! 阅读详情

相关推荐

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

一、前言 本人推崇模块化设计,不是基于技术深度,而是基于管理高度(如何在多变的项目需求中提高开发效率、缩短开发周期)。本文将通过一个《火车在途实时信息系统》的火车实时和历史轨迹显示部分的简要阐述来“插件式模块化软件框架思想”的理解和应用(实际项目设计要复杂得多)。 本文涉及项目截图均已向社会公众公开,本文仅阐述行业惯例或通用做法部分,不涉及商业秘密和专利核心技术。 阅读本文前最好先阅读本人上一篇博文《插件式模块化软件框架的思想图解一(框架篇)》: https://blog.youkuaiyun.com/gues

码客 卢益贵 ygluu 2394

什么是框架?软件框架定义

您可以使用它从单个代码库为 Android、Windows、Linux、macOS、iOS、Web 等设备开发跨平台应用程序。它是由曾在谷歌工作过的 Evan You 创建的,目的是利用 Angular 的最佳部分并围绕它构建一个自定义工具。Bootstrap是一个框架,它使开发人员可以使用一组可重用的 HTML、CSS 和 JavaScript 代码轻松构建完全响应的网站或 Web 应用程序。您可以在软件工程的所有领域找到这些框架,包括 Web 开发(前端和后端)、移动应用程序、数据科学等等。

我的博客,不一样的自我表达 1216

框架设计原理与实战:插件式框架的设计与实现

作者:禅与计算机程序设计艺术 1.背景介绍 插件式框架是一个开放性、可扩展性强、灵活可配置的系统架构模式。它允许开发人员自由地选择各种功能模块组合成一个完整的应用系统,从而达到提升开发效率、降低开发难度、节省资源消耗等目标。插件式框架对系统开发者和用户来说都有利,可以有效地解决复杂系统开发难题,提高

AI天才研究院 439

插件式开发架构综述

投稿者: 地下潜行者 1. 概述 在现有软件开发中,业务越来越复杂,代码规模越来越大,依赖的人力也越来越多。为了降低系统模块内部耦合度,减少开发难度,也为了能够支持多团队的并行开发,插件式开发架构变得愈加流行,尤其是在桌面软件、移动端应用中。对于后端开发,微服务的形式也越来越流行,但是据笔者看来,微服务的很多设计思路,和插件式开发架构的设计理念也有相近之处。Eclipse, Visual Studio, VSCode等,都是插件式开发架构的典型案例。 现代软件提供插件式开发架构,一方面是服务于产品自身内部开

一个程序员的修炼之路 5549

音频质量评估指标全解析:从主观到客观的全面指南

本文全面解析了音频质量评估的核心指标,涵盖主观评价(如MOS、DMOS)与客观评价(如PESQ、STOI、SDR)。重点介绍了DNSMOS等AI驱动的无参考评估方法,并提供了根据语音通信、噪声抑制、语音分离等不同场景选择指标组合的实战指南,帮助开发者和研究者科学量化音频质量。

rum55的博客 641

解锁Cherry Studio高阶玩法:用MCP实现自动化测试与数据爬取

本文深入探讨了如何利用MCP协议与Cherry Studio结合,实现自动化测试与数据爬取的高阶应用。通过Playwright等工具的MCP集成方案,详细解析了自动化测试流水线构建和智能爬虫系统开发的关键技术,显著提升工程效率和系统适应性。

defi6farmer的博客 274

插件化架构设计(2):插件化从设计到实践该考量的问题汇总

插件化架构又称微核架构,指的是软件的内核相对较小,主要功能和业务逻辑都通过插件实现。插件化架构一般有两个核心的概念:内核和插件。内核(pluginCore)通常只包含系统运行的最小功能;插件(plugin)则是互相独立的模块,一般只会提供单一的功能。内核除了插件的管理功能,还会将要完成的所有业务进行抽象,抽象出最小粒度的基础接口,供插件方来调用。这样,插件开发的效率将会极大的提高。

周陆军的博客,分享it技术。 3098

从SSD到UFS:3分钟搞懂存储技术进化史(含最新协议对比)

本文梳理了从SSD到UFS的存储技术演进历程,重点解析了eMMC与UFS在架构上的核心差异。UFS凭借高速串行全双工接口,实现了性能与能效的飞跃。文章还对比了最新的UFS 4.0与PCIe 5.0 SSD协议,并探讨了3D NAND、SLC缓存等底层技术,揭示了移动与PC存储技术融合的未来趋势。

weixin_29294597的博客 274

插件式模块化软件框架的思想图解三(数据交换系统和条件系统)

文本主要介绍独立模块之间用于数据交换的数据交换系统、条件系统和公式系统组成的数据平台的设计思想,以及介绍围绕数据平台的生产-消费模型。

码客 卢益贵 ygluu 1875

echarts实现折线图上下限区域展示

效果图: 画这种区域中主要是利用了series的两个属性: 思路:上下限都画上区域,然后折线利用图形透明度隐藏,给上区域加上颜色,给下区域加上白色(echarts图背景是啥色,就加啥色) lineStyle: { opacity: 0 }, // 图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形 areaStyle: { color: 'rgba(0,122,255,0.1)' }, // 填充的颜色 我的需求是最大天数、最小天数、

小太阳的博客 1万+

Oracle 常用语法汇总

CREATE TABLE 表名(COMMENT ON COLUMN 注释;-- 创建一个学生表STUDENT_ID NUMBER(10) PRIMARY KEY, -- 学生ID,主键FIRST_NAME VARCHAR2(50) NOT NULL, -- 学生名字,不允许为空LAST_NAME VARCHAR2(50) NOT NULL, -- 学生姓氏,不允许为空EMAIL VARCHAR2(100) UNIQUE, -- 学生电子邮箱,唯一。

拽着尾巴的鱼儿的博客 2153

游戏高度可配置化(一)通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解

在插件式模块化软件开发当中,既要模块高度独立(解耦)又要共享模块数据,最好的方法是有个中间平台(中间件)提供标准的接口来进行数据的交换,这在很多行业软件开发中已经广泛应用。但是,由于中间件的抽象和封装没有具备通用性的前提,使得在实际应用中受到了很大的制约。本文将以“数据引擎”的概念来阐述通用数据中间件的理论和构成,以及以“通用数据引擎在游戏开发中的应用构想”来作为其的应用范例。本文主要针对服务端开发,但客户端也可以参考。

码客 卢益贵 ygluu 1333

PyCharm配置SSH和SFTP远程连接服务器

关于这篇博文,主要因为公司企业都是通过本地测试,同步到服务器进行跑动,舍友看着同事丝滑的操作,让我做个教程。本着钻研的精神,写下了这篇博客记录 关于pycharm这个软件,只有专业版才有远程连接的这个配置,社区版没有(同事一再强调要专业版,学生认证还可申请免费) 关于SSH和SFTP都是一种协议 具体知识点补充可看我这篇文章: 【计算机网络】常见面试题集锦(全) SSH:提供安全通道进行远程登录 SFTP协议可以远程文件传输获取等,数据的安全传输主要由SSH连接提供

码农研究僧的博客 5533

Buck 模块化架构迁移实战:从 buck_module 构建规则到 BuckModule 注解的插件式扩展指南

Buck 模块(Buck modules)是独立打包、通过自身类加载器加载、仅依赖核心 Buck 功能与显式声明依赖的功能包,是 Buck 将代码库解耦为小型可复用单元的关键架构。本文以 [模块框架说明文档](https://link.gitcode.com/i/88dc0a842652e48929630205afa8b733) 为主体,结合 `module_rules.bzl` 宏实现、`Buc

gitblog_01160的博客 147

OpenClaw实战系列02:企业微信接入完全指南

本文详细介绍了如何将OpenClaw与企业微信对接,实现智能机器人功能。主要内容包括:企业微信侧创建智能机器人或自建应用,获取必要凭证和权限;OpenClaw侧安装配置企业微信插件,设置通信通道;完成双向验证并进行功能测试。文章提供了详细的配置步骤、常见问题排查方法和进阶玩法,帮助用户在30分钟内完成对接。关键点包括:确保URL可访问、Token一致、网关正常运行,以及针对不同部署环境(云服务器/内网)的配置差异。

PeterPan的博客 3811

23、微波电路中的过孔、过孔围栏与接地焊盘建模分析

本文详细分析了微波电路设计中过孔、过孔围栏及接地焊盘的建模与优化方法。探讨了过孔模型的发展及其电感与电容特性,通过场求解器和集总元件模型提高建模精度。此外,分析了过孔隔离围栏在改善信号隔离中的作用,并通过2.5D和3D电磁仿真验证其效果。最后,研究了接地焊盘中过孔布局对电路稳定性的影响,提出了优化过孔位置以消除谐振和杂散振荡的方法。文章为微波电路设计提供了重要的理论支持和实践指导。

convnet3designer的博客 164

Traccar GPS追踪系统源码架构解析:核心模块调用关系全图解

Traccar是一款开源的GPS追踪系统,支持多种设备和协议,为车辆、人员和资产提供实时位置监控服务。作为专业的GPS追踪解决方案,Traccar在源码设计上采用了模块化架构,各个核心组件分工明确,协作高效。🚀 ## 系统启动流程解析 Traccar的启动入口位于 `Main.java` 文件,通过Google Guice依赖注入框架来管理各个模块的生命周期。系统启动时会依次初始化以下关键服

gitblog_01040的博客 985

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

终极LSPosed框架完全指南:30分钟学会Android应用自定义开发

你是否曾想过修改Android应用的功能却不想重新编译APK?是否遇到过想要增强某个应用但苦于没有源码?LSPosed框架正是为解决这些问题而生!这是一个强大的Android运行时Hook框架,让你能够在应用运行时修改其行为,无需修改原始APK文件。本指南将带你从零开始,在30分钟内掌握LSPosed框架的核心概念和实战开发技巧。 ## 从用户痛点出发:为什么需要LSPosed? 想象一下这样

gitblog_00086的博客 905

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

linux 图解常用的云运维监控工具

原文地址:https://jingyan.baidu.com/article/3a2f7c2e3b7d3726aed61157.html 图解常用的云运维监控工具 随着云计算和互联网的高速发展,大量应用需要横跨不同网络终端,并广泛接入第三方服务(如支付、登录、导航等),IT系统架构越来越复杂。快速迭代的产品需求和良好的用户体验,需要IT运维管理者时刻保障核心业务稳定可用,而企业运维中...

dmoi77214的博客 684

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

vsftp基础知识篇

1.FTP概述2.工作原理一个完整的FTP文件传输需要建立两种类型的连接,一种为文件传输下命令,称为控制连接,另一种实现真正的文件传输,称为数据连接。控制连接:客户端希望与FTP服务器建立上传下载的数据传输时,它首先向服务器的TCP 21端口发起一个建立连接的请求,FTP服务器接受来自客户端的请求,完成连接的建立过程,这样的连接就称为FTP控制连接。数据连接:FTP控制连接建...

weixin_34044273的博客 160

图解常用的云运维监控工具

随着云计算和互联网的高速发展,大量应用需要横跨不同网络终端,并广泛接入第三方服务(如支付、登录、导航等),IT系统架构越来越复杂。快速迭代的产品需求和良好的用户体验,需要IT运维管理者时刻保障核心业务稳定可用,而企业运维中的痛点和难点也急需解决。 1、面向业务的运维,不但关心单点IT资源的运行状态,更关心整个业务系统的健康状态 2、如果企业使用了大量的API和模块化应用,那么关注每个...

dmoi77214的博客 956

国内java开源商城系统

MCMS(http://ms.mingsoft.net)是企业创立初期很好的基础框架,不仅可以实现和现有系统的对接而且有大量的插件模版可以使用。 MS平台开发团队承诺MCMS内容管理系统永久完整开源免费(这真是极好的)!下面就简单的给大家介绍一下MS平台和MCMS为什么如此之快。 MS平台...

chican2120的博客 456

【NestJS】依赖注入:超越自动new的深层解析

NestJS 依赖注入(DI)远不止简单的自动实例化类,而是一套完整的对象生命周期管理系统。它基于 IoC 容器实现依赖图解析,结合工厂模式、单例模式等设计模式,提供强大的模块化能力。核心优势包括:通过抽象接口实现可插拔架构、轻松mock依赖提高可测试性、支持不同作用域实例(单例/请求/瞬时)等。这种机制实现了控制反转,让业务代码无需关心依赖创建,使系统更灵活、可扩展且易于维护。

qq_59344127的博客 765

3步掌握AI视频创作:ComfyUI高级扩展实战

在AI视频生成技术快速发展的今天,ComfyUI-WanVideoWrapper作为专业级扩展框架,为开发者提供了从基础到进阶的完整解决方案。本文将通过"核心理念→实战演练→深度优化"的三段式结构,带你深入理解这一强大的AI视频创作工具。 ## 核心理念:模块化AI视频生成架构 ### 设计哲学:解耦与扩展 ComfyUI-WanVideoWrapper的核心设计理念在于将复杂的AI视频生成

gitblog_00305的博客 764

【体系-单体架构】14-模块间的通信

针对商城项目前台与运营的前提知识点

SomeWay 734
上一篇: git(gitlab)子模块功能在团队协同开发和生产环境中的应用(git,gitlab,TortoiseGit,CI/CD,Jenkins,docker-compose,分支合并,开发环境,测试环境)
下一篇: C++高效低延时有锁队列测试程序
ygluu
博客等级 码龄17年 300粉丝 62原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值