高质量程序设(计一)

上传人:cl****1 文档编号:512008460 上传时间:2022-11-27 格式:DOC 页数:10 大小:63KB
返回 下载 相关 举报
高质量程序设(计一)_第1页
第1页 / 共10页
高质量程序设(计一)_第2页
第2页 / 共10页
高质量程序设(计一)_第3页
第3页 / 共10页
高质量程序设(计一)_第4页
第4页 / 共10页
高质量程序设(计一)_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《高质量程序设(计一)》由会员分享,可在线阅读,更多相关《高质量程序设(计一)(10页珍藏版)》请在金锄头文库上搜索。

1、一 软件质量什么是重要的质量属性应当视具体产品的特征和应用环境而定,请读者不要受具体观点限制,最简单的判别方式就是考察该质量属性是否受用户关注(卖点)。质量死对头是缺陷,缺陷是混在产品中的人们不喜欢、不想要的东西。健壮性有两层含义,一是容错能力,二是恢复能力;容错是指发生异常情况时系统不出错误的能力;恢复能力是指软件发生错误后(不论死活)重新运行时,能恢复到没有发生错误前的状态。可靠性:是一个与时间相关的属性,用平均无故障时间来衡量。易用性:指用户使用软件的容易程度。现代人的生活节奏快,干什么事情都想图个方便。清晰性:意味工作成果易读、易理解,表达了人们一种质朴的愿望:让我花钱买它、用它,总的

2、让我明白它是什么东西。安全性:信息安全。一般滴,如果黑客为非法入侵花费的代价(时间、费用、风险等)高于得到的好处,可认为是安全。兼容性:两个或两个以上的软件相互交换信息的能力。弱者设法与强者兼容,否则无法容身;强者应当避免被兼容,否则市场被瓜分。可移植性:软件不经修改或稍加修改就可以运行于不同的软硬件环境的能力。一般软件设计应该将“设备相关程序”与“设备无关程序”分开,“功能模块”与“用户界面”分开,提高可移植性。质量、生产效率和生产成本之间的关系:软件过程能力比较低的企业,应该将质量放在第一位,生产效率放在第二位,只有这样才可能持久的提高质量和生产效率。测试能提高软件质量,但提高软件质量不能

3、依赖测试。原则:的缺陷聚集在的模块中,经常出错的模块在改错后还可能出错。改错最大的忌讳是“急躁蛮干”。二 程序设计语言使用一个语言特征是因为你需要它,而不是因为它的存在。学习一门程序设计语言,并不需要掌握其全部的语法,关键是要学习使用语法来解决实际问题的方法。要充分利用现有资源而不要做重复劳动,这样才能用好一门语言,才能开发出高质量的程序。学会在特定平台下学习具体的语言实现,除了了解编译器手册和帮助外,还可以编写一些简短的程序来测试+/的每一个特性。三 C+程序入门指南l 静态变量、全局变量:都存储在静态存储区(数据段,全局可以)中,这样在下一次调用的时候还可以保持原来的赋值,与堆栈段和堆区的

4、数据不同;但静态变量仅在作用域内可见,全局变量则不同。当一个程序有多个源文件组成时,全局变量在所有的源文件中可见,而静态变量仅在作用域内可见。在声明时可初始化,若没有明确初始化,编译器提供了一个默认的全局初始化值0。或者说静态数据区的数据都默认初始化为0。堆栈或堆中的数据的初始化完全有程序员负责。编译器可以决定同一个编译单元定义的全局变量的初始化顺序,无法决定两个不同编译单元的全局变量连在一起之后的初始化顺序。故在初始化时,一个单元全局变量的初始化不能依赖于定义在另一个编译单元的全局变量。l 内存最小编址单位是字节,语言需支持对一个变元(基本类型、复合类型的变量或对象)进行取址运算,地址必须是

