第2章 程序设计基础

一、程序设计方法与风格

1程序设计发展阶段

结构化程序设计和面向对象的程序设计阶段。

2程序设计方格

程序设计风格会影响软件的质量和可维护性,良好的程序设计风格可以使结构清晰合理,程序代码便于维护,程序设计风格总体强调简明清晰,易读易懂,程序必须是可理解的,总体遵循“清晰第一,效率第二”的原则。

3良好的程序设计风格应考虑的因素

(1)源程序文档化

符号名的命名

符号名的命名应具有一定的实际含义,以便于对程序功能的理解。

程序注释

a.序言性注释

位于每个程序的开头部分,给出程序的整体说明,主要描述内容可以包括:程序标题、程序功能说明、主要算法、接口说明、程序位置、开发简历、程序设计者、复审者、复审日期、修改日期等。

b.功能性注释

嵌在源程序体之中,主要描述其后的语句或程序做什么。

视觉组织

在程序中利用空格、空行、缩进等技巧可以使层次清晰,便于阅读。

(2)数据说明的方法

为使程序中的数据说明更易于理解和维护,应注意以下几点:

数据说明的次序规范化

数据说明次序固定,可以使数据的属性容易查找,也有利于测试、排错和维护。

说明语句中变量安排有序化

当一个说明语句说明多个变量时,变量按照字母顺序排序为好。

使用注释来说明复杂数据的结构。

(3)语句的结构

程序应该简单易懂,语句构造应该简单直接,不为提高效率而把语句复杂化。

在一行内只写一条语句;

程序编写应优先考虑清晰性;

除非对效率有特殊要求,程序编写要做到清晰第一,效率第二;

首先要保证程序正确,然后才要求提高速度;

避免使用临时变量而使程序的可读性下降;

避免不必要的转移;

尽可能使用库函数;

避免采用复杂的条件语句;

尽量减少使用“否定”条件的条件语句;

数据结构要有利于程序的简化;

⑪要模块化,使模块功能尽可能单一化;

⑫利用信息隐蔽,确保每一个模块的独立性;

⑬从数据出发去构造程序;

⑭不要修补不好的程序,要重新编写。

(4)输入和输出

输入输出的方式和格式应当尽量方便用户使用,在设计和编程时应遵循以下原则:

对所有的输入数据都要检验数据的合法性;

检查输入项的各种重要组合的合理性;

输入格式要简单,以使得输入的步骤和操作尽可能简单;

输入数据时,应允许使用自由格式;

应允许缺省值;

输入一批数据时,最好使用输入结束标志;

在以交互式输入/输出方式进行输入时,要在屏幕上使用提示符明确提示输入的请求,同时在数据输入过程中和输入结束时,应在屏幕上给出状态信息;

当程序设计语言对输入格式有严格要求时,应保持输入格式与输入语句的一致性;给所有的输出加注释,并设计输出报表格式。

二、结构化程序设计

1结构化程序设计的原则

结构化程序设计方法的主要原则可以概括为自顶向下,逐步求精,模块化,限制使用goto语句。

(1)自顶向下

先考虑总体,后考虑细节。

先考虑全局目标,后考虑局部目标。

先从最上层总目标开始设计,逐步使问题具体化。

(2)逐步求精

对复杂问题,应设计一些子目标作过渡,逐步细化。

(3)模块化

把程序要解决的总目标分解为分目标,再进一步分解为具体的小目标,把每个小目标称为一个模块。

(4)限制使用goto语句

滥用goto语句确实有害,应尽量避免;

完全避免使用goto语句也并非是个明智的方法,有些地方使用goto语句,会使程序流程更清楚、效率更高;

争论的焦点不应该放在是否取消goto语句,而应该放在用什么样的程序结构上。其中最关键的是,肯定以提高程序清晰性为目标的结构化方法。

2结构化程序的基本结构与特点

(1)基本结构

顺序结构

顺序结构是一种简单的程序设计,它是最基本、最常用的结构,按照程序语句行的自然顺序,一条语句一条语句地执行程序。

选择结构(分支结构)

包括简单选择和多分支选择结构,可根据设定条件,判断应该选择哪一个分支来执行相应的语句序列。

循环结构

根据给定的条件,判断是否重复执行某一个相同的或类似的程序段,利用循环可以大大简化大量的程序行。

a.当型循环结构:先判断后执行循环体;

b.直到型循环结构:先执行循环体后判断。

(2)结构化程序设计方法的优点

程序易于理解、使用和维护,便于控制、降低程序的复杂性,可理解性好;

提高了编程工作的效率,降低了软件开发成本。

3结构化程序设计原则和方法的应用

在结构化程序设计中应把握以下要素:

(1)使用程序设计语言中的顺序、选择、循环等有限的控制结构表示程序的控制逻辑;

(2)选用的控制结构只准许有一个入口和一个出口;

(3)程序语句组成容易识别的块,每块只有一个入口和一个出口;

