关于模块化

模块化是迄今为止对付复杂软件系统的最好的办法。
问题并不在于上面这句话。问题在于怎么模块化。这儿的“怎么模块化”并不是说不知道模块化是把系统分拆成几个模块,组合而成系统。而是说不知道以什么规则指导我们进行模块分拆。
当然,关于模块化,有很多非常著名的指导原则,最著名的莫过于“高内聚,低耦合”。可是这个原则有点太过空泛。即便如此,我们也很有必要研究一下这个原则。高内聚的好处是什么?为什么要高内聚?我个人的感觉是,高内聚降低了模块的理解成本,同时潜在的降低了模块组合的困难程度,因为高内聚比较倾向于产生一致性好的接口。低耦合呢?低耦合有一个非常直接的目的,就是为了降低模块的相互依赖程度,以便于:一、更容易替换模块和重用模块;二、强迫模块的接口简单直白。
有了这些铺垫,我准备暂时岔开话题,说说分层体系。
分层逻辑上是把同类【注意:这里是同类而不是同种,以后这儿的差别会被区分的非常清楚】的模块放置到一个叫做层的逻辑模块容器中的一种分拆方式。举例来说:把所有数据库访问类的模块放入到DAL,所有的业务逻辑放入Logical,所有的用户交互放入UI,就是一个经典的分层模式。
对于分层体系,我最大的质疑就是它简直就是低耦合,高内聚的完美反例。首先,它是低内聚的,同一层的子模块,除了逻辑上的同类性,没有别的任何需要聚合在一起的理由。其次,它是高耦合的,层与层之间的耦合关系显然典型的比层内子模块的内聚程度还要高。
那为什么分层模式是如此的流行呢?理由如下:
一、分层给了老板一个完美的项目延期的理由。也因而受到广大的受剥削受压迫的程序的大力吹捧。
二、分层流行的,所以采用分层的风险是小的,所以一定要采用分层,否则自己得全部承担反抗分层的后果,有可能是失败的后果。
三、分层在一定程度上确实解决了某些复杂性问题。
在我看来,第三个理由才是真正的好理由,虽然第一和第二个理由才是最强有力的分层理由。我说说第三个。
我要举ISO的OSI模型为例。OSI是开放系统互联的意思。先假设我们没有任何相关的背景。我们需要制作出一个可扩展的机器系统互相通信的系统。我们可以参考人类已经有的通信系统,当时已经有了语言、电话、电报、IP等等系统可供参考。通信方式从线路交换到包交换都有。问题很快区分出来了。有定址问题,有路由问题,有会话的建立和拆除等控制问题,传输问题,流量控制问题,差错控制问题,进一步还有编码问题,表示问题等等。
所有的这些问题纠缠在一块,并不很容易解决,其复杂度也超出了人类处理复杂度的极限。这时候模块化就来救驾了。由于所有的这些模块是为了一个共同的问题,所以区分出来的模块难免会有很强的耦合。而为了能够控制耦合的强度,采用了分层这种模式,用于限制模块之间任意的耦合,只允许部分模块与另部分模块耦合,也就是所谓的分层。分层就是限制了耦合关系的模块系统,只允许模块跟其上层模块和下层模块有耦合。
所以,分层,模式是为了控制耦合度的一种模块化系统。因此,它确实拥有模块化应该拥有的好处,同时还强迫系统中的模块耦合关系不能是任意的,只能是规定的。
但是,任何把分层模式推往极限的做法都不一定再是对的了。真理往前再走一小步就是谬误了。现在好多系统都是为了分层而分层,结果导致本来该存在于一个模块中的东西却被硬生生的拆分成多个模块,分布在多个层中。形成一种很强的耦合关系,而为了减轻或者消弭这种人为造成的耦合,不断的加入更多的层次,比如我们经常见到的关于VO和DAL,贫血和充血之类的争论就是这方面的争论,这不仅是搬石头上山,而且严重的降低了开发和运行效率。
再岔开一步,我们说说OO。
OO有很多有点,也有一些缺点,当年OO很火很拉风的时候,人人以OO为尊为荣,现在OO成了主流,在理论家或者先行者眼中就成了落魄者了,所以开始很批OO,以OO为卑为耻。其实无论是崇尚还是鄙夷,OO还是OO,它的优点依然存在,跟刚刚被提出来一样有效。而其缺点也依然存在,也跟其刚刚被提出来一样有害。
OO是一种模块化方式。其基本思路就是希望尽可能自然的表达模块,对象作为一个有状态有功能的模块,确实比以前更容易处理模块化这个高深的技术活了。
上面关于OO的讨论,其实可以套用到OB上【或者也叫做ADT】,OO还有个核心的思想是“分类”。其实对于OO的批判主要集中在这个分类上。由于人类思维的飘忽性,昨天认可的分类方式今天却发现不适合,所以OO的分类提供了“继承”来完成这个所谓的思维进化。可是问题是继承只是子类化,只是在类【或者在数学上叫做集合】分拆出一部分作为子类【或者在数学上叫做子集合】。由于人人都有自己的观点,这样就难免会有见仁见智的问题。而且最大的问题就是其实这个所谓的继承根本没有办法完成思维进化,只能在一定程度上完成概念精化的模拟。后来就引入了接口【或者叫做契约、概念】之类的方式{《这儿我并不准备区分编译时还是运行时等等细节问题,所以Cpper也不要吹毛求疵了》},允许多继承,也就是允许了从多个维度进行分类。比如从大小这个维度进行分类,分出:大、中、小三个类别,从颜色这个维度进行分类,分出:红、绿、蓝三个类别,组合这两个维度【多继承】就能得到一个新的类别出来。有了多继承的引入,OO已经比较完善了。
OO就是上面说的那样。其实OO还有一个比较强的隐含假设,那就是,作为一个Object,它是自足的。也就是说,它要能自我存在而不需要强依赖于别的实体。或者换一句话说:它要是完备的。
那么,我们结合OO和分层就能看出,现在UI、Logical、Data这样的分层机制跟OO机制是冲突的。从OO角度来说,订单就是订单,产生订单,收集订单信息,检验订单,签署订单,订单相关交易【现金和商品】,订单完成等等都是订单的功能,订单有其自身的状态,比如:货物的数量、单价、约定时间等等。从分层角度来说,订单的填写属于UI层,订单的处理属于Logical层,订单的永久化属于Data层。
现在,Java界的业务对象慢慢的获得重视,就是要把各个层次的东西组合起来形成一个完备的自足的对象。而Ruby这类语言由于类的动态可扩充性,自然而然的更能采用OO的思路来思考问题。C#语言也提供了扩展类和扩展方法以便于支持LINQ,同时也自然的提供了类Ruby的解决思路。Java界有一个项目叫做Qi4j,就完全是基于组合开发软件的思路,提供的是纯Java接口,而不是JRuby,Jython,Groovy之类新语言【它们都算是Java界的】,对于坚持咬定Java不放松的那些Programmer来说,应该有些吸引力吧。
嵌入式CAN本地OTA升级:基于UDS协议的工程实践指南 UDS(统一诊断服务)是汽车电子与工业嵌入式系统中实现可靠固件升级的核心应用层协议,依托ISO-TP在CAN总线上传输,具备强确定性、可追溯性与标准合规性。其原理在于将诊断请求/响应映射为标准化服务码(如0x31擦除、0x34下载、0x27安全访问),结合流控机制与错误处理保障传输鲁棒性。技术价值体现在满足ASPICE认证、主机厂准入及售后诊断要求,规避无线OTA的带宽、安全与稳定性风险。典型应用场景包括ECU、BMS、网关等车规级设备的SD卡本地OTA升级。本文聚焦UDS协议栈与CAN硬件协同、Bootl 阅读详情