5、有效地址。最小的对象(包括空对象)也至少占一个字节的存储空间。使用sizeof()确定不同系统上的数据类型大小。l Void是“空”类型(无值型),意思是这种类型的大小无法确定。Void常用于定义函数返回值类型,参数列表(无参)或者void指针。Void指针可以用作通用指针,因其可以指向任何类型的对象。NULL是可以赋给任何指针的值0,C语言环境中类型是void*,C+语言环境中允许从0到任何指针类型的隐式转换,NULL就是整数0.l Bool类型占据一字节内存。由于字节是内存编址最小单位决定,浪费了7bit。l 标准C中int为默认类型。也就是说如果不明确指明函数的形参类型和返回值类型,默认

6、为int类型。l Big Endian 和Littile Endian 自然对齐:基本数据类型(如short、int、double)的变量不能简单滴存储在内存中任意地址处,它们的起始地址应该能被它们的大小整除。l 类型转换 当类型不匹配时,一般占用内存较少的类型会隐式转换成占用内存较多的类型。类型转换并不是改变原来的类型和值,只是生成了新的临时变元,其类型为目标类型。隐式转换在编译期间,如果转换有足够安全性,编译器会转换,否则给出警告或者出错信息。基本数据类型之间兼容关系:char-int-long-float-double,一个低级数据类型对象总是优先转化为能够容纳得下它的最大值的、占用内存

7、最少的高级类型对象。强制类型转换可能导致安全问题。Double d3 = 1.25e + 20;Double d4 = 10.23Int i2 = (int)d3;d3整数部分超出int表示范围,故会溢出,结果超出意料Int i3 =(int)d4;结果符合意料,为10Double d5 = 10000.23;Int *pInt = (int*)&d5;读取double类型的前四字节内容,并解释为int类型整数Int i4 = 100;Double *pDb1 = (int*)&i4;内存扩张,如果往里面写数据将产生错误 故强制类型转换应区分值的截断还是内存的截断。使用强制类型转换,应确保内存

8、访问的安全性以及转换结果的安全性。 使用强制类型转换,避免使用隐式类型转换。避免做违反编译器类型安全原则以及数据保护原则的事。例如符号数转换成非符号数(数据信息丢失)。l 标识符尽量避免使用前导“_”来定义自己的标识符,因为语言及其实现使用它来定义一些内部名称或预定义的宏,如果使用它可能造成命名冲突。命名应遵循“用最短的名字包含最多的信息量”的原则。不要编写太复杂的复合表达式,不要编写多用途的复合表达式。多使用高性能的运算 符, 当然适当使用复合表达式提高程序效率。复合表达式生成的可执行代码更加高效。l 0值,不同类型有不同类型的0值表示方式,比较过程不要产生歧义。Boolean布尔类型,0为

9、“假”,任何非0都为“真”;可用TRUE和FALSE来表示“真”和“假”两个概念。TRUE的值在不同的实现下可能不同,但flase的值是确定的,因此应该总和false比较。If(flag)表示flag为真,if(!flag)表示flag为假。不要将布尔变量直接与TRUE或者1、-1、0(让人误以为比较的值是整数)等进行比较。浮点数之间的比较:每一个编译平台都有自己的默认精度,对浮点数直接进行=和!=操作,采用的就是默认精度,而不是按照内存中两个数仅有的某个bit不同(其他的所有bit都相同)来比较两个数是否相等。在浮点数比较过程中,应该视具体环境,而设置一个精度,只要误差在精度范围内,都可视为

10、相等。指针变量与零值的比较,if(p = NULL)等于零值,if(p != NULL)不等于零值。l If语句应该逻辑清晰 尽量ifelse匹配。l 不要用浮点数做计数器来控制循环,因为它可能是不精确的。l 数组遍历影响效率的实际上主要是大型数组导致的内存页面交换次数以及cache命中率的高低,而不是循环次数本身。四 C+/C常量l 字面常量:比如各种进制的数字,字符,字符串等。字面常量值只能引用,不能修改,语言实现一般将其保存在程序的符号表里而不是一般的数据区中。符号表是只读的,是一种访问保护机制。除了字符串外,无法取得一个字面常量的地址。l 符号常量:#define定义的宏常量,#def

