【IT168技术文档】
最近又有客户问起结构化方法(即结构化分析SA Structured Analysis 和结构化设计SD Structured Design)和面向对象分析设计(OOAD Object-Oriented Analysis & Design)方法的区别,这是一个很多人谈了很多遍的问题,Google一下就可以找到很多以此为标题的文章。OO技术发展了很多年了,现在大家都在用,已经没有什么异议了,几乎没有人会怀疑这种技术的好处。但它明显是一位过气的明星,就连前几年才出道的模型驱动开发(MDD)也已经过了风头最劲的时段,我们现在更热衷于讨论一些更加时尚的概念如:SOA、IT治理、循规等。
要想了解结构化方法和面向对象方法,去看一下 Roger S.Pressman 写的"软件工程:实践者的研究方法(Software Engineering: A Practitioner's Approach)"(这是一本很流行的书,网上就有卖)就可以了,里面有专门的章节介绍这两种方法及其区别。
我喜欢把软件系统描述成对现实世界的映射,现实世界中的我去ATM机取了100元钱,映射到软件就是从我的银行帐户对应的数据库记录中余额(Balance)那一字段减去100。所谓的结构化方法和面向对象方法,就是两种不同的映射手段,结构化方法是以处理过程为中心,强调先定义数据结构(ER实体关系建模),然后分析处理逻辑(DFD数据流图);面向对象方法则主张两者之间的自然映射,在ATM取款的例子中,我被映射为Customer对象,我的帐户被映射为Account对象(在对象-关系映射中再对应到数据库表Account中的一条数据记录)。正因为OO方法采用对现实世界的自然映射,现实世界中的业务流程发生变化时,软件实现也可以比较方便地跟着转变;而采用结构化方法的映射(或是采用OO方法,但对业务流程的映射关系建立不当),软件上相应修改的工作量就会大一些。
应当说明的是这两种开发方法之间并不是一个完全对立的关系,结构化方法出现在前,并且得到了很成功的应用;面向对象方法诞生在后,说它是从结构化方法发展而来也不为过,它也继承了很多结构化方法中的成功经验如:数据抽象、自顶向下、模块化、高内聚、低耦合等,我们应该把OO技术看作是软件设计方法的非常好的实践经验整合。结构化方法在过去也很成功,但是我们所开发的软件规模越来越宠大,软件系统越来越复杂,20年以前开发一个软件可能是100%从头开发的,现在开发一个软件可能只有10~20%的代码是新开发的,很多功能尤其是基础功能都是可以重用的。J2EE技术就是一个典型的例子,它把很多基础功能如会话(Session)管理、事务(Transaction)管理、对象关系映射(O-R Mapping)等都已经在中间件中实现了,你只需要重用它们就可以了。要提高软件重用性的话,就一定要引入OO方法中的一些关键理念如:封装、多态、抽象层次结构等,这些机制可以提高软件的可重用度,帮助我们有效地管理软件系统日益增长的复杂度。
实际上结构化方法和面向对象方法之间并不是革命性的变化,我把它们比喻为“走路”和“跑步”的区别,原始人为了捕捉猎物,必须跑步前进;跑步跟走路的区别不是很大,仅仅是迈步频率加快,并且双脚可能同时离地而已。而模型驱动开发(MDD)则是一种革命性的变化,我把它比喻成“骑自行车”,因为MDD已经开始利用自动化工具来提高软件开发生产率了,但是MDD技术还刚刚处于探索阶段,还没有成为一项大规模应用的成熟技术。对应于这种比喻的话,我们可以看到软件开发技术发展是非常缓慢的,相比其他行业(如集成电路)的技术发展,软件开发技术还很落后。我们大部分人还在使用原始的开发手段,等到将来我们把软件开发技术发展到“开汽车”、“坐飞机”的阶段,可能我们就找到了软件工程的“银弹”。那个时候可能我们只需要把需求告诉电脑就行了,它就会自动地做到我们想要的东西。
走路 跑步 骑自行车 开汽车、坐飞机
结构化方法 面向对象方法 模型驱动开发 将来的软件开发技术
我观察到在实际应用中使用什么样的设计方法往往受制于编程技术和环境,采用COBOL(主机应用开发)、C等传统过程语言的开发人员一般都在使用结构化方法进行设计;而采用Java、C++等面向对象语言的开发人员受到对象概念的熏陶比较多,基本上会转向面向对象方法;当然也有例外,也有一些开发人员在用C++语言实现面向过程的设计,因为他们还没有领悟OO所带来的好处。如果你想从结构化方法转向OOAD方法的话,我建议你先从OOP(Object-Oriented Programming)开始,使用Java、C++这些经典的OO编程语言可以让你逐步掌握OO技术的妙处,这样再转向OO设计就会容易一些,这是自底向上的实践。