1 / 32

程序设计基础

程序设计是计算机学科的. 核心和灵魂. 程序设计基础. 第十一章 面向对象软件构造. 第十一章 面向对象软件构造. 11.1 软件质量 11.2 程序断言机制 11.3 异常处理机制 11.4 可重用构件库 11.5 面向对象软件构件. 11.1 软件质量. 一、软件危机 20 世纪 60 年代后期,由于计算机软件的规模和复杂性的增大,又由于软件开发的合作需求的增强,使得以前的软件开发过程和控制方法,无法保证软件项目的开发周期和开发成本的要求,这就产生了整个软件行业的生产效率低下,这被称为软件危机。 二、软件工程

bianca
Download Presentation

程序设计基础

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 程序设计是计算机学科的 核心和灵魂 程序设计基础 第十一章 面向对象软件构造

  2. 第十一章 面向对象软件构造 11.1 软件质量 11.2 程序断言机制 11.3 异常处理机制 11.4 可重用构件库 11.5 面向对象软件构件

  3. 11.1 软件质量 • 一、软件危机 20世纪60年代后期,由于计算机软件的规模和复杂性的增大,又由于软件开发的合作需求的增强,使得以前的软件开发过程和控制方法,无法保证软件项目的开发周期和开发成本的要求,这就产生了整个软件行业的生产效率低下,这被称为软件危机。 • 二、软件工程 为了解决软件危机,人们不得不研究软件开发的一般规律,试图找到一系列的理论方法来指导和规范软件开发的过程,这就产生了软件工程这门工程学科。其中软件质量和软件开发模式是关注的重点。

  4. 11.1 软件质量 三、软件质量 包括正确性、健壮性、可扩展性、可重用性、有效性等。 面向对象程序设计特别强调:可靠性和可扩展性、可重 用性。

  5. 11.2 程序断言机制 一、程序断言 形式上看是一种逻辑表达式,称为assertion。 作用: (1)保证程序的正确性与健壮性 (2)可用于形成程序的文档 (3)支持程序的动态调试 (4)构成异常处理的基础

  6. 11.2 程序断言机制 二、程序断言的用法 由于在C++中,仅支持很少的程序断言机制,所 以我们可以参考一些别的程序语言的用法,并将这些 断言写在C++语言的注释中。 三、C++语言中的程序断言 利用assert宏(需包含assert.h)来实现。 用法如下: void assert(int expression);

  7. 11.2 程序断言机制 当检测条件expression不满足的时候,产生一个 断言,在标准错误输出流上输出信息,并中止程序执行 Assertion failed:expression file<filename>,line<linenum> 注意:在程序的release版本中,assert不起任何作用, expression不被执行。

  8. 11.2 程序断言机制 例: #include<iostream.h> #include <assert.h> #include <string.h> void analyze_string( char *string ); int main( void ) { char test1[] = "abc", *test2 = NULL, test3[] = ""; cout<< test1 ; analyze_string( test1 ); cout<< test2 ; analyze_string( test2 ); cout<< test3 ; analyze_string( test3 ); } void analyze_string( char * string ) { assert( string != NULL ); assert( *string != '\0' ); assert( strlen( string ) > 2 ); }

  9. 11.2 程序断言机制 在VC++中,还有两个类似的宏 VERIFY和ASSERT当 debug版本时,VERIFY和ASSERT与assert没有区别。但是 当是release版本时,VERIFY执行expression,但是不产 生中断。而ASSERT不执行expression

  10. 11.3 异常处理机制 当在程序执行的过程中出现了一些不平常的情况,或 运行结果无法定义的情况,而使操作不得不中断时,我们 说程序出现了异常。 对于异常情况的处理,C++具有自己的异常处理机 制,其基本思想是:将异常的检验和处理分开,当一个函 数体中检测到异常条件的存在,而无法确定相应的处理方 法时,将引发一个异常,并由函数自己或者函数的直接、 间接调用者检测并处理这个异常。

  11. 11.3 异常处理机制 一、C++异常处理机制的使用 (1)我们使用try语句来监测异常情况,catch语句来处 理捕获和处理异常,用throw语句抛出异常。 try{ 语句序列; } catch(数据类型1 [参数]) { } catch(数据类型2 [参数]) { } …… catch(数据类型n [参数]) { }

  12. 11.3 异常处理机制 例1 #include<iostream.h> void Fun(); int main() { cout<<“I tell you a Story.”<<endl; try{cout<<“Princess meets Frog.”<<endl; Fun(); cout<<“What is the result!”<<endl; } catch(int i){ cout<<“Princess kisses Frog.”<<i<<endl; } catch(unsigned){ cout<<“Princess run away in disgust.”<<”<<endl; } cout<<“the End.”<<endl; return 0; } void Fun() { throw 1; }

  13. 11.3 异常处理机制 说明: try块和catch列表被总称为try语句,其中的catch列 表中的每个项被称为一个异常处理程序。如果try块被正 常执行而没有出现异常,则异常处理程序不被执行,程序 接着执行try语句之后的语句。如果try块的执行导致一个 异常被引发,则try块中在异常引发之后的操作不再被执 行,控制转移到该try语句的某个异常处理程序中进行,在 该异常处理程序被执行完之后,程序开始执行try语句之 后的语句。

  14. 11.3 异常处理机制 如果引发了异常,但try语句没有申明处理这个异 常,则控制又转移到该try语句所在的函数的调用函数中。 在该调用函数中使用相同的规则去寻找一个异常处理程序。 这个过程一直进行到该异常被我们的程序处理,或被C++ 运行系统处理为止。如果异常被C++运行系统处理,程序 将被终止运行,我们成这种终止为异常终止。

  15. 11.3 异常处理机制 (2)throw的用法 throw 变量或常量; 表示在try块中抛出与变量或常量相同类型和值的异 常。 throw; 表示异常处理程序继续向上一级调用函数抛出异常。

  16. 11.3 异常处理机制 例2 #include<iostream.h> void trigger(); { try{ throw “WARNING”; } catch(char* msg){ cout<<“Catch”<<msg<<“in trigger()”<<endl; throw; } return; } int main() { try{ trigger(); } catch(char* msg){ cout <<“Catch”<<msg<<“in main()”<<endl; } return 0; }

  17. 11.3 异常处理机制 (3)catch的用法 catch(数据类型 [变量名]) 表示在catch块中要捕获与变量相同类型和值的异 常。如果没有变量名,表示异常处理程序仅仅对变量 类型感兴趣,对于值则不感兴趣,可以省略。 catch(…) 表示异常处理程序捕获任何形式的异常。一般要放 在多个异常处理程序的最后。

  18. 11.3 异常处理机制 二、异常接口规范申明 为使一个函数的用户能够方便地指导所使用的函 数都能够引发那些异常,可以在函数的原型声明中列 出这个函数可能引发的所有异常。 例如: void fun() throw (A,B,C); 表明函数fun能够引发类型为A,B,C的异常,在fun 函数体内只能抛出这三种异常,如果试图抛出其他类 型的异常,运行系统将会终止程序运行。 如果函数fun中没有理出异常接口申明,表示fun 可以引发任何类型的异常

  19. 11.3 异常处理机制 如果有: void fun() throw(); 表示fun不引发任何异常 注意:异常接口申明不是函数原型的一部分,内联函 数不能申明异常接口。

  20. 11.3 异常处理机制 二、异常时的构造函数和析构函数 在构造函数中可以引发异常,但是由于构造函数 没有被执行完,所以,对象并没有被构造。当这个没 有被完全构造的对象被删除时,并不为这个对象调用 析构函数。

  21. 11.3 异常处理机制 例3 #include<iostream.h> #include<stream.h> class Message{ public: Message(const string& s) throw(string) ~Message(); private: string msg; }; Message::Message(const string& s) throw(string) : msg(s) { throw string(“throwing an exception in constructor”); }

  22. 11.3 异常处理机制 例3 Message::Message(const string& s) throw(string) : msg(s) { throw string(“throwing an exception in constructor”); } Message::~Message() { cout<<“Destructor:”<<msg<<endl; } void f() throw(string) { Message a(“Run away from f()”); }

  23. 11.3 异常处理机制 例3 int main() { try{ f(); } catch(const string& m) { cout<<“The exception is caught:”<<m<<endl; } return 0; } 程序的运行结果为:The exception is caught: throwing an exception in constructor 注意:对象 a的析构函数没有被调用。

  24. 11.3 异常处理机制 说明: (1)当创建一个局部生存期的数组对象时,如果它的一个元素对象的构造函数引发了异常,则只有这个数组中被构造的元素对象的析构函数被执行,那些没有被构造或没有被完全构造的元素对象的析构函数不被执行。 (2)对于使用继承机制或者对象成员建立的包含子对象的对象,如果在创建该对象时引发了异常,则该对象只被部分构造,只有该对象所包含的被完全构造的子对象的析构函数被执行。

  25. 11.4 可重用构件库 一、可重用构件 可重用构件包括源代码,需求分析、系统设 计、测试用例、各种开发流程、开发文档等。 源代码级的可重用构件指的是可供程序设计过 程重新利用的基本程序单位,主要形式是源程序一 级的子程序、函数、过程、模块或者类。在面向对 象程序设计中可重用构件通常表现为类的形式。

  26. 11.4 可重用构件库 可重用构件库 由许多构件的构件规范、构件实现、构件目标 以及构件演示组成的集合。 构件库规范 对构件库中各个构件的说明。用户通过构 件库规范使用构件。 构件规范 对构件的说明。 构件实现 对构件规范的实现。 构件目标 由构件实现编译得到的目标文件。

  27. 11.4 可重用构件库 构件演示 用于演示构件基本功能与特点的源程序文件与可 执行文件。 构件库规范首部注释 在构件库规范的开头对整个构件库进行说明和解 释。 构件规范首部注释 在每一个构件规范的开头对整个构件进行说明和解释 构件规范注释 在每一个构件规范中的注释,它包括构件规范首 部注释、构件规范中声明的所有含事故的函数首部注 释、函数形式参数注释、各种变量注释等等。

  28. 11.4 可重用构件库 构件实现首部注释 在每一个构件实现的开头对整个构件实现情况 进行说明和解释。 构件实现注释 在每一个构件实现中的注释,它包括构件实现首 部注释、构件实现中引入的内部函数的首部注释、函 数形式参数的注释一级构件实现中引入的内部变量的 注释等。

  29. 11.4 可重用构件库 二、构件库组织形式与使用方法 构件库是按应用领域来划分的。所有可重用构 件均以面向对象程序设计语言实现,每一个面向专 门领域的构件库都由类组成,即构件库存放的构件 必须是类,而不能是例程(如过程、函数、子程序 等)。 每个构件库应包括以下文件: (1)一个或多个构件库规范 (2)多个构件实现 (3)多个构件目标 (4)多个构件演示

  30. 11.4 可重用构件库 用户要使用构件库,经常使用下面的方法:首 先将构件库规范文件(库头文件)包含在使用此构 件的源程序中;接着将构件库文件(.LIB)列入项 目连结库中。 三、构件库设计风格 (1)命名风格 包括命名大小写、命名长度和命名选择。 (2)注释风格 包括注释原则、构件库规范首部注释、构件规范 首部注释构件规范注释、构件实现首部注释、构件 实现注释和构件演示首部注释。 (3)版面风格 缩进与分隔符和标准版面

  31. 11.4 可重用构件库 三、构件库设计原则 (1)模块封装 每一构件都是一个类,类是唯一的模块形式。 (2)利用继承机制组织构件库 (3)继承和多态性 在使用继承机制的基础上,可充分利用面向对象程序 设计语言的多态性特征。 (4)对象实例和对象指针 (5)单实例类 (6)缺省参数表与可变数目参数 (7)书写注释 (8)其它 避免使用全局变量、全局(非成员)函数、公有数据成 员;避免直接访问另一对象的数据成员;尽量不使用内联。

  32. 11.4 可重用构件库 三、构件库文档编制指南

More Related