1、第10章 程序设计和软件工程基础10.1 程序设计语言概述10.1.1 指令、程序及计算机语言 指令及指令系统 指令指令(Instruction)是用来指挥和控制计算机完成某种基本操作的命令。程序是由一系列指令序列组成的,用以完成一个指定的任务。 指令格式一条指令,通常包括两方面的内容:操作码及地址码。其中,操作码用来表示一条指令操作特性及功能,即做什么样的操作;地址码给出参与操作的数据在存储中的地址,即操作对象。因此,一条指令的基本格式可以表示为:操作码地址码 指令系统一种类型的计算机所能识别的一组指令的集合称为指令集(Instruction Set)或指令系统。指令系统决定了一台计算机硬件
2、的主要性能和基本功能。一种计算机的指令系统都比较充分地说明该种机器的运算和处理能力。一般微型计算机有几十条到几百条不同的指令。这些指令可按其操作功能的不同分为以下四类: 数据处理指令数据处理指令以某种方式对数据进行算术运算、逻辑运算、移位和比较。这些指令的操作功能一般由运算器的算术逻辑运算单元(ALU)来完成。 数据传送指令数据传送指令的功能是将数据从一个地方传送到另一个地方,而改变数据的位置。如:存储器传送指令、输入输出指令等。 程序控制指令程序控制指令能改变程序计数器的PC(Program Counter)内容,使程序改变正常的执行顺序。如:无条件转向指令、子程序调用指令等。 状态管理指令
3、状态管理指令数量一般较少,其功能是只改变CPU的工作状态,而不影响其它指令和数据。如:开放中断指令、禁止中断指令等。 程序及其特性程序是为完成某一任务用计算机语言编写的有限个操作命令的序列。程序有以下特性: 目的性:程序总是有一明确的目的,是为解决问题而设计的。 分步性:程序总是分成若干个操作步骤,逐步解决问题。 有限性:有限个操作步骤以便计算机实现,如果有无穷多个步骤,就无法完成。 顺序性:程序中的指令是按一定的顺序执行的。 分支性:根据条件的不同,可以实现不同步骤来解决问题。计算机之所以能自动地工作,就是因为运行程序的结果。计算机能按照程序的安排去执行相应的指令,才使计算机看起来像是自动地
4、、连续地工作。 计算机语言人和计算机交流信息使用的语言称为计算机语言或称程序设计语言。计算机语言通常分为机器语言、汇编语言和高级语言三类。 机器语言机器语言是一种用二进制代码“0”和“1”形式表示的,能被计算机直接识别和执行的语言。用机器语言编写的程序,称为计算机机器语言程序。它是一种低级语言,用机器语言编写的程序不便于记忆、阅读和书写。通常不用机器语言直接编写程序。 汇编语言汇编语言是一种用助记符表示的面向机器的程序设计语言。汇编语言的每条指令对应一条机器语言代码,不同类型的计算机系统一般有不同的汇编语言。用汇编语言编写的程序称为汇编语言源程序,机器不能直接识别和执行,必须由“汇编程序”(或
5、汇编系统)翻译成机器语言程序才能运行。这种“汇编程序”就是汇编语言的翻译程序。汇编语言适用于编写直接控制机器操作的低层程序,它与机器密切相关,不容易使用。 高级语言高级语言是一种比较接近自然语言和数学表达式的一种计算机程序设计语言。一般用高级语言编写的程序称为“源程序”,计算机不能识别和执行,必须把源程序翻译成机器指令,计算机才能识别和执行。通常有编译和解释两种翻译方式。编译方式是将源程序整个编译成目标程序,然后通过链接程序将目标程序链接成可执行程序。经过一次编译过程后,如果需要再次执行该程序,则无需再翻译,可直接执行可执行程序。工作过程如图10-1所示。解释方式是将源程序逐句翻译,翻译一句执
6、行一句,边翻译边执行,不产生目标程序,从而节省了存储空间,但是每次执行必须重新进行翻译。BASIC语言就属于这一类,但改进的BASIC语言Visual Basic可进行程序的编译。工作过程如图10-2所示。图10-1 编译程序的工作过程图10-2 解释程序的工作过程10.1.2 程序设计风格一般来讲,程序设计风格是指编写程序时所表现出的特点、习惯和逻辑思路。因此程序设计的风格总体而言应该强调程序简单和清晰,并且是可以理解的。 “清晰第一,效率第二”已成为当今主导的程序设计风格。程序设计风格主要体现在以下几个方面: 源程序文挡化源程序文挡化应考虑如下几点: 符号名的命名符号名的命名应具有一定的实
7、际含义,以便于对程序功能的理解。 程序注释正确的注释能够帮助读者理解程序。注释一般分为序言性注释和功能性注释。序言性注释通常位于每个程序的开头部分,它给出了程序的整体说明,主要描述内容包括:程序标题、程序功能说明、主要算法、接口说明、程序位置、开发简历、程序设计者、复审者、复审日期、修改日期等。功能性注释的位置一般嵌在源程序体中,主要描述其后的语句或程序做什么。 视觉组织为使程序的结构一目了然,可以在程序中利用空格、空行、缩进等技巧使程序的结构层次清晰。 数据说明的方法在编写程序时,需要注意数据说明的风格,以便使程序中的数据更易于理解和维护。一般应注意如下几点: 数据说明的次序规范化鉴于程序理
8、解、阅读和维护的需要,使数据说明次序固定,可以使数据的属性容易查找,也有利于测试、排错和维护。 说明语句中变量安排有序化当一个说明语句说明多个变量时,变量按照字母顺序排序为好。 使用注释来说明复杂数据的结构。 语句的结构程序应该简单易懂,语句构造应该简单明了,不应该为了提高效率而把语句复杂化。一般应注意以下几点: 一行内只写一条语句; 程序编写应优先考虑清晰性; 除非对效率有特殊要求,程序编写要做到清晰第一,效率第二; 首先要保证程序正确,然后才要求提高速度; 避免使用临时变量而使程序的可读性下降; 避免不必要的转移; 尽可能使用库函数; 避免采用复杂的条件语句; 尽量减少使用“否定”条件的条
9、件语句; 数据结构要有利于程序的简化; 要模块化,使模块功能尽可能单一化; 利用信息隐蔽,确保每一个模块的独立性。 输入和输出输入和输出信息是用户直接关心的,输入和输出方式和格式应尽可能方便用户的使用,无论是批处理的输入和输出方式,还是交互式的输入和输出方式,在设计和编程时都应该考虑如下原则: 输入格式要简单,以使得输入的步骤和操作尽可能简单; 输入数据时,允许使用自由格式,允许缺省值; 输入一批数据时,最好使用输入结束标志; 在以交互式输入/输出方式进行输入时,要在屏幕上使用提示符明确提示输入的请求,同时数据输入过程中和输入结束时,应在屏幕上给出状态信息。10.2 结构化程序设计10.2.1
10、 结构化程序设计的原则由于软件危机的出现,人们开始研究程序设计方法,其中最受关注的是结构化程序设计方法。结构化程序设计方法引入了工程思想和结构化思想,使大型软件的开发和编程都得到极大的改善。结构化程序设计方法的主要原则可以概括为自顶向下,逐步求精,模块化,限制使用GOTO语句。 自顶向下程序设计时,应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化。 逐步求精对复杂的问题,应设计一些子目标作过渡,逐步细化。 模块化一个复杂的问题,肯定是由若干个比较简单的问题构成。模块化是把程序要解决的总目标分解为分目标,再进一步
11、分解为具体的小目标,把每个小目标称为一个模块。10.2.2 结构化程序的基本结构结构化程序设计方法是程序设计的先进方法和工具。采用结构化程序设计方法编写程序,可使程序结构良好、易读、易理解、易维护。程序设计语言仅仅使用顺序、选择和循环三种基本控制结构就能表达出各种其它形式结构的程序设计方法。 顺序结构顺序结构是一种简单的程序设计,它是最基本、最常用的结构,如图10-3所示。顺序结构是顺序执行的结构,所谓顺序执行,就是按照程序语句行的自然顺序,逐条执行语句以达到执行程序。 选择结构选择结构又称为分支结构,它包括简单选择和多分支选择结构,这种结构可以根据设定的条件,判断应该选择哪一条分支来执行相应
12、的语句序列。图10-4列出了包含2个分支的简单选择结构。 循环结构循环结构又称为重复结构,它根据给定的条件,判断是否需要重复执行某一相同的或类似的程序段,利用循环结构可以简化大量的程序行。图10-5所示 图10-3 顺序结构 图10-4 选择结构图10-5 循环结构10.3 面向对象程序设计10.3.1 面向对象程序设计基本概念关于面向对象方法,对其概念有许多不同的看法和定义,但是都涵盖对象及对象属性与方法、类、继承等几个基本要素。下面分别介绍面向对象方法中这几个重要的概念,这些概念是理解和使用面向对象方法的关键和基础。 对象(Object)对象是面向对象方法中最基本的概念。对象可以用来表示客
13、观世界中的任何实体,也就是说,应用领域中有意义的、与所要解决的问题有关系的任何事物都可以作为对象,它既可以是具体的物理实体的抽象,也可以是人为的概念,或者是任何有明确边界和意义的实体。例如,一个人、一家公司、一个窗口、贷款和借款等,都可以作为一个对象。面向对象的程序设计方法中涉及的对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位,它由一组表示静态特征的属性和它可执行的一组操作组成。例如,一辆汽车是一个对象,它包含了汽车的属性(如颜色、型号、载重量等)及其操作(如启动、刹车等)。一个窗口是一个对象,它包含了窗口的属性(如大小、颜色、位置等)及其操作(如打开、关闭等)。客观世界中的
14、实体通常都既有静态的属性,又具有动态的行为,因此,面向对象方法学中的对象是由描述该对象属性的数据以及可以对这些数据施加的所有操作封装在一起构成的统一体。对象可以做的操作表示它的动态行为,在面向对象分析和面向对象设计中,通常把对象的操作也称为方法。属性即对象所包含的信息,它在设计对象时确定,一般只能通过执行对象的操作来改变。如对象人的属性有姓名、年龄、体重等。不同对象的同一属性可以具有相同或不同的属性值。如张三的年龄为19,李四的年龄为20。张三、李四是两个不同的对象,他们共同的属性“年龄”的值不同。对象有如下一些基本特点: 惟一性指对象是具体的和可区分的,并且由对象的内在本质来区分,而不是通过
15、描述来区分。 分类性指可以将具有相同属性和操作的对象抽象成类。 封装性从外面看只能看到对象的外部特征,即只需知道数据的取值范围和可以对该数据施加的操作,根本无需知道数据的具体结构以及实现操作的算法。对象的内部,即处理能力的实行和内部状态,对外是不可见的。从外面不能直接使用对象的处理能力,也不能直接修改其内部状态,对象的内部状态只能由其自身改变。 模块独立性对象是面向对象的软件的基本模块,它是由数据及可以对这些数据施加的操作所组成的统一体,而且对象是以数据为中心的,操作围绕对其数据所需做的处理来设置,没有无关的操作。从模块的独立性考虑,对象内部各种元素彼此结合得很紧密。 类(Class)和实例(
16、Instance)将属性、操作相似的对象归为类,也就是说,类是具有共同属性、共同方法的对象的集合。所以,类是对象的抽象,它描述了属于该对象类型的所有对象的性质,而一个对象则是其对应类的一个实例。要注意的是,当使用“对象”这个术语时,既可以指一个具体的对象,也可以泛指一般的对象,但是,当使用“实例”这个术语时,必然是指一个具体的对象。例如:Integer是一个整型类,它描述了所有整数的性质。因此任何整数都是整数类的对象,而一个具体的整数“123”是类Integer的一个实例。由类的定义可知,类是关于对象性质的描述,它同对象一样,包括一组数据属性和数据上的一组合法操作。例如,一个面向对象的图形程序
17、在屏幕左下角显示一个半径3cm的红颜色的圆,在屏幕中部显示一个半径4cm的绿颜色的圆,在屏幕右上角显示一个半径1cm的黄颜色的圆。这三个圆心位置、半径大小和颜色均不相同的圆,是三个不同的对象。但是,它们都有相同的属性(圆心坐标、半径、颜色)和相同的操作(显示自己、放大缩小半径、在屏幕上移动位置,等等)。因此,它们是同一类事物,可以用“Circle类”来定义。 继承(Inheritance)继承是面向对象的方法的一个主要特征。继承是使用已有的类定义新类的定义技术。已有的类可当作基类来引用,则新类相应地可当作派生类来引用。广义地说,继承是指能够直接获得已有的性质和特征,而不必重复定义它们。面向对象
18、软件技术的许多强有力的功能和突出的优点,都来源于把类组成一个层次结构的系统:一个类的上层可以有父类,下层可以有子类。这种层次结构系统的一个重要性质是继承性,一个类直接继承其父类的描述(数据和操作)或特性,子类自动地共享基类中定义的数据和方法。10.3.2 面向对象的程序设计现在,面向对象(Object oriented)方法已经发展成为主流的软件开发方法。面向对象方法的本质,就是主张从客观世界固有的事物出发来构造系统,提倡用人类在现实生活中常用的思维方法来认识、理解和描述客观事物,系统中的对象以及对象之间的关系能够如实地反映固有事物及其关系。面向对象方法之所以日益受到人们的重视和应用,成为流行
19、的软件开发方法,是源于面向对象方法的以下主要优点: 与人类习惯的思维方法一致传统的程序设计方法是面向过程的,其核心方法是以算法为核心,把数据和过程作为相互独立的部分,数据代表客体,程序则用于处理这些数据,在计算机内部数据和程序是分开存放的,这样的做法忽略了数据和操作之间的内在联系。实际上,用计算机解决的问题都是现实世界中的问题,这些问题无非由一些相互存在一定联系的事物所组成,每个具体的事物都具有行为和属性两方面的特征。因此,把描述事物静态属性的数据结构和表示事物动态行为的操作放在一起构成一个整体,才能完整、自然地表示客观世界中的实体。面向对象方法和技术以对象为核心。对象是由数据和操作组成的封装
20、体,与客观实体有直接的对应关系。对象之间通过传递信息互相联系,以模拟现实世界中不同事物彼此之间的联系。 稳定性好面向对象方法基于对象模型,以对象为中心构造软件系统。它的基本作法是用对象模拟现实生活中的实体,以对象间的联系刻画实体间的联系。当对系统的功能需求变化时并不会引起软件结构的整体变化,往往仅需要作一些局部性的修改。由于现实世界中的实体是相对稳定的,因此,以对象为中心构造的软件系统也是比较稳定的。而传统的软件开发方法以算法为核心,开发过程基于功能分析和功能分解。用传统方法所建立起来的软件系统的结构紧密地依赖于系统所要完成的功能,当功能需求发生变化时将引起软件结构的整体修改。事实上,用户需求
21、变化大部分是针对功能的,因此,这样的软件系统是不稳定的。 可重用性好软件重用是指在不同的软件开发过程中重复使用相同或相似软件的过程。重用是提高软件生产率的最主要的方法。传统的软件重用技术是利用标准函数库,也就是试图用标准函数库中的函数来建造新的软件系统。但是,标准函数往往不能适应不同应用场合的不同需要,并不是理想的可重用的软件成分。实际的库函数往往仅提供最基本、最常用的功能,在开发一个新的系统时,通常多数函数是开发者自己编写的,甚至绝大多数函数都是新编的。面向对象的软件开发技术在利用可重用的软件成分构造新的系统软件的时候,有很大的灵活性。有两种方法可以重复使用一个对象类:一种方法是创建该类的实
22、例,从而直接使用它;另一种方法是从它派生出一个满足当前需要的新类。继承性机制使得子类不仅可以重用其父类的数据结构和程序代码,而且可以在父类代码的基础上方便地修改和扩充,这种修改并不影响对原有类的使用。可见,面向对象的软件开发技术所实现的可重用性是自然和准确的。 易于开发大型软件产品当开发大型软件时,组织开发人员的方法不恰当往往是出现问题的主要原因。用面向对象方法开发软件时,可以把一个大型产品看作是一系列本质上相互独立的小产品来处理,这样不仅降低了开发的技术难度,而且也使得对开发工作的管理变得容易。许多软件开发公司的经验都表明,当把面向对象技术用于大型软件开发时,软件成本明显地降低了,软件的整体
23、质量也提高了。 可维护性好用传统的开发方法和面向过程的方法开发出来的软件很难维护,是长期困扰人们的一个严重问题,是软件危机的突出表现。面向对象的方法开发的软件可维护性好,是因为: 用面向对象的方法开发的软件稳定性比较好当对软件的功能或性能的要求发生变化时,通常不会引起软件的整体变化,往往只需对局部做一些修改。由于软件的改动较小且限于局部,自然比较容易实现。 用面向对象的方法开发的软件比较容易修改在面向对象方法中,核心是类(对象),它具有理想的模块机制,独立性好,修改一个类通常很少会牵扯到其它类。面向对象技术特有的继承机制,使得对所开发的软件的修改和扩充比较容易实现,通常只需从已有类派生出一些新
24、类,无需修改软件原有成分。 用面向对象的方法开发的软件比较容易理解在维护已有软件的时候,首先需要对原有软件与此次修改有关的部分有深入理解,才能正确完成维护工作。传统软件之所以难于维护,在很大程度上是因为修改所涉及的部分分散在软件的各个地方,需要了解的面很广,内容很多。面向对象的技术符合人们习惯的思维方式,用这种方法所建立的软件系统的结构与问题空间的结构基本一致。因此,面向对象的软件系统比较容易理解。对面向对象软件系统进行修改和扩充,通常是通过在原有类的基础上派生出一些新类来实现。由于对象类有很强的独立性,当派生新类的时候通常不需要详细了解基类中操作的实现算法。因此,了解原有系统的工作量可以大幅
25、度降低。 易于测试和调试为了保证软件的质量,对软件进行维护之后必须进行必要的测试,以确保要求修改或扩充的功能已正确的实现了,而且没有影响到软件未修改的部分。如果测试过程中发现了错误,还必须通过调试改正过来。显然,软件是否易于测试和调试,是影响软件可维护性的一个重要因素。10.4 软件工程基础10.4.1 软件工程基本概念 软件定义与软件特点计算机软件是计算机系统中与硬件相互依存的另一部分,是包括程序、数据及相关文档的完整集合。其中,程序是软件开发人员根据用户需求开发的、用程序设计语言描述的、适合计算机执行的指令(语句)序列。数据是使程序能正常操作信息的数据结构。文档是与程序开发、维护和使用有关
26、的图文资料。可见软件由两部分组成:一是机器可以执行的程序和数据;二是机器不可执行的,与软件开发、运行、维护、使用等有关的文档。软件在开发、生产、维护和使用等方面与计算机硬件相比存在明显的差异。深入理解软件的定义需要了解软件的特点: 软件是一种逻辑实体,而不是物理实体,具有抽象性。软件的这个特点使它与其它工程对象有着明显的差异。人们可以把它记录在纸上或存储介质上,但却无法看到软件本身的形态,必须通过观察、分析、思考、判断,才能了解它的功能、性能等特性。 软件的生产与硬件不同,它没有明显的制作过程。一旦研制开发成功,可以大量拷贝同一内容的副本。所以对软件的质量控制,必须着重在软件开发方面。 软件的
27、开发、运行对计算机系统具有依赖性,受计算机系统的限制,这导致了软件移植的问题。 软件复杂性高,成本昂贵。软件是人类有史以来生产的复杂度最高的工业产品。软件涉及人类社会的各行各业、方方面面,软件开发常常涉及其它领域的专门知识。软件开发需要投入大量、高强度的脑力劳动,成本高,风险大。 软件开发涉及诸多的社会因素。许多软件的开发和运行涉及软件用户的机构设置,体制问题以及管理方式等,甚至涉及到人们的观念和心理,软件知识产权及法律等问题。软件根据应用目标的不同,是多种多样的。软件按功能可以分为:应用软件、系统软件、支撑软件(或工具软件)。应用软件是为解决特定领域的应用而开发的软件。例如,事物处理软件,工
28、程与科学计算软件,实时处理软件,嵌入式软件,人工职能软件等应用性质不同的各种软件。系统软件是计算机管理自身资源,提高计算机使用效率并为计算机用户提供各种服务的软件。如操作系统,编译程序,汇编程序,网络软件,数据库管理系统等。支撑软件是介于系统软件和应用软件之间,协助用户开发软件的工具性软件,包括辅助和支持开发和维护应用软件的工具软件,如需求分析工具软件,设计工具软件,编码工具软件,测试工具软件,维护工具软件等,也包括辅助管理人员控制开发进程和项目管理的工具软件,如计划进度管理工具软件,过程控制工具软件,质量管理及配置管理工具软件等。 软件危机与软件工程所谓软件危机是指在计算机软件的开发和维护过
29、程中所遇到的一系列严重问题。实际上,几乎所有的软件都不同程度地存在这个问题。随着计算机技术的发展和应用领域的扩大,软件规模越来越大,复杂程度不断增加,软件成本逐年上升,质量没有可靠的保证,软件已成为计算机科学发展的“瓶颈”。具体地说,在软件开发和维护过程中,软件危机主要表现在: 软件需求的增长得不到满足。用户对系统不满意的情况经常发生; 软件开发成本和进度无法控制。开发成本超出预算,开发周期大大超过规定日期的情况经常发生; 软件质量难以保证; 软件不可维护或维护程度非常低; 软件的成本不断提高; 软件开发生产率的提高赶不上硬件的发展和应用需求的增长。总之,可以将软件危机归结为成本、质量、生产率
30、等问题。分析带来软件危机的原因,宏观方面是由于软件日益深入社会生活的各个层面,对软件需求的增长速度大大超过了技术进步所能带来的软件生产率的提高。而就每一项具体的工程任务来看,许多困难来源于软件工程所面临的任务和其它工程之间的差异以及软件和其它工业产品的不同。在软件开发和维护过程中,之所以存在这些严重的问题,一方面与软件本身的特点有关,例如,在软件运行前,软件开发过程的进展难衡量,质量难以评价,因此管理和控制软件开发过程相当困难;在软件运行过程中,软件维护意味着改正或修改原来的设计;另外,软件的显著特点是规模庞大,复杂度呈线性增长,在开发大型软件时,要保证高质量,极端复杂困难,不仅涉及技术问题(
31、如分析方法、设计方法、版本控制),更重要的是必须有严格而科学的管理。另一方面与软件开发和维护方法不正确有关,这是主要原因。为了消除软件危机,通过认真研究解决软件危机的方法,认识到软件工程是使计算机软件走向工程科学的途径,逐步形成了软件工程的概念,开辟了工程学的新兴领域软件工程学。软件工程就是试图用工程、科学和数学的原理与方法研制、维护计算机软件的有关技术及管理方法。软件工程的进步是近几十年软件产业迅速发展的重要原动力。从根本上说,其目的是研究软件的开发技术,软件工程的名称意味着用工业化的开发方法来替代小作坊式的开发模式。但是,几十年的软件开发和软件发展的实践证明,软件开发是既不同于其它工业工程
32、,也不同于科学研究。软件不是自然界的有形物体,它作为人类智慧的产物有其本身的特点,所以软件工程的方法、概念、目标等都在发展,有的与最初的想法有了一定的差距。但是认识和学习过去和现在的发展演变,真正掌握软件开发技术的成就,并为进一步发展软件开发技术,以适应时代对软件的更高期望是有极大意义的。软件工程的核心思想是把软件产品看作是一个工程产品来处理。把需求计划、可行性研究、工程审核、质量监督等工程化的概念引入到软件生产当中,以期达到工程项目的三个基本要素:进度、经费和质量的目标。同时,软件工程也注重研究不同于其它工业产品生产的一些独特特性,并针对软件的特点提出了许多有别于一般工业工程技术的一些技术方
33、法。代表性的有结构化的方法、面向对象方法和软件开发模型及软件开发过程等。 软件生命周期软件工程注重研究如何指导软件生产全过程的所有活动,以最终达到“在合理时间、成本等资源的约束下,生产出高质量的软件产品”的目标。为了更有效、更科学地组织和管理软件生产,根据某一软件从被提出并着手开始实现,直到软件完成其使命为止的全过程划分为一些阶段,并称这一全过程为软件生命周期。通常,软件生命周期包括八个阶段:问题定义、可行性研究、需求分析、系统设计、详细设计、编码、测试及运行维护。为使各时期的任务更明确,将其划分为以下三个时期: 软件定义期 问题定义这一阶段的主要目的是确定问题的性质、工程目标以及规模。这是软
34、件生命周期的第一阶段,应力求使软件开发人员、用户及使用部门负责人对问题的性质、工程目标及规模取得完全一致的看法,这对确保软件开发成功是非常重要的。一旦对问题有了明确认识之后,分析员应提交书面报告给用户及使用部门负责人进行审查。 可行性研究可行性研究的目的是进一步研究上一阶段所定义的问题是否可解。在问题定义的基础上,通过复查系统的目标和规模,并研究现在正在使用的系统,从而导出试探性的解。这个过程可能要反复多遍,最后导出系统的高层逻辑模型,在系统的高层逻辑模型的基础上,再从各方面分析物理系统的可行性,推荐一个可行方案,供有关部门审批。在描述物理系统时,常常采用系统流程图这一工具,系统流程图是用一些
35、约定的图形符号对系统内部各部件进行描述。在此特别指出,这种系统流程图是物理数据流程图,而不是程序流程图。在这个阶段中,往往还需要对成本和效益进行分析,并且,最后还要提交必要的文档。 需求分析在这个阶段中,根据可行性研究阶段提交的文档,特别是从数据流图出发,对目标系统提出清晰、准确和具体的要求,即要明确系统必须作什么的问题。这一阶段的具体问题包括:确定对系统的综合要求,即功能要求、性能要求、运行要求以及将来可能会提出的一些要求;对系统的数据要求进行分析,包括数据元素的分类和规范化,描绘实体关系图,进行事务分析及数据库模型的建立;在前面分析的基础上,推导出系统的详细逻辑模型;修正开发计划,并建立模
36、型系统。需求分析首先从数据流图着手,在沿数据流图回溯的过程中,更多的数据元素被划分出来,更多的算法被确定下来。在这个过程中,将得到的有关数据元素的信息记录在数据字典中,而将对算法的简单描述记录在输入/处理/输出(IPO)图中,被补充的数据流、数据存储和处理添加到数据流图的适当位置上,然后提交用户复查,以便补遗。经过反复地进行上述分析之后,分析员对系统的数据及功能就有了更深的了解,此时可通过对功能的分解将数据流图细化,即将数据流图中的比较复杂的处理功能分解成若干个简单的子功能,而这些较低层的子功能又重新组成一张数据流图。这就是逐步细化的具体体现。经过以上分析,就可以修正开发计划,然后写出必要的文
37、档。文档的内容包括:系统的功能说明,它主要由数据流图和输入/处理/输出图(或其它形式的算法描述记录)组成,主要描述了目标系统的概貌及对系统的综合要求;系统对数据的要求,它主要由数据字典和描述数据结构的层次方框图组成;用户系统描述,即初步的用户手册,它主要包括对系统功能和性能的扼要描述、使用的方法和步骤等。在转入下一阶段之前,还必须进行审查和复查,通过之后即可进入软件开发期。 软件开发期 系统设计这一阶段也称为一般设计,其任务是划分出构成系统的各物理元素(如程序、文件、数据库、人工过程或文档等)以及设计出软件的结构(如确定模块及模块之间的关系)。设计过程通常分以下几步:提出可选择方案;选择合理方
38、案;推荐最佳方案;功能分解;设计软件结构;制定测试计划;提交文档。这一阶段的最后要对结果进行严格的技术审查,然后由使用部门负责人从管理的角度进行复查。 详细设计详细设计的任务是对系统作出精确的描述,以便在编码阶段可直接将这一描述用程序设计语言编制成程序。除了应该保证程序的可靠性外,此阶段最主要的目标是要保证将来的程序易读、易理解、易测试、易修改和易维护。因此,结构程序设计技术就成为实现上述目的的基本保证,并且也是详细设计的逻辑基础。作为这一阶段的最后结果,应提供详细的编码规格说明,它通常用层次图加输入/处理/输出(HIPO)图或过程描述语言(PDL)来描述。 编码编码是将系统设计和详细设计阶段
39、中的结果翻译成用某种程序设计语言书写的程序。 测试目前,软件测试仍然是保证软件可靠性的主要手段,它是软件开发过程中最艰巨最繁重的工作。测试的目的是查找程序中的错误,但决不能证明程序中没有错误。 软件维护期维护是软件生命周期的最后一个阶段,也是持续时间最长、付出代价最大的阶段。软件工程学的目的就在于提高软件的可维护性,同时也设法降低维护的代价。软件维护通常有以下四类:为纠正使用中出现的错误而进行的改正性维护 ;为适应环境变化而进行的适应性维护;为改进原有软件而进行的完善性维护;为将来的可维护和可靠而进行的预防性维护。软件的可理解性、可测试性和可修改性直接影响和决定了软件的可维护性,而且软件生存周
40、期的各个阶段都与可维护性有关。良好的设计、完善的文档资料以及一系列严格的复审和测试,都会使错误一旦出现就较为容易诊断和纠正;而且当用户有所要求或外部环境有变化时,软件都比较容易适应,并能减少维护所引起的副作用。因此,在软件生存周期的各个阶段必修充分考虑维护的问题,并且为维护作好准备。软件维护不仅包括程序代码的维护,还包括文档的维护。文档可以分为用户文档和系统文档两类,但无论是哪类文档,都必须和程序代码同时维护,只有和程序代码完全一致的文档才有意义和价值。目前已有许多软件工具能帮助建立文档,这不仅有利于提高书写文档的效率和质量,还有助于文档的及时维护。 软件工程的目标与原则 软件工程的目标软件工
41、程的目标是在给定成本、进度的前提下,开发出具有有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可操作性且满足用户需求的产品。软件工程需要达到的基本目标是:付出较低的开发成本;达到要求的软件功能;取得较好的软件性能;开发的软件易于移植;需要较低的维护费用;能按时完成开发,及时交付使用。基于软件工程的目标,软件工程的理论和技术性研究的内容主要包括: 软件开发技术软件开发技术包括:软件开发方法学、开发过程、开发工具和软件工程环境,其主体内容是软件开发方法学。软件开发方法学是根据不同的软件类型,按不同的观点和原则,对软件开发中应遵循的策略、原则、步骤和必须产生的文档资料都做出规定,从
42、而使软件的开发能够进入规范化和工程化的阶段,以克服早期的手工方法生产中的随意性和非规范性做法。 软件工程管理软件工程管理包括:软件管理学、软件工程经济学、软件心理学等内容。软件工程管理是软件按工程化生产时的重要环节,它要求按照预先制定的计划、进度和预算执行,以实现预期的经济效益和社会效益。软件管理学包括人员组织、进度安排、质量保证、配置管理、项目计划等。软件工程经济学是研究软件开发中成本的估算、成本效益分析的方法和技术,用经济学的基本原理来研究软件工程开发中的经济效益问题。软件心理学是软件工程领域具有挑战性的一个全新的研究领域,它是从个体心理、人类行为、组织行为和企业文化等角度来研究软件管理和
43、软件工程的。 软件工程的原则为了达到软件工程目标,在软件开发过程中,必须遵循软件工程的基本原则。这些原则适用于所有的软件项目。这些基本原则包括抽象、信息隐蔽、模块化、局部化、确定性、一致性、完备性和可验证性。 抽象抽取事物最基本的特性和行为,忽略非本质细节。采用分层次抽象,自顶向下,逐层细化的办法控制软件开发过程的复杂性。 信息隐蔽采用封装技术,将程序模块的实现细节隐藏起来,使模块接口尽量简单。 模块化模块是程序中相对独立的成分,一个独立的编程单位,应有良好的接口定义。模块的大小要适中,模块过大会使模块内部的复杂性增加,不利于对模块的理解和修改,也不利于模块的调试和重用。模块太小会导致整个系统
44、表示过于复杂,不利于控制系统的复杂性。 局部化要求在一个物理模块内集中逻辑上相互关联的计算资源。 确定性软件开发过程中所有概念的表达应是确定的、无歧义且规范的。这有助于人与人的交互不会产生误解和遗漏,以保证整个开发工作的协调一致。 一致性包括程序、数据和文档的整个软件系统的各模块应使用已知的概念、符号和术语;程序内外部接口应保持一致,系统规格说明与系统行为应保持一致。 完备性软件系统不丢失任何重要成分,完全实现系统所需的功能。 可验证性开发大型软件系统需要对系统自顶向下,逐层分解。系统分解应遵循容易检查、测评、评审的原则,以确保系统的正确性。 软件开发工具与软件开发环境现代软件工程方法之所以得
45、以实施,其重要的保证是软件开发工具和环境的保证,使软件在开发效率、工程质量等多方面得到改善。软件工程鼓励研制和采用各种先进的软件开发方法、工具和环境。工具和环境的使用进一步提高了软件的开发效率、维护效率和软件质量。 软件开发工具早期的软件开发除了一般的程序设计语言外,尚缺少工具的支持,致使编程工作量大,质量和进度难以保证,导致人们将很多的精力和时间花费在程序的编制和调试上,而在更重要的软件的需求和设计上反而得不到必要的精力和时间投入。软件开发工具的完善和发展将促进软件开发方法的进步和完善,促进软件开发的高速度和高质量。软件开发工具的发展是从单项工具的开发逐步向集成工具发展的,软件开发工具为软件
46、工程方法提供了自动的或半自动的软件支撑环境。 软件开发环境软件开发环境或称软件工程环境是全面支持开发全过程的软件工具集合。这些软件工具按照一定的方法或模式组合起来,支持软件生命周期内的各个阶段和各项任务的完成。计算机辅助软件工程是当前软件开发环境中富有特色的研究工作和发展方向。CASE将各种软件工具、开发机器和一个存放开发过程信息的中心数据库组合起来,形成软件工程环境。10.4.2 结构化分析与设计方法 结构化分析方法 结构化分析方法结构化分析方法是结构化程序设计理论在软件需求分析阶段的运用,其目的是帮助弄清用户对软件的需求。结构化分析就是使用数据流图(DFD)、数据字典(DD)、结构化英语、
47、判定表和判定树等工具,来建立一种新的、称为结构化规格说明的目标文档。结构化分析方法的实质是着眼于数据流,自顶向下,逐层分解,建立系统的处理流程,以数据流图和数据字典为主要工具,建立系统的逻辑模型。结构化分析的步骤如下: 通过对用户的调查,以软件的需求为线索,获得当前系统的具体模型; 去掉具体模型中非本质因素,抽象出当前系统的逻辑模型; 根据计算机的特点分析当前系统与目标系统的差别,建立目标系统的逻辑模型; 完善目标系统并补充细节,写出目标系统的软件需求规格说明; 评审直到确认完全符合用户对软件的需求。 结构化分析的常用工具 数据流图(DFDData Flow Diagram)数据流图是描述数据处理过程的工具,是需求理解的逻辑模型的图形表示,它直接支持系统的功能建模。数据流图从数据传递和加工的角度,来刻画数据流从输入到输出的移动变换过程。数据流图中的主要图形元素与说明如下: 加工(转换)。输入数据经加工变换产生输出。 数据流。沿箭头方向传送数据的通道,一般在旁边标注数据流名。 存储文件(数据源)。表示处理过程中存放各种数据的文件。