作为软件工程的一个阶段,程序编程是设计的继续。
一.程序设计语言
程序设计语言的特征和程序设计风格会深刻地影响软件的质量和可维护性.
1.分类:汇编语言,高级语言
(1)机器语言,汇编
第一二代计算机用
(2)高级语言
从语言的内在特征看,高级语言可分为系统实现语言,静态高级语言,块结构高级语言和动态高级语言四大类
2.语言的选择
(1)应用领域的不同决定选择的语言
商用:COBOL,4GLS
科学计算:FORTRAN,PASCAL,PL/1
实时:汇编,ADA
系统:汇编,ADA,C
智能:LISP,PROLOG
(2)系统用户的要求决定
用户使用他们熟悉的语言
(3)可以使用的编译程序
运行目标系统的环境中可以提供的编译程序往往限制了对语言的选择
(4)程序员的经验和知识
(5)软件可移植性要求
(6)当工程规模很大时,而又没有完全合适的语言,课编一个专用的语言
(7)算法与计算复杂性,软件的可靠性
(8)数据结构的复杂性,软件的可维护性
(9)效率的考虑
(10)了解语言的发展前景
二.结构化程序设计
包括两个方面:
(1)强调使用几种基本控制结构,通过组合嵌套,形成程序的控制结构,尽可能避免使用GOTO语句.
(2)采用自顶向下和逐步细化的原则,由粗到细,一步步展开.
1.主要原则:
(1).使用语言中的顺序,选择,重复等有限的基本控制结构表示程序逻辑.
(2).选用的控制结构只准许有一个入口和一个出口.
(3).复杂结构应该用基本控制结构进行组合嵌套来实现.
(4).语言中没有的控制结构,可用一段等价的程序段模拟,但要求该程序段在整个系统中应前后一致。
2.程序设计自顶向下,逐步求精
在详细设计和编码阶段,应当采取自顶向下,逐步求精的方法,把一个模块的功能逐步分解,细化为一系列具体的步骤,进而翻 译成一系列用某种程序设计语言写成的程序。
3.数据结构的合理化
H.Mills指出,结构化程序设计主要是想从程序的控制结构入手,消除不适应的、容易引起混乱的GOTO语句。这只是问题的一个方 面,而问题的另一方面,过去没有注意到的是数据结构的合理化问题,即数据结构访问的规范化,标准化问题。
三.程序设计风格
程序实际上也是一种供人阅读的文章,有一个文章的风格问题.应该使程序具有良好的风格.
- 源程序文档化
- 数据说明
- 语句结构
- 输入/输出方法
源程序文档化
标示符的命名
安排注释
程序的视觉组织
数据说明
为了使程序中数据说明更易于理解和维护,必须注意以下几点。
(1)数据说明的次序应当规范化
(2)说明语句中变量按安排有序化
(3)使用注释说明复杂数据结构
语句结构
语句结构力气简单,直接,不能为了片面追求效率而使语句复杂化
1.在一行内只写一条语句
2.编写程序首要考虑清晰性
3.程序要能直截了当地说明程序员的用意
4.除非对效率有特殊的要求,程序小写要做到清晰第一,效率第二
5.首先要保证程序正确,然后才要求提高速度.
6.避免使用临时变量而使可读性下降.例如,有的程序员为了追求效率,往往喜欢把表达式写成
A[I]+1/A[I];
AI=A[I];
X=AI+1/AI;
7.让编译程序做简单的优化.
8.尽可能使用库函数.
9.避免不必要的转移.同时如果能保持程序可读性,则不必要GO TO 语句
10.尽量只采用三种基本的控制结构编写程序
11.避免使用空的ELSE语句和IF THENIF...的语句
12.避免采用过于复杂的条件测试
13.尽量减少使用“否定”条件的条件语句。
14.尽可能用通俗易懂的伪代码来描述的流程,然后再翻译成必须使用的语言
15.数据结构要有利于程序的简化
16.要模块化
17.确保每个模块独立性
18.从数据出发去构造程序
19.不要修补不好的程序,要重新编写
20.对太大的程序,要分块编写,测试,然后再集成。
输入/输出方法
输入和输出(I/O)
输入和输出信息是与用户的使用直接相关的。输入和输出的方式和格式应当尽可能方便用户的使用。因此,在软件需求分析阶段 和设计阶段,就应基本确定输入和输出的风格。系统能否被用户接受,有时就取决于输入和输出的风格。
满足运行工程学的输入输出风格
①输入:
输入格式力求简单,一致,并尽可能采用自由格式输入;
使用数据结束或文件结束标志来终止输入,不要让用户来计算输入的项数或记录数;
②输出:
标志所有的输出数据,加必要的说明;
当用户使用程序时,可对用户做到“在线”帮助;
对可能产生重大后果的请求,先给出提示;
发生错误时,能迅速恢复正常。
效率
程序的效率是指程序的执行速度及程序所需占用的内存的存储空间
算法对效率的影响
源程序的效率与详细设计阶段确定的算法的效率直接有关。在详细设计翻译转换成源程序代码后,算法效率反映为程序的执行速 度和存储容量的要求。
程序设计质量评价
- 正确性
- 结构清晰性
- 易修改性
- 易读性
- 简单性
四.程序复杂性度量
指模块内程序的复杂性
代码行度量法
前提:
程序复杂性随着程序规模的增加不均衡地增长;
控制程序规模的方法最好是采用分而治之的办法,将一个大程序分解成若干个简单的可理解的程序段.
McCabe度量法
又称环路复杂性度量,基于程序控制流的复杂性度量方法
它基于一个程序模块的程序图中环路的个数,因此计算它主要画出程序图.
计算环路复杂性的方法:根据图论,在一个强连通的有向图G中,环的个数由以下公式给出:
V(G)=m-n+p 其中,V(G)是有图G中环路个数,p是图G中的强连通分量个数。
Halstead的软件科学
程序长度
令n1表示程序中不同运算符(包括保留字)的个数,令n2表示程序中不同运算对象的个数,令H表示“程序长度”,则有 H=n1*log2n1+n2*log2n2
H是程序长度的预测值,它不等于程序中语句个数。
程序量
V=N*log2n表示了程序在词汇上的复杂性。
程序量比率(语言的抽象级别)
L=V*/V
或L=(2/n1)*(n2/N2)
它表明了一个程序的最紧凑形式的程序量一世纪程序量之比,反映了程序的效率,其倒数 D=1/L标明了实现算法的困难程度。
程序员工作量
E=V/L
程序的潜在错误
预测公式B=(N1+N2)*log2(n1+n2)/3000 B为该程序的错误数。