悠然乱弹:聊聊模块化

简介:

序言

熟悉了TINY相关开源内容的同学都有一个印象,那就是Tiny框架的目录分得非常细,比如Tiny工程的目录结构是下面的样子的:

比如TinyUiEnterprise项目的目录结构是这样的:

再比如,我们开源的软件开发过程管理软件的地目录结构是这样的:

有少许的人看了之后,深以为然,而更多的人看了之后却觉得莫名其妙。所以今天就乱弹一下模块化。

什么是模块化?

百度了一下,发现下面的说法非常经典,就此引用一下:模块化是一种处理复杂系统分解为更好的可管理模块的方式

百度百科中,关于模块化设计是这样描述的:



模块化设计,简单地说就是程序的编写不是开始就逐条录入计算机语句和指令,而是首先用主程序、子程序、子过程等框架把软件的主要结构和流程描述出来,并定义和调试好各个框架之间的输入、输出链接关系。逐步求精的结果是得到一系列以功能块为单位的算法描述。以功能块为单位进行程序设计,实现其求解算法的方法称为模块化。模块化的目的是为了降低程序复杂度,使程序设计、调试和维护等操作简单化。

前半拉和我想表述的意思没有太大关系,大家只要看我加粗变红了的部分,就可以了。

TINY框架模块化之后的效果


  1. 随心所欲:想要啥就要啥,不想要啥就不要啥
  2. 自动组装:只要通过POM依赖或去除依赖,就可以增加或去除某一功能及其相应配置

这么说说可能比较抽象,那我说几个场景。

比如:我们经常要写Servlet、Listener、Filter,而按照J2EE早期规范,这些东西的使用是要在web.xml中配置一些内容的,而这些配置的增加或删除就会导致程序的设计和调试的复杂化,而且用了Tiny框架的模块化方面的支持,程序员只要按规范开发这些东西就好,而不必对web.xml进行相关的修改,是不是对于开发和使用都非常方便了?

比如:我们要做一个UI组件,UI组件一般会涉及到各种JS资源、CSS资源、图片、视频、字体等静态资源,按照HTML规范,我们的开发人员要使用一个UI组件,一般情况下是要引入JS、CSS资源的,而引入的顺序又是非常有讲究的,如果程序员只是依赖一个Jar包就可以,而不用关心所有的这些静态资源的位置和处理,也不用关心JS、CSS的引入,是不是对于开发和使用都非常方便了?

比如:我们在开发项目的时候,一种情况下是整个项目都放在一起的,如果能把一个完整的项目分成多个高内聚低耦合的许多个模块,那么对于开发、测试、部署是不是更加方便?是不是就更容易复用?

当然,这里举的例子还只是冰山一角。

接下来看看一张TINY框架的架构图

实际上,最终我们要把所有的软件资产都向资产库迁移--而资产库中都是我们的一个一个或小或大的模块,甚至于我们的业务单元也变成资产库中的资产。

这个时候我们的发布模式就变成下面的样子:


一个软件应用的构建只不过是制订发布计划、资产选取和参数配置而已。

总结

这里只是举了几个简单的场景,但是为了实现模块化,TINY框架做了大量的工作,解决的各种问题也多了去了。所以,模块化不是想做就可以做的,它是一个系统性工程,而系统性工程其复杂度与实现难度都是非常高的。

限于篇幅,今天只是简单乱弹了一下,感兴趣的同学可以在下面留言或通过其他方式进行探讨。

相关文章
|
安全 网络协议 Linux
如何在IDEA中使用固定公网地址SSH远程连接服务器开发环境(一)
该文介绍了如何通过IDEA设置远程连接Linux服务器的步骤,使用Cpolar内网穿透工具实现在没有公网IP的情况下进行远程开发。主要内容包括检查Linux SSH服务、本地连接测试、在Linux上安装Cpolar、创建远程连接的公网地址、公网远程连接测试以及固定连接公网地址。文章还提供了相关截图辅助说明,适用于IDEA2023.2.5版本。
|
XML SQL Java
【SSM】nested exception is org.apache.ibatis.binding.BindingException: Invalid boun原因总结
【SSM】nested exception is org.apache.ibatis.binding.BindingException: Invalid boun原因总结
1185 0
【SSM】nested exception is org.apache.ibatis.binding.BindingException: Invalid boun原因总结
|
12月前
|
人工智能 网络协议 Shell
内网穿透实现公网访问自己搭建的Ollma架构的AI服务器
内网穿透实现公网访问自己搭建的Ollma架构的AI服务器
522 1
ENVI:影像的规则裁剪和不规则裁剪
ENVI:影像的规则裁剪和不规则裁剪
559 0
|
IDE Java 编译器
scala的两种变量类型 var 和 val
scala的两种变量类型 var 和 val
307 2
scala的两种变量类型 var 和 val
|
Oracle 安全 关系型数据库
如何在openGauss/PostgreSQL手动清理XLOG/WAL 文件?
openGauss/PostgreSQL中的预写式日志WAL(Write Ahead Log),又名Xlog或redo log,相当于oracle的online redo log, 不同的是oracle online redo log是提前创建几组滚动使用,但在opengauss中只需要本配置参数控制WAL日志的周期,数据库会一直的创建并自动清理,但存在一些情况WAL日志未清理导致目录空间耗尽,或目录空间紧张时手动删除wal日志时,比如如何确认在非归档模式下哪些WAL日志文件可以安全删除?
1422 0
|
安全 网络协议 网络安全
2023年全国职业院校技能大赛信息安全管理与评估-理论题答案
2023年全国职业院校技能大赛信息安全管理与评估-理论题答案
|
Python
Python mplfinance库④ 如何自定义style样式
Python mplfinance库④ 如何自定义style样式
1726 0
Python mplfinance库④ 如何自定义style样式
|
NoSQL Cloud Native 关系型数据库
一张图读懂阿里云数据库架构和配置选择
一张图读懂阿里云数据库架构和配置选择,阿里云数据库大全
1339 1
|
JavaScript
Echarts渲染不报错但是没有内容
Echarts渲染不报错但是没有内容
582 0
Echarts渲染不报错但是没有内容