比如手和脚是两个“功能独立”的模块。没有脚时,手照样能干活。没有手时,脚仍可以走路。但如果希望跑得快,那么迈左脚时一定要伸右臂甩左臂,迈右脚时则要伸左臂甩右臂。在设计一个模块时不仅要考虑“这个模块就该提供什么样的功能”,还要考虑“这个模块应该怎样与其它模块交流信息”。
本节将论述评价模块设计优劣的三个特征因素:“信息隐藏”、“内聚与耦合”和“封闭——开放性”。
5.2.1 信息隐藏
在一节不和谐的课堂里,老师叹气道:“要是坐在后排聊天的同学能象中间打牌的同学那么安静,就不会影响到前排睡觉的同学。”
这个故事告诉我们,如果不想让坏事传播开来,就应该把坏事隐藏起来,“家丑不可外扬”就是这个道理。为了尽量避免某个模块的行为去干扰同一系统中的其它模块,在设计模块时就要注意信息隐藏。应该让模块仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。
模块的信息隐藏可以通过接口设计来实现。一个模块仅提供有限个接口(Interface),执行模块的功能或与模块交流信息必须且只须通过调用公有接口来实现。如果模块是一个C++对象,那么该模块的公有接口就对应于对象的公有函数。如果模块是一个COM对象,那么该模块的公有接口就是COM对象的接口。一个COM对象可以有多个接口,而每个接口实质上是一些函数的集合。[Rogerson 1999]
美国也许是世界上丑闻最多的国家,因为它追求民主,不懂得“隐藏信息”。但美国又是软件产业最发达的国家,模块化设计的方法都是美国人倡导的,他们应该很懂得“隐藏信息”。真是前后矛盾,这些美国佬!
5.2.2 内聚与耦合
内聚(Cohesion)是一个模块内部各成分之间相关联程度的度量。耦合(Coupling)是模块之间依赖程度的度量。内聚和耦合是密切相关的,与其它模块存在强耦合的模块通常意味着弱内聚,而强内聚的模块通常意味着与其它模块之间存在弱耦合。模块设计追求强内聚,弱耦合。
一、内聚强度
内聚按强度从低到高有以下几种类型:
(1)偶然内聚。如果一个模块的各成分之间毫无关系,则称为偶然内聚。
(2)逻辑内聚。几个逻辑上相关的功能被放在同一模块中,则称为逻辑内聚。如一个模块读取各种不同类型外设的输入。尽管逻辑内聚比偶然内聚合理一些,但逻辑内聚的模块各成分在功能上并无关系,即使局部功能的修改有时也会影响全局,因此这类模块的修改也比较困难。
(3)时间内聚。如果一个模块完成的功能必须在同一时间内执行(如系统初始化),但这些功能只是因为时间因素关联在一起,则称为时间内聚。
(4)过程内聚。如果一个模块内部的处理成分是相关的,而且这些处理必须以特定的次序执行,则称为过程内聚。
(5)通信内聚。如果一个模块的所有成分都操作同一数据集或生成同一数据集,则称为通信内聚。
(6)顺序内聚。如果一个模块的各个成分和同一个功能密切相关,而且一个成分的输出作为另一个成分的输入,则称为顺序内聚。
(7)功能内聚。模块的所有成分对于完成单一的功能都是必须的,则称为功能内聚。
二、耦合强度
耦合的强度依赖于以下几个因素:(1)一个模块对另一个模块的调用;(2)一个模块向另一个模块传递的数据量;(3)一个模块施加到另一个模块的控制的多少;(4)模块之间接口的复杂程度。
耦合按从强到弱的顺序可分为以下几种类型:
(1)内容耦合。当一个模块直接修改或操作另一个模块的数据,或者直接转入另一个模块时,就发生了内容耦合。此时,被修改的模块完全依赖于修改它的模块。
(2)公共耦合。两个以上的模块共同引用一个全局数据项就称为公共耦合。
(3)控制耦合。一个模块在界面上传递一个信号(如开关值、标志量等)控制另一个模块,接收信号的模块的动作根据信号值进行调整,称为控制耦合。
(4)标记耦合。模块间通过参数传递复杂的内部数据结构,称为标记耦合。此数据结构的变化将使相关的模块发生变化。
(5)数据耦合。模块间通过参数传递基本类型的数据,称为数据耦合。
(6)非直接耦合。模块间没有信息传递时,属于非直接耦合。
如果模块间必须存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,坚决避免使用内容耦合。
5.2.3 封闭——开放性
如果一个模块可以作为一个独立体被其它程序引用,则称模块具有封闭性。如果一个模块可以被扩充,则称模块具有开放性。
从字面上看,让模块具有“封闭——开放性”是矛盾的,但这种特征在软件开发过程中是客观存在的。当着手一个新问题时,我们很难一次性解决问题。应该先纵观问题的一些重要方面,同时作好以后补充的准备。因此让模块存在“开放性”并不是坏事情。“封闭性”也是需要的,因为我们不能等到完全掌握解决问题的信息后再把程序做成别人能用的模块。
模块的“封闭——开放性”实际上对应于软件质量因素中的可复用性和可扩充性。采用面向过程的方法进行程序设计,很难开发出既具有封闭性又具有开放性的模块。采用面向对象设计方法可以较好地解决这个问题。
5.3 数据结构与算法设计
学会设计数据结构与算法,可以让我们编写出高效率的程序。也许有人要问,在计算机速度日新月异的今天,为什么还需要高效率的程序?
因为我们的雄心与能力是一起增长的,技术进步最快也快不过人们欲望的增长。计算速度和存储容量上的革新仅仅提供了处理更复杂问题的有效工具,所以高效率的程序永远不会过时。
设计高效率的程序是基于良好的数据结构与算法,而不是基于编程小技巧。大多数计算机科学系在设置课程时,都重视学习基本的软件工程原理,以及数据结构与算法设计。
一般说来,数据结构与算法就是一类数据的表示及其相关的操作(这里算法不是指数值计算的算法)。从数据表示的观点来看,存储在数组中的一个有序整数表也是一种数据结构。算法是指对数据结构施加的一些操作,例如对一个线性表进行检索、插入、删除等操作。一个算法如果能在所要求的资源限制(Resource Constraints)范围内将问题解决好,则称这个算法是有效率(Efficient)的。例如一个资源限制可能是“用于存储数据的内存有限”,或者“允许执行每个子任务所需的时间有限”。一个算法如果比其它已知算法所需要的资源都少,这个算法也被称为是有效率的。算法的代价(Cost)是指消耗的资源量。一般说来,代价是由一个关键资源例如时间或空间来评估的。
毋庸置疑,人们编写程序是为了解决问题。只有通过预先分析问题来确定必须达到的性能目标,才有希望挑选出正确的数据结构。有相当多的程序员忽视了这一分析过程,而直接选用某一个他们习惯使用的,但是与问题不相称的数据结构,结果设计出一个低效率的程序。如果使用简单的设计就能够达到性能目标时,选用复杂的数据结构也是没有道理的。
人们对常用的数据结构与算法的研究已经相当透彻,可以归纳出一些设计原则:
(1)每一种数据结构与算法都有其时间、空间的开销和收益。当面临一个新的设计问题时,设计者要彻底地掌握怎样权衡时空开销和算法有效性的方法。这就需要懂得算法分析的原理,而且还需要了解所使用的物理介质的特性(例如,数据存储在磁盘上与存储在内存中,就有不同的考虑)。
(2)与开销和收益有关的是时间——空间的权衡。通常可以用更大的时间开销来换取空间的收益,反之亦然。时间——空间的权衡普遍地存在于软件开发的各个阶段中。
(3)程序员应该充分地了解一些常用的数据结构与算法,避免不必要的重复设计工作。
(4)数据结构与算法为应用服务。我们必须先了解应用的需求,再寻找或设计与实际应用相匹配的数据结构。[Shaffer 1998]
5.4 用 户 界 面 设 计
某个人总有办法让自己保持心情愉快、信心十足。有一天,他向一名围棋九段和一名乒乓球世界冠军挑战,结果他全胜了。因为他跟围棋九段打乒乓球,跟乒乓球冠军下围棋。用户界面的编程技术是人们熟悉得不得了的事,我决定讲一讲比较陌生的“用户界面设计美学”。
有位爱好书画的博士后请我欣赏钢琴演奏会。我从头到尾只听到“叮叮咚咚”的声音,实在享受不到“高雅”,就请这位朋友指点。他虽然也不懂钢琴,却从欣赏书法的角度设法解释如何欣赏音乐。可是我既不懂书法也不懂音乐,真是坐立不安。“美”似乎真的不可言传。我在读本科时,特别喜欢编写用户界面程序,并且常向同学演示、卖弄。
小说推荐
- 软软入相思
- 都城白府,突然多出来了一位大小姐白木雨 众人好奇,却意外发现这被白家宝贝的女儿,脑子好像不大正常 一场宴会,众人得见盛装的白小姐 神祀下诏,白氏女,无根人 真龙之人得之,如虎添翼。旁人得之,不得善终>所以,是福?还是祸 半夜,白小姐的闺房里突然闯进来了个登徒子 自称对白小姐一见钟情,并决定要一缠二闹
- 都市言情言凝倪连载中
- 最新章:(两百三十五)我守着你
- 程心程意
- 从小老师就教育我们叔中自有黄金屋,叔中自有颜如玉。程锦之最大的愿望就是能嫁给隔壁老程直到有一天—程牧白:锦之,跟我回家。程锦之:那你不许勾搭别的女人!程牧白:除了你,我有过别人?从此双程合璧想想还有点小激动呢o 作者:所写的《程心程意》无弹窗免费全文阅读为转载作品,章节由网友发布
- 都市言情未知完本
- 最新章:第46章
- 程少的心尖小软糖
- 尹茜一直知道自己的婚姻不幸福,爹不疼娘不爱,丈夫更是不爱自己,在这场婚姻中,她也只不过是两个集团的交易品而已,可是让她没想到的是,亲手葬送她婚姻的竟然是她最好的闺蜜 而她一次次的忍气吞声,换来的却是丈夫当着她的面跟自己的闺蜜上演“动作戏。撕心裂肺后的她决定“我卖艺不卖身”尹茜的话让程天泽不退反进“卖
- 都市言情牛油果酥酥连载中
- 最新章:第1194章 大结局
- 在moto手机上使用的txt阅读软件
- 在moto手机上使用的txt阅读软件支持机型为:MOTOROLA系列:V3V300-V600(i)V360C501L7L6E398E375E680C650C381v635E1E2E680E680IA780A1200C975C980E1000E770V3IV3X诺基亚系列:32505140i60606
- 未知连载中
- 最新章:第1章
- TXT电子书批量转换中文Unicode编码的软件
- 经常看TXT电子书,但网上下载的经常不是Unicode编码的,打开后会出现乱码,要在电脑上转换,有了这个工具,可以批量转换了,不用一个个另存为Unicode编码了 作者:所写的《TXT电子书批量转换中文Unicode编码的软件》无弹窗免费全文阅读为转载作品,章节由网友发布
- 未知连载中
- 超级软件
- 众所周知,电脑只有装了软件,才会有各种功能,办公、上网、游戏、影音娱乐等等;如果人的大脑也能够安装软件,安装计算器,就能心算;千千静听,就能够歌唱;QQ、浏览器、暴风影音、WOW…一个平凡的少年,要做养家的爷们;一只手机从天而降,大脑安装软件,人生从此不同 作者:钓鱼所写的《超级软件》无弹窗免费全文
- 都市言情钓鱼完本
- 最新章:第四百零八章 向前看(全书完)
- 修仙软件
- 《修仙软件》作者:稀凤【完结】在无名之辈之中惊艳而出,在修仙世界里嚣张跋扈。一代修仙者的豪言!萧泽尧携带自己编程的修仙软件,闯入异界,开始修仙。这里有有被千年诅咒的情侣,生生世世轮回。神魔两道的第一次合作,以及,泉眼浩劫的镇压。萧泽尧的穿越,将改变整个修真史的历史。修仙成神的是惊艳之辈,超凡入圣的是
- 武侠小说未知连载中
- 最新章:第117章
- 人形软件
- 《人形软件》作者:谭剑【完结“我不写科幻本身,我写科幻世界中的真实人性”华语科幻星云奖,最佳长篇小说与最佳作家银奖,科幻小说的后科技之作。本书采用了畅销小说的写法,情节性颇强,时时引着读者读下去,其中对未来网路及灵魂上载的描写亦别开生面。它不仅展现了我们的替身在网路世界的传奇冒险,展现了虚拟生命对真
- 科幻小说未知连载中
- 最新章:第31章
- 我是杀毒软件
- 我游走在黑暗与光明之间,杀戮是我的挚友,邪恶是我的仆从,白骨累累化作我的权杖,鲜血殷殷染红我的披风,阴冷双翼所过之处,死亡的哭号必将震天动地 我是死神。同时也是一个杀毒软件。作者自定义标签:冷酷 作者:懒鸟所写的《我是杀毒软件》无弹窗免费全文阅读为转载作品,章节由网友发布
- 玄幻小说懒鸟连载中
- 最新章:没有后记的后记