在软件开发的过程中,为了有计划的对软件进行开发,提高软件开发的效率,主要采用结构化方法和面向对象方法两种软件开发方法。这两种开发方法有一定的联系,但在本质上还是有着较大的区别,下面本文将对这两种方法分别进行介绍。
一、结构化方法
结构化方法起源于19世纪60年代,由于当时的软件危机导致人们提出了结构化方法,它极大地改善了软件开发的效率。结构化方法起源最早,因此也是应用最成熟,影响最大的一种软件开发方法,只到现在,仍然有很多复杂的系统是通过结构化方法进行开发的。
结构化方法强调的是软件开发方法的结构的合理性和系统结构的合理性。它有一些基本要点:自顶向下、逐步求精、模块化设计、机构化编码,这些要点都是经过人们长时间的实践而验证是正确的。为了提高软件结构的合理性,人们又规定了一些准则,比如分解与抽象、模块独立性、信息隐蔽等。在软件设计过程的不同阶段中,结构化设计又分为不同的方法,包括结构化分析(SA),结构化设计(SD),结构化编程设计(SP)。
1.1 绍结构化分析
结构化分析方法给出一组帮助系统分析人员产生功能规约的原理与技术。它一般利用图形表达用户需求,使用的手段主要有数据流图、数据字典、结构化语言、判定表以及判定树等。
结构化分析的步骤如下:
①分析当前的情况,做出反映当前物理模型的DFD;
②推导出等价的逻辑模型的DFD;
③设计新的逻辑系统,生成数据字典和基元描述;
④建立人机接口,提出可供选择的目标系统物理模型的DFD;
⑤确定各种方案的成本和风险等级,据此对各种方案进行分析;
⑥选择一种方案;
⑦建立完整的需求规约。
结构化分析的过程是自顶向下的,它将整个系统分为很多层,第0层就是整个系统。而分层的过程可以看做是一个递归的过程,比如将整个系统分为A,B,C三个模块,那么就可以对这三个模块使用相同的方法继续向下分层,直到成为最基本的功能。值得注意的是,对于每一层的模块来说,它可见的只有它下面一层的模块,也就是说它只需要通过调用它下一层的模块来实现它的功能,而不用关注他的下一层的模块是如何实现的。
自顶向下逐层分解
1.2 结构化设计
从技术的角度,结构化设计将软件设计分为4个阶段,即结构设计、数据设计、接口设计、过程设计。
其中结构设计、数据设计、接口设计是属于概要设计阶段的,而过程设计则属于详细设计阶段。
结构设计的过程中,开发人员通过SA得到的数据流图,建立一个良好的模块结构图(SC图)。
在数据设计的过程中,需要进行文件设计,数据库设计等等。
在接口设计的过程中,需要设计出各个模块之间的接口,方便模块之间的互相调用。还需要设计与软件与人之间的的接口以及软件与其他软件以及硬件之间的接口。
在过程设计的过程中,需要根据各个模块的功能,设计实现其功能的具体算法,并用过程描述工具精确地描述这些算法。
通过结构化设计,开发人员就可以把数据流图转换成为系统结构图,并使得程序的结构尽可能地符合需要解决的实际问题的结构。
1.3结构化编程
结构化程式设计是一种编程典范。它采用子程序、程式码区块、for循环以及while循环等结构,来取代传统的 goto。希望借此来改善计算机程序的明晰性、品质以及开发时间。
结构化程序设计提出的原则可以归纳为32个字:自顶向下,逐步细化;清晰第一,效率第二;书写规范,缩进格式;基本结构,组合而成。
C语言就是一种典型的结构化语言,它的程序可以分为一些简单的程序流程结构:顺序、选择、循环。
顺序就是指代码按照顺序一条一条向下执行。
选择就是指代码可以根据不同的条件,进入不同的分支,执行相应的操作。
循环就是指反复执行一段代码,直到条件不成立再终止循环。
1.4 结构化设计的优缺点
优点:通过结构化的方法,能够将一个复杂的系统逐步分解成许多简单的模块,便于实现,提高了开发效率
缺点:由于在软件开发的过程中,客户的需求是随时可能出现变化的,而结构化设计是将功能分解成许多模块,所以当需求变化时,对程序的修改就会很繁琐。同时,由于结构化设计并不是对现实中的固有事物进行抽象,所以结构化设计的结果并不能很好地反应需要解决的问题。
二、面向对象方法
面向对象方法起源于面向对象语言。上世纪80年代,由于人们对信息隐蔽和抽象数据类型的研究,提出了面向对象语言。通过不断的探索,各种面向对象语言如Object-c、Eiffel、c++、Java、Object-Pascal等被提了出来。正是这些语言的推广,使得人们注意到了OO方法所具有的模块化、信息封装与隐蔽、抽象性、继承性、多样性等独特之处,这些优异特性为研制大型软件、提高软件可靠性、可重用性、可扩充性和可维护性提供了有效的手段和途径,从而产生了面向对象方法(OOA)。
2.1 面向对象简介
在面向对象的理论里中,对象就是指显示生活中的一系列事物,而类就是对象的模板,是保留对象的主要属性,忽略其次要属性而得到的抽象。
面向对象有一些重要的特性:封装性、继承性、多态性。
封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性。封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者和对象者的使用分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来访问该对象。
继承性是子类自动共享父类之间数据和方法的机制。它由类的派生功能体现。一个类直接继职其它类的全部描述,同时可修改和扩充。
多态性指对象根据所接收的消息而做出动作。同一消息为不同的对象接受时可产生完全不同的行动,这种现象称为多态性。
2.2 面向对象的分析方法介绍
面向对象的分析方法(OOA),是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。在面向对象方法中,整个系统被分解成对象的集合,而不是功能的集合,每个对象有自己的职责,对象之间相互协作来完成用户交给的任务。
面向对象系统的结构
与结构化相比,它不是层次结构,在结构化中,上一层依赖下一层,下一层又依赖下下一层。只要底层改变,上层也要跟着改变,它没有很好的隔离变化.而面向对象刚很好的封装了变化,外界只需使用对象的接口,而不用管这个接口是如何实现的。
在使用OOA时,我们一般会遵循以下原则:
- 数据抽象。数据抽象是OOA的核心,数据抽象把一组数据对象以及作用其上的操作组成一个程序实体,使得外部只知道它是如何做和如何表示的。恰当的过程抽象可以对复杂过程的分解和确定以及描述对象发挥积极的作用。
- 封装。即信息隐蔽。它是指在确定系统的某一部分内容时,应考虑到其它部分的信息及联系都在这一部分的内部进行,外部各部分之间的信息联系应尽可能的少。
- 继承。继承是指能直接获得已有的性质和特征而不必重复定义它们。OOA可以一次性地指定对象的公共属性和方法,然后再特化和扩展这些属性及方法为特殊情况,这样可大大地减轻在系统实现过程中的重复劳动。
2.3 面向对象的分析方法的步骤
在用OOA具体地分析一个事物时,大致上遵循如下五个基本步骤:
- 确定对象和类。这里所说的对象是对数据及其处理方式的抽象,它反映了系统保存和处理现实世界中某些事物的信息的能力。类是多个对象的共同属性和方法集合的描述,它包括如何在一个类中建立一个新对象的描述。
- 确定结构。结构是指问题域的复杂性和连接关系。类成员结构反映了泛化-特化关系,整体-部分结构反映整体和局部之间的关系。
- 确定主题。主题是指事物的总体概貌和总体分析模型。
- 确定属性。属性就是数据元素,可用来描述对象或分类结构的实例,可在图中给出,并在对象的存储中指定。
- 确定方法。方法是在收到消息后必须进行的一些处理方法:方法要在图中定义,并在对象的存储中指定。
2.4 面向对象方法的优缺点
面向对象方法是按照人们认识事物的思维方式来设计的,所以它便于理解,并且维护起来也十分便利。在功能需求改变时,开发人员只需要对相应的类的内部进行修改,而不用大范围地修改,具有很好的稳定性。
缺点就是对抽象的层次、粒度等比较难以掌握。发生错误时,由于继承和封装机制,定位错误也比较困难。
三、总结
总的来说,结构化方法和面向对象方法并不是对立的,不管使用哪种方法,都需要对问题进行深刻的分析和理解,才能设计出好的软件。两者也没有孰优孰劣之分,只要能够正确使用,都能够,完成软件设计的任务。
【参考资料】
百度百科:结构化分析
百度百科:结构化设计
百度百科:结构化编程
百度百科:面向对象方法
百度文库:《结构化方法与面向对象方法的比较分析》. 吴松娇