相关推荐

Java模块化

为了保证兼容性,高版本的JDK,首先保证始终支持直接运行jar包中的代码,然后,在相应的命令行工具,比如javac和java中,添加对于模块化jar包的支持。至于jmod文件,则主要用于构建可独立运行的“运行时环境”,有一个jlink工具可以完成这个工作,具体地说,就是jlink会将特定程序中用到的jmod模块抽取出来,构建出一个可独立运行的“文件集合”,这个文件集合仅包容它所用到的模块,移除了无关的模块,因此,比标准的JDK运行时环境要小得多,并且不强制要求目标计算机上预先安装有特定版本的JRE。

vonlinee的博客 1350

什么是IIFE?它有什么作用?

IIFE的基本概念基本形式作用示例一:基本的IIFE示例示例二:带有参数的IIFE示例三:使用IIFE进行模块化编程示例四:使用IIFE进行依赖注入示例五:使用IIFE进行异步回调不同角度的功能使用思路1. 模块化设计2. 数据保护3. 异步编程4. 单件模式实际工作中的技巧1. 减少全局变量2. 模块化代码3. 代码组织4. 性能优化结语在前端开发领域,立即执行函数表达式(Immediately Invoked Function Expression, IIFE)是一种常见且强大的模式。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1783

C++开发基础之掌握常用的三种异步编程模型

以上是三种常见的C++异步编程模型,每种模型都有其适用的场景和特点。根据具体需求,你可以选择合适的模型来进行异步编程。

dotnet研习社 2176

深入理解ESM、CJS与IIFE:JavaScript模块化的三大主流范式