11、ine是预编译伪指令,它定义的宏常量在进入编译阶段前就已经被替换为所代表的字面常量了,因此宏常量本质是字面产量。在C语言中const定义的常量其实是不能修改的变量,会给他分配存储空间(外连接);但在C+中视情况而定,对于基本数据类型的常量,编译器会把它放到符号表中而不分配存储空间,而ADT/UDT的const对象则需要分配存储空间。当然在C+中还有一些情况下需要分配存储空间。对于基本数据类型的const常量,可以取其地址,编译器会重新在内存中创建它的一个拷贝,通过其地址访问到的是这个拷贝而非原始符号常量。l C语言中,const符号常量默认是外连接的(分配存储空间)。而在C+中默认是内连接的。

12、理论上讲,只要你手中有一个对象的指针(内存地址),你就可以设法绕过编译器修改它的内容,除非该内容受到操作系统的保护。l 契约性const对象的定义并未使用const关键字,但被看做是一个const对象。l 枚举常量:/的构造类型实际上常用来定义一些相关常量的集合。规定枚举常量的值是可以扩展,并非受限于一般的整型数的范围。l Const不仅仅用于定义符号常量,凡是需要编译器帮助我们预防无意中修改数据的地方,都可以使用const。l 类中常量,不能再类声明中初始化非静态const数据,非静态const数据成员属于每一个对象成员,只是在某个对象的生存期限内是常量,而对整个类来说它是可变的。而stat

13、ic const是类的所有对象都共享的常量。当然在类中的枚举常量在整个类中都是恒定的常量。五 函数设计l 多使用库函数;链接的本质就是把一个名字的实现(代码)绑定到对它的每一个引用语句上(在编译时或运行时);l 函数调用中参数传递的本质是用实参来初始化形参而不是替换形参。不要在函数体内定义与形参同名的局部变量,因为形参也被看做本地变量。函数原型的一个作用就是指导编译器把实参隐式的转换为形参的类型,如果形参与实参不匹配的话,但需要符合类型转换规则。如果函数至少被调用一次的话,编译器将为函数定义体生成可执行代码。l 自由存储空间:显式分配和释放内存空间。l 函数堆栈三个用途:进入函数前保存环境变量

14、和返回值地址,进入函数时保存实参的拷贝,函数体内保存局部变量。l 不论是函数原型还是定义,都尽量写出每个参数的类型和名字。如果函数没有参数,使用而不要空着,标准中将空的参数列表解释为可以接受任何类型和个数的参数;而标准中则把空的参数列表解释为不可以接受任何参数。参数命名要恰当,“望文生义”;输入参数与输出参数顺序要合理,一般地,输出参数在前,输入参数在后,且不要交叉出现输入参数与输出参数。参数是指针且仅作输入用,应加上,以免修改内存单元。参数个数控制在个以内。l 函数返回值:可通过语句和使用输出参数。不要将正常和错误标志混在一起返回,这样导致难以理解。l 函数在入口处要检查参数的合法性;函数的

15、出口处要对语句的正确性和效率进行检查;语句不可返回指向“堆栈内存”的指针和引用,因该内存单元在函数体结束时被自动释放。要搞清楚返回的究竟是“对象的值”、“对象的指针”、“对象的引用”;如果函数返回一个对象,要考虑语句的效率。l 不仅检查输入参数的有效性,还要检查通过其他途径进入函数体内变量的有效性,例如全局变量、文件句柄等;除非有必要,尽量避免函数带有“记忆”功能。如果函数带有记忆功能,行为时不可预测的,因其行为可能取决于某种“记忆状态”,这样的函数不利于理解;变量具有“记忆”功能。l 全局常量默认存储类型是的,除非显示的用,否则不能被访问。局部符号常量(不是函数内出现的字面常量)的默认存储类型是。l 函数原型中的形参名称会被编译器忽略,但函数定义中的形参是局部变量,具有程序块作用域。l 连接性:外连接,如果一个标识符能够在其他编译单元中或者在定义它的编译单元中的其他范围内被调用;内连接,如果一个标识符能在定义它的编译单元中的其他范围内被调用,但不能在其他编译单元调用;无连接,仅能够在它的范围内被调用。l 递归和迭代递归使用函数的反复调

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号