结构化设计和面向对象设计

来源:互联网 发布:合同管理 数据分析 编辑:程序博客网 时间:2024/05/13 03:50
再探结构化设计和面向对象设计方法http://www.csai.cn 作者:fasiondog 来源:CSDN 2006年9月8日  进入社区   结构化设计历来备受责备的就是需求和设计之间的鸿沟,以前不是很理解这个鸿沟的原因。现在再看,在结构化设计中模块和模块之间的关系,被紧紧局限于信息流,这限制了对模块之间众多关系的表达,也无法体现模块和模块之间其他的众多关系,包含各种各样的结构、行为、依赖、包含(在结构化设计中这种关系隐含在分层中)、继承、关联关系等等。它仅仅解决了模块在封装和信息隐藏方面的问题。  再看面向对象设计方法,充分挖掘了“关系”的表达方式,可以尽可能的将事物之间复杂的关系予以体现,而这些关系是实现设计的关键。可以这样比喻目前为什么面向对象方法如此流行,记得小时候经常在各种杂志上看到许多这样的图画“一个钢球,从高处落下,击中某个翘起的装置,装置受到钢球的冲击,另一端抬起后,原来被截断的水流开始流通,并引发另一个设备开始工作……,最终在另一端的某个蜡烛被点燃”。这就是在工业时代,众多人被机械设计的灵巧和创意所深深吸引的其中一份图画。姑且不论这样的装置是否有实用价值,但它肯定带给构思者无限的快乐和想象力,以至于当时经常可以看到各种各样这样的图画。而面向对象的方法正是因使用对象的概念让设计更接近于上面的各种设备,而让机械设计时代的疯狂和无尽的创造力进入了软件工程师的视野。由于能够充分表达事物之间各种各样的关系(更接近于结构和行为方面),面对对象设计方法在今天创造了一个奇迹,各式各样巧妙的设计实现、设计模式的流行,几乎在永无止境的激发着爱好设计的人们的想象力和创造力。再看最流行的类比:建筑和软件。建筑最主要的特征是什么——结构。这也是为什么建筑能够和软件设计(最终设计都要体现在模块上)进行类比的潜在原因。相比之下,我更倾向于拿机械设计来和软件设计进行类比。  回到结构设计化方法上来,虽然很多人都说结构化设计和面向对象设计没有本质上的区别,那是因为某些关系依然可以通过转换映射到信息流上,但这毕竟绕了一个大弯,而且由于缺乏足够的表达各种关系的能力,极大的限制了软件设计者的想象力和创造力。结构化设计方法使用自顶向下的手段,通过Process的逐层分解来理解和构建系统,然后把Process分配给模块,这里的“分配”这几乎让每一个初次接触结构化设计方法的人大惑不解,似乎模块是Process分解的结果,甚至在如果已知了某些模块时又直接将模块映射成一个黑盒的Process,Process和模块究竟是什么关系?沿着这个思路,很容易陷进“鸡生蛋,蛋生鸡”的困境。而事实是,模块和Process的诞生,两者之间根本没有任何关联,都是独自根据经验所产生的。为什么会产生这样的问题?究其原因,结构化设计方法和我们自出生以来认识事物的方式有着很大的不同。因为打我们一出生,眼里落入的就是各式各样的实体,而我们区分它们主要依靠就是事物各式各样的特征,包括事物不同的结构和特定的行为,而结构化设计方法试图通过信息流及其转换来认识系统,这天生造成了某种障碍。相比之下,面向对象方法则和我们所熟悉的认识世界的方式相吻合,更加的自然。  那么结构化设计的优点到底是什么呢?考虑警察破案时,需要根据证人不断的描述犯罪嫌疑人特征对犯罪嫌疑人进行画像的场景,就可以理解结构化设计方法优点在于:当我们面对一个只知道存在各式各样需求,而对系统其它方面一无所知的时候,它可以通过“功能”帮助我们逐步理清需求之间复杂的关系,它天生就有对需求之间重复功能进行汇聚的能力,通过对系统的需求的整体理解,让我们知道系统到底需要做些什么,从而对系统有更清楚的认识,对“需求”的理解和澄清是结构化方法的核心。这样也可以理解为什么结构化设计方法比面向对象设计方法更早的诞生。因为在软件工业的早期,软件系统彼此独立,数量稀少,可以利用的经验非常缺乏,而结构化设计方法则在这种一开始就缺乏经验的时候有着极大的帮助,帮助人们从需求、功能的角度分析和理解系统。  那么,在我们理解结构化设计和面向对象设计的背后,到底隐藏了什么样的秘密,又如何理解其他各式各样的设计方法呢?其实,这个秘密躲藏在我们经常谈起的“差异性”的背后。我们经常谈起差异性,但却很容易忽视和差异性相伴相生的另一面——“共同性”。共同性促使我们对事物进行分类和总结,而差异性则让世界充满了变化,并让这个世界变得更加的复杂而朴素迷离。每一种“共同性”凝聚成一个轴,构成了我们观察世界的“维度”。各种“维度”交织在一起,让整个世界系统变成了一个复杂的“立方体”,这个立方体既不是平面的,也不是三维的,而是一个多维交织的复杂事物。结构化设计方法,抓住了“信息流”和“信息流转换”两个维度,并试图沿着这两个维度理解和认识系统;而面向对象设计方法则采用了“结构、行为”这两个主要的维度(还有其他),引领我们看清世界。每一种方法都试图通过某一个维度或者某几个维度的组合,去帮助我们认识和理解世界,比如面向方面的设计方法、面向服务的设计方法等等。这样再去理解表达方式,当某种表达方式能够表达的维度越多,它所能适应的范围就越广,这样也可以理解为什么目前很多的设计方法,都依靠的是UML,导致大家看不清其和面向对象方法存在的本质区别,也解释了为什么结构化设计方法的表达方式其实限制了我们的想象力和创造力。其实面向对象方法也有其局限性,简单的举例,比如模板编程就抓住了算法结构的纬度。  沿着维度的概念,我们也可以看清楚Java和C#以及C++本身的区别,也可以想象如果Java始终局限于纯面向对象语言的偏执中,很有可能在通用语言的竞赛中落后。再看动态语言Python,抛弃“类型”的维度,只抓住“名字”的维度,带来的极大灵活性,它不需要判断对象的其他维度的特征,只需要有一个相同的名字,程序就可以执行,当然也带来了隐患,但如果认识不到这个维度的差别,很可能将会将这种语言特性,和面向对象语言中的“接口”(专注结构和行为)概念相混淆。其实,“共同性”所构成的“维度”的概念就像一个重磅炸弹,可以激发我们对世界包括软件设计许许多多方面的思考火花,剩下的则更多的想象力的竞赛。///////面向对象与结构化软件设计方法的实践对比 中油油气勘探软件国家工程研究中… 2009/9/20 一、引言结构化方法是在软件行业得到广泛接受和使用,并一度成为早期占主导地位的软件构造与开发方法。而面向对象方法提出后,当代软件工程的发展面临着从传统的结构化范型到面向对象范型的转变,对象技术作为新范型的核心技术正在得到新的语言、新的系统和新的方法学的支持,这体现在已出现的面向对象的语言、数据库、操作系统及开发环境上。 本文以《机动设备管理系统》为实例,在开发实践中对结构化设计与面向对象设计进行了对比和摸索,并根据具体情况对如何合理的综合使用这两种设计方法进行了探讨。二、面向对象方法与结构化方法比较结构化方法首先关心的是功能,强调以模块(即过程)为中心,采用模块化、自顶向下、逐步求精设计过程,系统是实现模块功能的函数和过程的集合,结构清晰、可读性好,的确是提高软件开发质量的一种有效手段。结构化设计从系统的功能入手,按照工程标准和严格规范将系统分解为若干功能模块。然而,由于用户的需求和软、硬件技术的不断发展变化,作为系统基本成分的功能模块很容易受到影响,局部修改甚至会引起系统的根本性变化。开发过程前期入手快而后期频繁改动的现象比较常见。面向对象方法则从所处理的数据入手,以数据为中心来描述系统,数据相对于功能而言,具有更强的稳定性,这样设计出的系统模型往往能较好地映射问题域模型。对象、类,、继承性、多态性、动态定连概念和设施的引入使用,显然令面向对象的设计方法具有一定的优势,能为生产可重用的软件构件和解决软件的复杂性问题提供一条有效的途径。面向对象的设计过程就是指通过建立一些类以及它们之间的关系来解决实际问题,这就需要对问题域中的对象作整体分析,类和类间关系的设计要求较高,否则设计出的并不是真正意义上的面向对象的软件系统,而只是一些类的堆砌而已,不能体现出面向对象设计方法的优势之处。 同时,系统的分析设计是一个注重实践的领域,不仅仅依赖于一整套核心的概念与原理,要想设计出一个成功的系统来,还需要相应的语言、工具和技术的有力支持。在这方面,经过多年的实践和发展,适应结构化方法的技术和开发环境已经相当成熟稳定。而对面向对象方法而言,虽然近时期涌现了大量的新工具和新技术,但仍有待于不断的完善和改进,特别是面向对象的数据库技术。  三、实例分析下面以某单位的《机动设备管理系统》为例,对如何根据软件统需求和设计的具体要求综合采用面向对象与结构化方法进行分析,探讨这样构建软件系统的效果。该系统是基于网络的局、处两级系统。局级机动处对全局所有机动设备进行统一管理,处级各单位只分管本单位的设备,局、处两级共同完成设备的各项管理工作及进行相应的信息传递通讯。1、首先,在系统调查阶段我们了解到:这个系统要分期开发。由于处于机构改革时期,系统生存期内的用户需求和系统结构变因很多。这表明目标系统应该具有较强的可维护性、可修改性和可扩展性,即每期开发成果应在后续工程中具有较高的可重用率。其次,该系统的数据结构复杂,但数据的加工变换相对较单纯。在这种情况下,以功能和过程主导分析设计,一旦后期系统有变更就将会给程序开发带来很大的混乱和麻烦。而如果采用强调对象模型的面向对象方法,则可能将因功能变化带来的影响大幅降低,非常有利于后期的维护和升级。因此,该系统最后采用了面向对象的三段式架构的体系结构,分为三个彼此相对独立的层次:管理信息录入与显示的界面层、处理各种业务的应用层、存储信息的数据管理层。这样,三个层次既可独立开发又互相密切配合,通过信息驱动机制实现各层的联系调度,完成各项设备管理工作的处理。这种模型使系统系统结构清楚、分工明确。下图即为三层结构的系统架构简图:2、另一方面,由于该系统属于数据库管理应用软件,其数据库分析设计直接关系到整个系统的开发成败。目前,虽然面向对象数据库已经存在和发展了较长时间,但由于缺乏好的数据模型和演算理论,依然未能达到真正成熟实用的阶段。而关系型数据库则在数据库领域内处于主流地位,用户与关系数据库编程之间的接口是灵活与友好的,数据库设计和规范化过程也简单易行和便于理解。基于这样的考虑,该系统选择使用了关系型数据库。关系型数据库的本质是符合结构化设计原理的,比如Oracle、Sybase、SQL Server等著名商业数据库系统,还是以关系型数据库系统为主,OO数据库系统还没有得到实质性的应用,所以即使是在当前以C++、Java、C#等经典OO编程语言为主流开发工具,Delphi、PB、VB等传统结构性编程语言也都转向对象式开发模式的情况下,我们仍然不能说面向对象的开发方式就可以取代结构化软件开发方法。我们应该注意到,在大量的使用上述数据库系统的软件系统中,其数据模型和底层数据交换接口的设计,仍然是基于结构化来进行设计的。在该系统的数据库设计中,结构化方法得到了较好的实际应用,数据库外部模式、逻辑模式、内部模式的逐步分析和映射过程比较自然通畅。其数据库关系模型如下图所示:四、结束语—理解和体会1. 软件工程的目标是以最小的代价开发出满足用户需求的软件。为此,根据系统的实际需求,分别针对具体情况选择采用不同的设计方法,可以充分发挥面向对象与结构化方法各自的优势。目前在大多数软件系统的分析设计过程中,这两者方法都兼而有之。事实上,在上述《机动设备管理系统》的开发过程中,除了使用对象模型、动态模型等面向对象的一些建模技术外,结构化的一些技术也被采用了,比如为了清晰描述系统的运行流程,依然使用了系统流程图,这些技术的综合使用起到了非常良好的作用。2. 理解是修改维护任何一个软件系统的基础,对面向对象的软件而言,理解该软件就需要了解软件系统中主要对象的整个运行机制。但对象间的并行、继承、传递、激活等特性,可能会对后期维护人员快速理解系统原设计思想带来一定的障碍。目前,支持面向对象方法的软件开发环境中能帮助理解软件设计思路的工具并不多,在这方面结构化方法占有相对优势。所以,使用面向对象方法设计的软件系统要切实注意避免此类理解错误对开发带来的不良影响。3. 不论哪一种设计方法,正确清晰的需求界定都是开发一个成功的软件系统必不可少的前提条件,否则再好的设计方法也无济于事。
原创粉丝点击