模块化是迄今为止对付复杂软件系统的最好的办法。
问题并不在于上面这句话。问题在于怎么模块化。这儿的“怎么模块化”并不是说不知道模块化是把系统分拆成几个模块,组合而成系统。而是说不知道以什么规则指导我们进行模块分拆。
当然,关于模块化,有很多非常著名的指导原则,最著名的莫过于“高内聚,低耦合”。可是这个原则有点太过空泛。即便如此,我们也很有必要研究一下这个原则。高内聚的好处是什么?为什么要高内聚?我个人的感觉是,高内聚降低了模块的理解成本,同时潜在的降低了模块组合的困难程度,因为高内聚比较倾向于产生一致性好的接口。低耦合呢?低耦合有一个非常直接的目的,就是为了降低模块的相互依赖程度,以便于:一、更容易替换模块和重用模块;二、强迫模块的接口简单直白。
有了这些铺垫,我准备暂时岔开话题,说说分层体系。
分层逻辑上是把同类【注意:这里是同类而不是同种,以后这儿的差别会被区分的非常清楚】的模块放置到一个叫做层的逻辑模块容器中的一种分拆方式。举例来说:把所有数据库访问类的模块放入到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来说,应该有些吸引力吧。
分享到:
相关推荐
为了适应不断变化的业务和技术需求,模块化数据中心解决方案应运而生,并且已成为当今数据中心设计的行业标准。本文将详细探讨模块化数据中心解决方案的核心概念、优势以及相关的国际和国内标准。 模块化数据中心...
在iOS开发中,模块化是一种重要的工程实践,它有助于提高代码的可复用性、可维护性和团队协作效率。本文将深入探讨iOS模块化开发的解决方案,包括问题识别、解决方案的实现以及具体案例分析。 首先,项目存在的问题...
随着技术的发展,模块化设计已经成为了电力系统继电保护的重要趋势,其一体化设计研究不仅涉及到了电力系统的技术革新,还涉及到电力技术的系统开发、数据管理等多方面的专业知识。 模块化设计的核心在于将继电保护...
标题中的“HBMMC.rar”可能是一个压缩文件,其中包含了关于模块化多电平换流器(MMC)的详细设计和仿真模型。MMC是一种先进的电力电子转换设备,它使用多个半桥模块来构建一个多电平电压源逆变器。这种结构在高压大...
以下是关于模块化设计的详细解释: 1. **模块化设计概念**:模块化设计的核心是将复杂系统拆分成独立的、可重用的组件,每个组件被称为模块。这些模块具有明确的功能,并能够与其他模块协同工作以完成更高级别的...
以下是关于模块化移动通讯器的一些关键知识点: 1. **模块化设计的优势**:模块化设计允许设备制造商根据不同需求灵活组合各个功能模块,例如射频模块、处理器模块、存储模块等,降低了设计复杂度,提高了生产效率...
标题中的“59ae05b9_mmc_MMC-HVDC_模块化多电平_输电仿真_matlab”表明这是一个与电力系统相关的项目,具体是关于模块化多电平换流器(MMC)在高压直流输电(HVDC)系统中的应用,而且这个项目是基于MATLAB进行仿真...
以上是从提供的文章内容中提取的关于FPGA模块化设计的核心知识点。通过这些知识点的学习和应用,设计师可以有效地利用模块化设计方法,提高电子系统设计的效率和可靠性。随着技术的发展,FPGA模块化设计方法将越来越...
描述中的内容与标题一致,进一步确认了文件的核心内容是关于模块化移动房屋屋檐的设计。模块化建筑是一种高效、环保的建筑方式,通过预制的构件进行组装,适用于快速部署和拆卸的场景,如偏远地区、应急救援或者临时...
令n为正整数。 对于任何整数a,如果a2≡a(mod n),我们说它是n的幂等模。 n模量的Erdös-Burgess常数是最小的正整数l,因此任何l个整数都包含一个或多个整数,其乘积是幂等模n。 我们给出了n模Erdös-Burgess常数...
《模块化太阳能电池板清洗头》不仅为太阳能产业的专业人士提供了宝贵的参考资料,还为其他领域的相关人员提供了关于模块化技术应用的启示。这份文档的发布,无疑将促进太阳能电池板清洁技术的发展,推动整个太阳能...
考虑到提供的内容,似乎是从一份关于模块化机房空调与传统机房空调的比较报告中提取的片段,但由于内容片段混乱且不完整,难以直接提取出详尽的知识点。不过,我们依然可以基于这些片段尝试提炼相关知识点。 模块化...
标题中的“行业分类-设备装置-模块化航天器组成模块的在轨更换装置”表明了这个主题涉及到航天技术,特别是关于模块化航天器的设计和维护。在这个领域,模块化航天器是指那些由多个独立功能模块构成的太空飞行器,...
文件名“AndModulePractice-master”可能是一个关于Android模块化实践的开源项目。这样的项目通常会包含以下几个部分: 1. 基础模块(BaseModule):提供基础功能和公共组件,如网络请求库、日志管理、权限处理等。 ...
通过学习这份文档,工程师和设计师们可以获得关于模块化设计的宝贵知识,提升他们在设备开发中的专业能力。无论是为了提高生产效率,还是为了创造更先进的产品,理解并掌握模块化头部约束结构和造型支持结构的设计...
在现代电气工程领域中,模块化设计已成为提升电力分配...通过这份文档,行业内的专业人士可以获得关于模块化设计和绝缘配电块技术的深入理解,从而更好地设计和管理电力系统,确保电气工程的高效、安全和可持续发展。
标题中的“行业文档-设计装置-一种模块化钢结构梁”表明了这个压缩包内容主要涉及的是钢结构设计领域,特别是关于模块化钢结构梁的设计方案。在建筑行业中,钢结构因其强度高、重量轻、施工速度快等优点,被广泛应用...
《C51模块化实例编程》是一门深入探讨C51编程技巧的教程,特别强调了模块化编程的方法。在嵌入式系统开发中,模块化编程是一种有效的组织代码结构的方式,可以提高代码的可读性、可维护性和复用性。通过实例分析和...