“高内聚、低耦合”
这是软件系统设计的追求。在其它系统中这种关系也存在。周星驰的电影中经常会用到很多道具,其中很多可以做为系统设计的例子来帮助我们理解这名话。
“高内聚”是指模块内部紧凑一致并且专注。一个内聚性差的例子是周星驰电影《国产007》中达文西发明的"集合十种杀人武器于一身的超级武器霸王"。因为十种“武器”之间并没啥联系,而我想用其中的手电筒的话还要带上另外九样东西。内聚性好的例子当然要数周星驰电影《食神》里的折凳了。折登专注于两件事:坐、打。折凳内部由两部分构成:凳腿和凳面。用来坐时凳腿用来支撑,凳面用来托屁股;用来打人时凳腿用来握住,凳面用于击打。折凳这个模块精巧的内部设计一点浪费都没有,即不需要其它模块支持也不需要复杂操作,“不愧是七种武器之首”。
“低耦合”是指模块间相对低的依赖关系统。还是先举个失败的例子,《大话西游》中的“月光宝盒”。月光宝盒与与月光之间的耦合关系统使得它只能在有月光的晚上还要念动口诀才能使用。电影当中常常可以利用这种耦合性来产生一些戏剧效果,例如在晚上打开月光宝盒大叫“般若波罗蜜”,但是偏偏没有月光,无法实现时空穿越。而不能使用的月光宝盒正像唐僧说的那样是“就算不砸到小朋友,砸到花花草草也不好”的“垃圾”(“悟空,你又乱扔垃圾”)。出色的低耦合系统要数《大内密探零零发》中的“武装攻击直升机了”。它由手动的螺旋桨和含在嘴里的火炮系统构成,相互之间没有什么依赖关系,即可以联合起来升空打击敌人,又可以折分开来单独使用。
“月光宝盒”是紫霞仙子研发的么?她可真不容易,因为想测试月光宝盒不单要天时地利人和,而且涉及到时间穿梭。想TA就更难了。
模块内部的高内聚会带来模块之间的低耦合,反之亦然。
有时低耦合是以牺牲性能为代价的。比方说Windows中的COM组件,用起来灵活但速度很慢。再比如脚本语言对系统依赖性很小,但没有对系统依赖性大的编译语言执行快。为了得到更好的可扩展性和可维护性,系统设计者往往乐于牺牲一部分性能来换取较低的耦合性。但事实也并非总是如此,很多开源软件和同等规模的商业软件比起来性能没什么差别,但开源软件往往有更低的耦合性(见我之前写的Conway's law)。这说明很多时候其实系统架构设计是有改善的空间的。
内聚与耦合其实在我们的生活中是无所不在的。一方面,我们生活在一个高度模块化的世界中,电视、音响、汽车,各司其职。人们需要最大程度的忽略模块的细节(使其高内聚,普通人没必要知道电视机的构造),同时也期望各模块之间可以灵活搭配减少不必要的依赖性(使其低耦合,电视坏了可以听音响,就算家里没电了汽车还是可以开)。另一方面,我们也生活在一个高度耦合的世界,这往往来源于现代社会对于性能的不断追求。几十年前,会开车的人几乎都会点修车技术。现在可不行了,汽车内部零件复杂的耦合性让我们望而却步,没办法,性能的代价。
没有评论:
发表评论