第一章        程序设计基本特点
1.1    软件的发展
1.1.1        从程序设计到软件工程
计算机(computer)是能以相对于人而言几百万甚至几十亿倍速度进行运算并作出逻辑判断的设备。
计算机按照一组指令控制下的运行过程(由“算法”规定)来处理数据data),这组指令称为计算机程序(computer program)。
编写这组指令的工作称为程序设计(programming)。
大约在二十世纪七十年代,程序设计发展为软件工程。
软件可定义为包括计算机程序、方法、规则、相关的文档资料以及计算机运行所需数据。
软件工程曾由Boehm下定义为:“运用现代科学技术知识设计并构造计算机程序和为开发、运行和维护这些程序所必需的相关文件资料”。程序设计和软件工程两者区别如下:
主要特点
程序设计
软件工程
内容
指令和数据
指令、数据和全套文档
主要语言
汇编语言和
高级语言
需求定义、软件功能、文档设计和程序设计等语言
工作范围
编写程序
软件生命周期各阶段
(以下将介绍)
需求者
个别用户
市场用户
开发者
编程人员本人
开发组织或开发机构
软件规模
微型、小型
大、中、小型
决定质量因素
个人技术水平
管理水平
开发技术和手段
程序库
数据库、工程化开发方法、标准和规范、面向对象技术
维护者
编程人员本人
专职维护队伍
硬件特征
容量小、速度慢、
可靠性差
超高速、特大容量、
微型化、网络化

软件开发过程(软件生命周期)分为互相重叠的三个阶段:
(一) 开发与设计(development and design):它又可分为四部分:
1. 分析问题。
2. 研究解决方案。
3. 方案的代码化,也即编写程序,简称编程。
4. 程序的测试和修改。
(二) 编写文档(documentation)。
软件开发过程中涉及众多文档,例如需求说明书、可行性分析、实施计划、概要设计说明书、用户手册等等。这是软件工程的一个重要环节,也是软件工程与以前普通程序设计的一个重要区别。
(三) 维护(maintenance)。
这是三个阶段中耗时最长、费用最多的。最典型的例子是“Y2K2000年)问题”,曾拖延数十年之久。问题来源是上世纪许多程序只用两位数表示年份,因而遇到50时就无法辨别它是1950还是2050。不少公司花费大量精力修改数十年来运行的程序,以使它们能在本世纪中成功地运行。
我们这门课只是上述各阶段中的一小部分,主要是第一阶段中的编程工作。
1.1.2        程序设计语言的五种形式
程序设计语言在发展过程中可分为五种形式:
1. 机器语言(machine language)
01表示
手工操作
2. 汇编语言(assembler language)
稍微接近人的语言,例如
mov    ax,100
add    ax,bx
开始使用批处理(batch processing)功能。
3. 高级编程语言(high-level programming language)
更接近于人类语言,但使用仍不方便
60年代的ALGOL
4. 面向过程的程序设计语言(procedure-oriented programming language:
有时也称过程式程序设计语言(procedural programming language)或结构化程序设计(structured programming language)语言。
结构化程序设计的产生和发展形成了现代软件工程的基础。
编程是面向过程的(procedure-oriented)或面向操作的(action-oriented),编程单
位是函数(function,子程序)。
整个程序是一个模块层次(hierarchy of modules),按功能划分为多个基本模块,各模块之间关系尽可能简单,其功能相对独立,自顶向下进行功能分解。
每一模块内既有数据,又有代码,函数代码按一定算法对代码进行操作。
FORTRANC语言等
5. 面向对象的程序设计(Object-Oriented Programming, OOP) 语言:
面向过程的程序设计具有以下缺点:
功能与数据分离,不易保持功能与数据的相容性。
软件修改困难。
限制了软件的可重用性,降低了软件开发效率,也难于维护软件。
为解决以上问题,人们进而研究面向对象技术,提出了面向对象的程序设计方法。详见下
节。
目前人们大多混合使用结构化程序设计语言和面向对象的程序设计语言。
1.2    面向对象的程序设计
编程是面向对象的(object-oriented),编程单位是类(class)
1.2.1            编程语言特征
   
面向对象编程语言直接描述有关域中的对象及其相互关系。它以客观世界中所存在的事物为依据,较为接近人们的思维方式,具有如下特征:
(1) 客观世界由一系列事物组成,每个事物的特性被抽象出来后分别由一组属性和一组操作(方法)来描述。这类事物就是面向对象编程语言中的类及其对象
2)客观世界的各事物可按其共性分为各类(称为多一点就不准基类,如人、车、鸟等),这些是具
有相同共性的各事物的集合,它是面向对象语言中相对独立的程序单位,是这些事物的统一抽象。
3)不同事物除具有[基类的]共性之外,还具有各自的个性。因此应由具有不同的属性和操作的特殊类加以描述。这些特殊类(称为派生类)通过继承机制继承基类的共性(如汽车、拖拉机、坦克都继承“车”的共性),但派生类又各有自己的个性。
1.2.2        优越性
面向对象的程序设计至少能解决结构化程序设计语言(例如C语言)中以下四个无法解决的问题:
(A)数据的封装(数据的保护):
在面向过程的编程语言中,编程单位是函数,它们用于实施一定算法,对所有数据进行操作。这就是Nicholase WirthPascal编程语言的设计者)所提出的著名公式:
算法 + 数据结构 = 应用程序
这种编程方法无法对全局变量加以控制:有时只要求一个函数独家对全局数据进行赋值、读写,而不准其它函数对它赋值。这在面向过程的编程语言中无法做到,因这些全局数据谁都可以读、可以写。因此软件工程规定应该尽少使用全局数据(全局变量)。
但在面向对象的编程语言中,可以通过数据封装对数据加以保护,只允许被授权者对数据读取或赋值,从而实现上述要求。
此点详见第三章。
(B)复杂程序中程序代码的可重用性(re-usability)
先看个简单例子。Windows操作系统允许用户在他自己的程序中设计不同窗口,如同Windows操作系统的窗口一样。但又绝对不允许用户修改Windows的程序,而且用户也没有能力修改。实际上用户根本不必修改Windows的程序,只需将自己的程序模块贴上去即可在他自己的程序中设计并实现不同窗口。