ESM、CJS和IIFE是JavaScript中三种主要的模块化标准。ESM是官方的模块化标准,支持静态导入和导出,适用于现代浏览器和Node.js环境。CJS主要用于Node.js环境,支持动态导入和同步加载。IIFE是一种不使用任何模块化工具的模块化模式,适用于需要兼容旧版浏览器的场景。开发者可以根据项目需求和运行环境选择合适的模块化标准。

1279

Foxglove Studio实战:5步搞定自动驾驶数据可视化(附避坑指南)

本文详细介绍了如何使用Foxglove Studio高效搭建自动驾驶数据可视化工作流。通过五个核心步骤:环境准备、数据导入、面板搭建、交互分析与自动化集成,帮助开发者快速掌握这一专为机器人系统设计的开源平台。文章重点解析了其与ROS/ROS 2、MCAP等数据源的无缝对接,以及3D点云、多传感器融合、团队标注等核心功能,并附有实用的性能优化与避坑指南,旨在提升算法调试与团队协作效率。

d3e4f的博客 337

开关电源环路稳定性分析(01)-Buck变换器

这篇文章主要是根据Buck变换器的拓扑结构,利用欧姆定律,基尔霍夫定律,积分微分,这些我们所熟悉的理论推导出了开关电源输入和输出关系的表达式,我相信看完这篇文章,应该是可以自己推导一次。在后面的文章中,我们同样会按照这样的风格,尽量使用大家都已经掌握的知识,来一步一步的拆解晦涩难懂的环路稳定性的问题,在前面先把积木搭起来,后面综合分析的时候就不会显得那么困难!

D_Katter的博客 3835

前端模块化(iife CommonJs AMD UMD CMD) 如有错漏请诸位多多指正 十分感谢

之前学习笔记 整理上传分享出来 希望大家能多多指正其中错漏

weixin_42181341的博客 484

WorkBuddy实战技巧:搭建高效AI工作台与自动化流程

在数字化办公场景中,AI工作台正逐渐成为提升个人与团队效率的关键工具。它不同于简单的聊天机器人,而是通过集成技能包(Skill)、自动化触发与文档处理能力,把重复性任务如信息提取、周报生成、数据表格整理等变为标准化流程。其核心原理在于将用户需求拆解为可执行的指令链,并借助本地脚本、API调用及定时任务实现“对话即操作”的智能协作。这种技术价值不仅适用于程序员,更惠及运营、客服、行政、科研等日常与文字数据打交道的群体。从自动签到、会议纪要,到批量处理Excel与合同要点提取,AI工作台的应用场景已覆盖多个高频

weixin_42547431的博客 334

什么是模块化编程如何在JavaScript中实现模块化

引言基本概念和作用说明什么是模块化编程?模块化编程的作用JavaScript中的模块化发展实现模块化的示例示例一:使用IIFE实现简单模块示例二:使用AMD(Asynchronous Module Definition)规范示例三:使用CommonJS规范示例四:使用ES6模块示例五:使用动态导入功能使用思路开发技巧分析模块化编程是一种将程序划分为多个独立模块的设计思想。每个模块负责完成特定的功能,并通过明确的接口与其他模块进行通信。模块之间的依赖关系应当尽量减少,以降低耦合度,提高代码的灵活性和可测试性。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1225

无网环境也能玩转DBeaver?手把手教你离线安装与ClickHouse连接(附实测jar包)

本文详细介绍了在无网环境下如何离线安装DBeaver并配置ClickHouse连接的完整指南。通过准备必备工具如DBeaver安装包、ClickHouse JDBC驱动及Maven本地仓库,确保在物理隔离环境中实现数据库管理。文章包含详细的安装步骤、驱动配置和性能优化建议,帮助开发者在严格网络限制下高效工作。

weixin_42635064的博客 375

Ceres&OpenCV 单目相机标定(论文复现)

Ceres&OpenCV 单目相机标定(论文复现)

dayuhaitang1的博客 370

模块化的力量:JavaScript的模块化革命

🤍 前端开发工程师、技术日更博主、已过CET6🍨、23年度博客之星前端领域TOP1🕠高级专题作者、打造专栏🍚签约作者、上架课程。

你若盛开,清风自来 2018

微信服务号配置总是提示“参数错误”?我就是这样一步步查出问题的

前两天,我遇到了一个很诡异的问题:在微信服务号后台配置服务器地址时,总是提示“参数错误,请重新填写”。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1277

[ 模块化 ] JS 模块化发展历程

JavaScript 模块化的发展

李赛赛的专栏 924

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

模块化架构