(4)复杂结构应该用嵌套的基本控制结构进行组合嵌套来实现;

(5)语言中所没有的控制结构,应该采用前后一致的方法来模拟;

(6)严格控制goto语句的使用。其意思是指:

用一个非结构化的程序设计语言去实现一个结构化的构造;

若不使用goto语句会使功能模糊;

在某种可以改善而不是损害程序可读性的情况下。

三、面向对象的程序设计

1关于面向对象方法

(1)面向对象的本质

系统中的对象以及对象之间的关系能够如实地反映问题域中固有事物及其关系。

(2)面向对象的主要优点

与人类习惯的思维方法一致

面向对象的设计和技术以对象为核心,与客观实体有直接的对应关系,对象之间传递信息互相联系,以模拟现实世界中不同事物彼此之间的联系。

稳定性好

当对系统的功能需求变化时不会引起软件结构的整体变化,仅需要做一些局部性的修改。

可重用性好

a.对象有很强的自含性,且对象固有的封装性使得对象的内部实现与外界隔离,具有较强的独立性。

b.重复使用一个对象的两种方法:

第一,创建该类的实例,直接使用它;

第二,从它派生出一个满足当前需要的新类。

易于开发大型软件产品

用面向对象范型开发软件时,可以把一个大型产品看作是一系列本质上相互独立的小产品来处理,这就不仅降低了开发的技术难度,而且也使得对开发工作的管理变得容易。

可维护性好

软件的可维护性是长期困扰人们的一个严重问题,是软件危机的突出表现。

(3)面向对象设计软件可维护性好的主要表现

稳定性比较好;

比较容易修改;

比较容易理解;

易于测试和调试。

2面向对象方法的基本概念

(1)对象

概念

用来表示客观世界中的任何实体。

面向对象的程序设计方法中的对象

该对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位,由一组表示其静态特征的属性和它可执行的一组操作组成。

对象的属性和操作

a.属性

属性即对象包含的信息,在设计对象时确定,一般只能通过执行对象的操作来改变。

b.操作

描述了对象执行的功能,通过消息传递还可以为其他对象使用,操作的过程对外是封闭的,用户只能看到操作实施的结果,所有的操作过程都封装在对象中。

对象具有的特点:

a.标识唯一性

对象是可区分的,且这种区分是通过对象的内在本质,而不是通过描述来区分。

b.分类性

可以将具有相同属性和操作的对象抽象成类。

c.多态性

同一个操作可以是不同对象的行为。

d.封装性

从外面只能看到对象的外部特征。其内部状态只能由其自身改变。

e.模块独立性好

对象内部各种元素彼此结合得很紧密,内聚性强。

(2)类和实例

类是具有相同属性,共同方法的对象的集合,它描述了属于该对象类型的所有对象的性质,一个对象是其对应类的一个实例。

使用“对象”这个术语时,可以指一个具体的对象,也可以泛指一般的对象。当使用“实例”这个术语时,必然是指一个具体的对象。

类是关于对象性质的描述,它同对象一样,包括一组数据属性和在数据上的一组合法操作。

(3)消息

面向对象的世界是通过对象与对象间彼此的相互合作来推动的,对象间的这种相互合作需要一个机制协助进行,这样的机制称为“消息”。

消息是一个实例与另一个实例之间传递的信息,它请求对象执行某一处理或回答某一要求的信息,它统一了数据流和控制流。消息的使用类似于函数调用,消息中指定了某一个实例,一个操作名和一个参数表(可空)。

一个消息由下述三部分组成:

a.接收消息的对象的名称;

b.消息标识符(也称为消息名);

c.零个或多个参数。

(4)继承

定义:继承是使用已有的类定义作为基础建立新类的定义技术,已有的类可当做基类来引用,新类当做派生类来引用。

面对对象软件技术的许多功能和优点来源于将类组成一个层次结构的系统:一个类的上层可以有父类下层可以有子类,这种系统的重要性质是继承性;一个类直接继承父类的特性,子类自动地共享基类中定义的数据和方法。

继承的分类

a.单继承

一个类只允许有一个父类,类等级为树状结构。

b.多继承

一个类允许有多个父类,可以组合多个父类的性质构成所需要的性质。功能更强,使用更方便;注意避免二义性。

继承性的优点

a.相似的对象可以共享程序代码和数据结构,从而大大减少了程序中的冗余信息,提高软件的可重用性,便于软件修改维护。

b.用户在开发新的应用系统时不必完全从零开始,可以继承原有的相似系统的功能或者从类库中选取需要的类,再派生出新的类以实现所需要的功能。

(5)多态性

多态性是指对象根据所接收的消息而做出动作,同样的消息被不同的对象接收时可导致完全不同的行动的一种现象。

在面向对象的软件技术中,多态性是指子类对象可以像父类对象那样使用,同样的消息既可以发送给父类对象也可以发送给子类对象。

多态性机制增加了面向对象软件系统的灵活性,进一步减少了信息冗余,显著地提高了软件的可重用性和可扩充性。