计算机软件在现代科学技术中有着十分重要地位和作用,已成为信息社会高技术竞争的关键领域之一。我在这篇文章中针对计算机软件两大开发方法:结构化方法与面向对象方法进行了梳理、对比,剖析了结构化方法和面向对象方法这两种软件开发方法具体的分析设计过程,讨论了各自在不同软件开发中的应用及局限性,并在最后提出了一点自己的看法。
1结构化方法
结构化方法(Structured Methodology)是编程领域的一种典型的系统开发方法。 它采用了系统科学的思想方法,从层次的角度,自顶向下地分析和设计系统。 结构化方法包括结构化分析(Structured Analysis,简称 SA)、结构化设计(Structured Design,简 称 SD)和结构化程序设计(Structured Program Design,简称 SP)三部分内容。 其中,SA 和 SD 主要属于程序抽象的内容,SP 则主要属于程序设计方面的内容。
1.1结构化方法遵循的基本原则:
(1)抽象原则
(2)分解原则
(3)模块化原则
1.2结构化方法建模:
建模通常是从系统的需求分析开始, 在结构化方法中,就是使用 SA 方法构建系统的环境模型;然后使用 SD 方法,确定系统的行为和功能模型;最后用 SP 方法进行系统的设计。 SD 的主要任务就是要在系统环境模型的基础上建立系统的行为 和功能模型,完成系统内部行为的描述。 实现系统行为和功能模型的 主要工具有:数据字典、数据流图、状态变迁图和实体一联系模型等
1.2.1数据流图:
数据流图(DFD)是SA和 SD的核心技术,它是一个有向图,弧线表示数据,节点表示数据流通过的程序。程序还可以再细分为更细的数据流程图,不断细分子程序,直到表达清楚程序机能为止。对于抽象底层的代码块或函数,一般用程序规格(specification)详述,程序规格特殊情况下也可以是流程图或伪代码。
DFD采用面向处理过程的思想将系统的一些重要信息可视化,这些信息包括:系统的执行过程,系统的执行效果,系统的用法, 信息流和数据从输入到输出的变换等。用户可以通过DFD了解到系统的一个大致边界,并展示系统和外部的接口、数据的 输入和输出以及数据的存储。
1.2.2数据字典
数据字典是结构化分析方法的核心。数据字典是对所有与系统相关的数据元素的一个有组织的列表,数据元素的 定义必须是精确的、严格的和明确的,使用户和系统分析员对输入、输出、存储和中间结果有共同的理解。
数据字典的作用是对数据流图(DFD)中出现的被命名的图形元素的确切解释,通常一个实体包含的信息有:①名字; ②别名; ③用途; ④内容描述; ⑤备注信息。
1.2.3状态变迁图
状态变迁图(STD)指明作为外部事件的结果系统将如何动作。STD是行为建模的基础。关于软件控制的附加信息包含在控制规约(CSPEC)中。它及时地描述了对象的状态,它着重系统的时间依赖行为。 状态变迁图源于实时系统的建模。 状态变迁图看起来非常像数据流图,然而,它们之间却存在着本质的不同。 数据流图着重于数据流和数据转换的过程,而状态变迁图着重于状态的描述,如激励发生时的开始状态和系统执行响应后的结果状态。 状态变迁图的条件和一个过程的输入数据流相对应,同时,还与控制流的流出相对应。
1.2.4 实体一联系模型:
实体一联系模型被用来模拟系统数据部件之问的相互关系。 实体一联系模型独立于当前的系统状态,并与具体的计算机程序设计语言无关。
1.3结构化程序设计(SP):
(1) 主张使用顺序、选择、循环三种基本结构来嵌套连结成具有复杂层次的“结构化程序”,严格控制GOTO语句的使用。用这样的方法编出的程序在结构上具有以下效果:
a. 以控制结构为单位,只有一个入口,一个出口,所以能独立地理解这一部分。
b. 能够以控制结构为单位,从上到下顺序地阅读程序文本。
c.由于程序的静态描述与执行时的控制流程容易对应,所以能够方便正确地理解程序的动作。
(2)“自顶而下,逐步求精”的设计思想,其出发点是从问题的总体目标开始,抽象低层的细节,先专心构造高层的结构,然后再一层一层地分解和细化。这使设计者能把握主题,高屋建瓴,避免一开始就陷入复杂的细节中,使复杂的设计过程变得简单明了,过程的结果也容易做到正确可靠。
(3)“独立功能,单出、入口”的模块结构,减少模块的相互联系使模块可作为插件或积木使用,降低程序的复杂性,提高可靠性。程序编写时,所有模块的功能通过相应的子程序(函数或过程)的代码来实现。程序的主体是子程序层次库,它与功能模块的抽象层次相对应,编码原则使得程序流程简洁、清晰,增强可读性。
2. 面向对象方法
面向对象方法是从内部结构上模拟客观世界 ,其基本思想为 :对象是对现实世界客观实体的描述 ,均由其属性和相关操作组成 ,是系统描述的基本单位 .面向对象方法更强调运用人类在日常的逻辑思维中经常采用的思想方法和原则 ,例如抽象 、分类、继承、聚合、封装等,这使得软件开发者能更有效地思考问题 , 并以其他人也能看得懂的方式把自己的认识表达出来。
2.1面向对象分析(OOA)
2.1.1 OOA概述:
1.认识对象及其属性。
2.认识对象的整体及其组成部分。
3.对象的形成及类的区分。
4.对问题空间进行理解并抽象成模型。
2.1.2 OOA的五个阶段:标识对象、标识结构、标识主题、定义属性、定义服务,即分五个层次建立面向对象分析的模型.面向对象分析的优点是使功能分析与数据分析使用统一的概念和方法,克服了结构化分析中两者之间的不一致性和不协调性.
2.1.3 OOA的主要原则:
(1)抽象:从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征,就叫作抽象。抽象是形成概念的必须手段。
抽象原则有两方面的意义:第一,尽管问题域中的事物是很复杂的,但是分析员并不需要了解和描述它们的一切,只需要分析研究其中与系统目标有关的事物及其本质性特征。第二,通过舍弃个体事物在细节上的差异,抽取其共同特征而得到一批事物的抽象概念。 抽象是面向对象方法中使用最为广泛的原则。抽象原则包括过程抽象和数据抽象两个方面。
过程抽象是指,任何一个完成确定功能的操作序列,其使用者都可以把它看作一个单一的实体,尽管实际上它可能是由一系列更低级的操作完成的。
数据抽象是根据施加于数据之上的操作来定义数据类型,并限定数据的值只能由这些操作来修改和观察。数据抽象是OOA的核心原则。它强调把数据(属性)和操作(服务)结合为一个不可分的系统单位(即对象),对象的外部只需要知道它做什么,而不必知道它如何做。
(2)封装就是把对象的属性和服务结合为一个不可分的系统单位,并尽可能隐蔽对象的内部细节。
(3)继承:特殊类的对象拥有的其一般类的全部属性与服务,称作特殊类对一般类的继承。
(4)分类:就是把具有相同属性和服务的对象划分为一类,用类作为这些对象的抽象描述。分类原则实际上是抽象原则运用于对象描述时的一种表现形式。 (5)聚合:又称组装,其原则是:把一个复杂的事物看成若干比较简单的事物的组装体,从而简化对复杂事物的描述。
(6)关联:是人类思考问题时经常运用的思想方法:通过一个事物联想到另外的事物。能使人发生联想的原因是事物之间确实存在着某些联系
(7)消息通信:这一原则要求对象之间只能通过消息进行通信,而不允许在对象之外直接地存取对象内部的属性。通过消息进行通信是由于封装原则而引起的。在OOA中要求用消息连接表示出对象之间的动态联系。
(8)粒度控制:一般来讲,人在面对一个复杂的问题域时,不可能在同一时刻既能纵观全局,又能洞察秋毫。因此需要控制自己的视野:考虑全局时,注意其大的组成部分,暂时不详察每一部分的具体的细节;考虑某部分的细节时则暂时撇开其余的部分。这就是粒度控制原则。
(9)行为分析:现实世界中事物的行为是复杂的。由大量的事物所构成的问题域中各种行为往往相互依赖、相互交织
2.2面向对象设计
2.2.1面向对象设计的主要工作:
面向对象设计是一种软件设计方法,是一种工程化规范。这是毫无疑问的。面向对象设计的主要工作包括:
1.确定需要的类。
2. 给每个类提供一组完整的操作。
3. 明确地使用继承来表现共同点。
2.2.2面向对象设计的主要原则:
1.模块化
面向对象开发方法很自然地支持了把系统分解成模块的设计原则:对象就是模块。它是把数据结构和操作这些数据的方法紧密地结合在一起所构成的模块。
2.抽象
面向对象方法不仅支持过程抽象,而且支持数据抽象。
3.信息隐藏
在面向对象方法中,信息隐藏通过对象的封装性来实现。
4.低耦合
在面向对象方法中,对象是最基本的模块,因此,耦合主要指不同对象之间相互关联的紧密程度。低耦合是设计的一个重要标准,因为这有助于使得系统中某一部分的变化对其他部分的影响降到最低程度。
5.高内聚
包括操作内聚,类内聚,一般-具体内聚。
SOLID原则就是以上几个原则的具体实现和要求,这里就不再详述:
SRP |
The Single Responsibility Principle |
单一责任原则 |
OCP |
The Open Closed Principle |
开放封闭原则 |
LSP |
The Liskov Substitution Principle |
里氏替换原则 |
DIP |
The Dependency Inversion Principle |
依赖倒置原则 |
ISP |
The Interface Segregation Principle |
接口分离原则 |
2.2.3 面向对象设计的主要任务如下:
1.对象定义规格的求精
对于面向对象分析所抽象出来的对象、类,以及汇集的分析文档,面向对象设计需要有一个根据设计要求整理和求精的过程,使之更能符合面向对象编程的需要。
2.数据模型和数据库设计
数据模型的设计需要确定类、对象属性的内容、消息连接的方式、系统访问、数据模型的方法等。最后,每个对象实例的数据都必须落实到面向对象的库结构模型中。
3.优化
面向对象设计的优化设计过程是从另一个角度对分析结果和处理业务过程的整理归纳,优化包括对象和结构的优化、抽象、集成。
2.2.4 面向对象设计范例—UML类图(以我们组的软工设计为例)
3对比与总结:
结构化方法是对系统功能建模,基于功能分解设计系统结构,从内部功能上模拟客观世界,其建立的模型比较直观、简单、可读性好,有利于客户和开发人员的交流,能够把一个复杂的系统用多个满足独立性要求的小模块来实现,能够有效地提高软件开发质量。面向对象方法则是从行为的角度进行建模,基于行为分析法认定对象及它们之间的关系, 从内部结构上模拟客观世界,它采用了新概念,新方法,新的表示形式,易于进行代码的复用,系统的重构,面对需求的变更也可以更加轻松地应对。但在实际应用中,开发的大型软件系统通常是混合型系统,即需要处理实时信息,又需要数据库的支持,同时还涉及大量的事务性操作请求,在这种情况下,在选用面向对象方法的同时在局部处理上可以结合使用结构化方法。
4. 参考文献
[1].张莉, 裘国永. 结构化方法与面向对象方法的比较分析[J]. 陕西师范大学学报 (自然科学版), 2001, 29(2): 29-32.
[2].汪寒昊, 谢加胜, 邢跃. 软件开发方法——结构化方法与面向对象方法比较[J]. 科技信息, 2011, 13: 052.
[3]. 朱培栋 杨桃栏. 面向对象方法与结构化方法的比较[J]. 计算机与现代化, 1995, 第一期.
[4]张海潘.软件工程导论[M].5 版.清华大学出版社,2008 年 3 月.
[5]毕忠东,刘启明.面向对象的软件工程与面向对象的建模方法[J].福建电脑, 2007(8).