一、模块化是什么 模块化的思想不是我们创造的,而是各行各业的趋势。造一辆汽车,它的发动机、轮子、电池组等都是标准化模块化的;又比如原来造一幢房子是钢筋水泥土,现在是通过预制件。带来的好处是又快又好又省。 二、开发领域模块化 基于传统的开发方式,软件工程到一定的规模以后,系统变的越来越复杂,很多一定规模的公司,中台系统也非常庞大复杂,按传统的开发方式,来一个需求,编码开发,一段时间之后系统变的越来越臃肿。 这是一张印度的电线杆,比较形象的来形容软件工程到一定程度后系统变的越来越复杂了,很多大公

weixin_43844911的博客 6498

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

前端模块化

由于代码之间会发生大量交互,如果结构不合理,这些代码就会变得难以维护、难以测试、难以调试。而使用模块化就解决了这些问题,模块化的特点当应用被组织成模块时,可以方便的在其他地方重用这些模块,避免编写重复代码,从而加快开发流程;当应用变得越来越复杂时,如果在一个文件中编写所有功能,代码会变得难以阅读。如果使用模块设计应用,每个功能都分布在各自的模块中,代码就会更加清晰、易读;软件的美妙之处在于进化,从长远来看,我们需要不断为应用增加新的功能。当应用被结构化为模块时,可以轻松添加或删除功能。

l371545670的博客 2173

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ES6的模块化和commonJS的模块化有什么区别?

ES6模块更适合于现代JavaScript开发,具有静态分析、支持异步加载、模块化和更清晰的语法。CommonJS模块主要用于Node.js环境,特点是同步加载、动态模块解析,适用于服务器端开发,但不太适合浏览器环境,除非通过打包工具进行转换。两者各有优缺点,通常在浏览器环境中使用 ES6 模块,在Node.js中则更常用 CommonJS,但在现代应用中,尤其是配合构建工具(如 Webpack、Babel)时,ES6 模块正逐渐成为标准。

dzhnb的博客 1592

什么是模块化开发?模块化开发有哪些方法

前几天面试虾皮问了什么是模块化,没有解答清除。 1.什么是模块化? 简单地说,模块化就是有组织地把一个大程序拆分成独立并互相依赖的多个小文件(模块)。 模块内部有许多私有属性,只向外暴露一部分公开的接口(如可以修改私有属性的方法等) 2.为什么要模块化? ES6之前,JavaScript语言一直没有模块(module)体系,无法把大文件有组织地划分成小块,并管理之间地依赖。但是模块化的思想一直存在。因为用Javascript写的代码越来越庞大,而网页也越来越像桌面APP。如此庞杂的代码,如果不进行模块化,就

qq_41898300的博客 5962

Java9模块化学习总结

2017 年 JDK9 引入了“模块化”的概念后,上述问题都得到了一定的解决。模块化将类和资源封装在模块中,仅导出其他模块需要访问的公共包。从概念上可以看出模块化必须遵循三个核心原则: 强封装性:隐藏模块实现内部细节,分离供其他模块访问的公开代码 定义良好的接口:模块需要向其他模块公开定义良好且稳定的接口 显式依赖:模块间的依赖关系可以产生一个模块图:节点表示模块,边缘表示模

聚焦AI技术前沿,深度解析大模型原理与多场景应用,探索最新突破与落地实践,助力行业洞悉趋势,驱动智能转型,赋能千行百业。 1065

什么是模块化?模块化怎么实现?

前言 : 增加印象,留给回忆 ,忘记还可以翻一翻 公司里一个项目是有很多程序员一起开发的,例如 “多人运动” 这个项目 有程序员a ,程序员b ,程序员c **......** 程序员a 写了 aaa.js 里面有几千行 几万行代码 程序员b 写了 bbb.js 里面有几千行 几万行代码 程序员c写了 ccc.js 里面有几千行 几万行代码

weixin_44600810的博客 2994

前端工程\模块化

Node中的模块概念其本质就是对应一个个。

慈様 2787

【模块化】再谈模块化

在ES6之前,javascript并没有提供内置的模块特性,通常是开发者利用js的特性,如对象、闭包、立即执行函数等,开发出模块化技术。当我们要开发模块化技术时,请牢记模块化系统至少具备下列2点功能:了解了模块,下面我们就来谈谈几种模块化方案。基于模块化的2个特点,在该方案中:示例: 我们把立即执行函数+对象+闭包来创建模块的方式,称为模块模式。一旦有能力定义模块,就能将不同的模块拆分为多个文件。或者在已有模块上不修改原有代码就可以定义更多功能。 ❤️ 示例:我们对MouseCounterModule模块进

前端进阶之路 | 中大厂、外企、国企内推 | 面试培训 | 简历修改 911

JavaScript模块化

JavaScript模块化

perfectmvp的博客 929

Nodejs—模块化

是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。

m0_59451453的博客 1708
上一篇: CSS和表格
下一篇: 模块化-续
lifeNet
博客等级 码龄20年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值