Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "程序设计是计算机学科的核心和灵魂程序设计是计算机学科的核心和灵魂 程序设计基础 第十一章 面向对象软件构造."— 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,line 注意:在程序的 release 版本中, assert 不起任何作用, expression 不被执行。

8 11.2 程序断言机制 例: #include 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 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 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 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 可重用构件库 三、构件库文档编制指南


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

Similar presentations


Ads by Google