C毕业论文毕业论文

C毕业论文毕业论文

ID:45755224

大小:492.69 KB

页数:60页

时间:2019-11-17

上传者:U-7604
C毕业论文毕业论文_第1页
C毕业论文毕业论文_第2页
C毕业论文毕业论文_第3页
C毕业论文毕业论文_第4页
C毕业论文毕业论文_第5页
资源描述:

《C毕业论文毕业论文》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

图书馆管理系统开发毕业论文目录前言错误!未定义书签。第一章绪论1第一节图书管理系统开发的背最1第二节国内外发展现状1第三节图书管理系统开发的目的和意义2第四节论文主要结构3第五节本章小结3第二章开发工具及相关技术简介4第一节VisualC++6.0技术简介4第二节ACCESS技术简介5一、Access数据库安全方式5二、Access的彳丿C点6三、ODBC技术简介7第三节木章小结8第三章系统需求分析10第一节需求分析概述10第二节用户特点10第三节需求描述11一、数据流图11二、数据流图加工处理功能简单描述13第四节数据描述14一、E—R图14二、数据实体结构描述14第五节性能需求17一、数据的准确性17二、特性要求17第六节运行环境18一、硬件环境18二、软件环境18第七节接口18一、硬件接口18二、软件接口18第八节本章小节18第四章系统概要设计20 第一节设计原理20一、模块化20二、抽象20三、逐步求精20四、信息隐藏和局部化21五、模块独立21第二节设计原则21第三节功能模块设计22一、管理员管理模块22二、用户查询管理模块22第四节数据库设计23第五节本章力、节25第五章详细设计与实现26第一节登陆窗体的设计与实现26一、管理员登陆界面、代码设计26二、管理员登陆流程图26三、登陆核心代码如下27第二节图书管理系统主体窗口的设计与实现28第三节图书管理模块的设计与实现28一、图书管理界面、代码设计28二、图书出库入库流程图29三、图书管理的核心代码如下30第四节图书查询模块的设计与实现31一、图书管理界面、代码设计31二、图书查询流程图31三、图书查询的核心代码如下32第五节图书借还模块的设计与实现33一、图书管理界面、代码设计33二、图书借还流程图33三、图书借还的核心代码如下:34第六节读者管理35第七节读者查询系统35第八节本章小结36第六章系统测试运行37第一节测试的介绍37一、软件测试的目的37二、测试的原则37三、软件测试步骤37四、软件测试的方法38第二节测试概要39一、图书管理系统功能分解39二、测试内容40 第三节测试用例40一、功能测试40二、运行时间测试42三、数据库操作测试42四、错误测试42第四节测试结果及基本功能43一、系统测试结果汇总43二、具有的基木功能44 第五节本章小结44结论错误!未定义书签。参考文献45致谢错误!未定义书签。4646、英文全文:52二、英文翻译: 第一章绪论第一节图书管理系统开发的背景在当今知识大爆炸的时代,图书作为信息的一种载体,仍是人们获得知识的一种重要途径,因而作为图书管理与借阅的图书馆,它的运行情况则关系到知识的传播速度问题。以往旧的图书馆管理模式完全是手工操作,从新书的购买、编码、入库、上架,到借阅、续借、归还、查询,无一不是人工处理,需要大量的劳动力与工作量,而且由于人为的原因造成一些错误,也是再所难免的。当读者想要借阅一本书时,首先要查询大量的卡片,而且要有一定的图书管理知识,才能很快的查到。自己想要的图书,在借阅过程中还要填写许多相关的卡片,使得图书馆的管理效率低下,图书流通速度较慢,因而从一定程度上也影响了知识的传播速度。信息技术发展FI新月界,区域信息化建设如火如荼,作为信息资源基础建设主体的图书馆面临着前所未有的挑战和机遇。近儿年随着计算机技术、网络技术的不断发展和普及,目前很多学校都建起了校园网,进一步推动了图书馆的信息化建设。正是基于这种现状,我们开发了这套图书馆管理系统,该系统充分发挥了计算机技术、网络技术的强大功能,从整体上改善了图书馆的管理工作,提高了图书馆服务的功能和质量,实现了图书管理的信息化、网络化、自动化。第二节国内外发展现状从20世纪70年代末至90代初,是我国图书馆信息管理系统建设单机和局域网时期。虽然在这期间,个别院校开发过主机/终端模式的系统,但这不是主流。1976年中国科学院计算机研究所研制成功计算机情报检索系统(QJ-111),1978年南京大学研制成功“西文图书检索系统(NTDS-78),1980年4月,清华大学在国产机DJ-130计算机上作了图书流通管理、多用户联机检索试验,这些标志着信息管理系统在我国的建设的正式开始。此后,我国的图书馆自动化建设经过了试验性分离式系^(1978-1986).初步的集成系^(1986-1989)和实用集成系统 三个阶段。一些系统在实际运行中根据用户意见多次改进,到1996年己经相当成熟和完善。然而这些系统都是针对在单个图书馆应用计算机而开发的,其功能总的说,是对传统图书馆业务手工操作的模拟和扩展。90年代中期以来,随着网络技术的迅猛发展,图书馆工作发生了一些根本性的变革,原来的集成系统不能适应我国图书馆新变化的情况日渐显露,于是,国内一些开发单位开始了新一代网络化图书馆信息管理系统的更新、升级和开发,并陆续开始推岀比较成熟的客户机/服务器模式的图书馆信息管理系统。比较有代表性的像北京丹诚责任有限公司推岀的丹诚图书馆集成系统(有NT版和UNIX版)。还有息洋、深圳大学图书馆、同济大学等单位推出的集成系统。1996年至1999年间,北京大学图书馆和中国人民大学图书馆购买的由美国SIRSI公司推岀的大型图书馆信息管理系统Unicorn,上海图书馆、上海交通大学、复旦大学、华南理工大学、上海大学等图书馆先后引进的美国HORIZON系统,清华大学、西安交通大学、华东师范大学图书馆引进的美国INNOPAC系统,也都是C/S模式二层结构的客户机/服务器模式。就FI前我国图书馆信息管理系统开发的能力和水平与欧美等先进国家相比,基本上差不多山。第三节图书管理系统开发的目的和意义图书馆管理系统本着让图书馆管理做到快捷、方便、简单、摆脱用手工操作处理图书借阅的问题:工作非常繁琐,需要大量的人力、物力和财力,极大的浪费了资源的略事而设计,它可以使管理员从繁重的手工操作中解脱出来,还可以使读者通过查询系统,了解图书的基本信息及借阅信息,这样可以迅速的掌握图书馆图书信息的动向。管理员通过木系统可以添加、修改、删除图书信息,可以添加用户信息,读者可以快速查找图书等,可以让用户方便的了解图书馆与图书的相关信息。图书馆管理系统是一项非常有意义的开发工作,其发展的潜力巨大,现今最好的办法就是使用计算机操作的图书馆管理系统来实现对图书馆的管理,这就为图书馆管理系统提供了市场需要,而图书馆管理系统在现代社会是最热门的行业,国际上图书管理系统前景看好,而国内的图书管理系统,数量上也有了新的增长。 第四节论文主要结构文章按照分析与设计的逻辑顺序分为六章。第一章为绪论,简要论述了图书管理系统,介绍了系统开发的背景与系统设计的目的与意义以及国际上发展情况;第二章是对图书管理系统所用的工具与技术作简要的分析与介绍;第三章是对系统进行需求分析,在功能上对系统进行划分,第四章为概要设计,是在第三章的需求分析的基础上说明系统的设计原理,功能模块设计和数据库设计;第五章是详细设计,该部分详细介绍了图书管理系统的设计与实现过程。第六章为系统测试,该部分详细介绍了系统的测试用例,测试结果,以及要此上得出的结论。第五节本章小结在第一章的内容中,简单的介绍了图书管理系统,分析了现在图书管理系统国外国内开发的趋势,阐述了系统开发的背景,明确了开发此系统的目标与意义熟悉了一些基本的概念,为后面的具体开发做好了准备。 第二章开发工具及相关技术简介本图书管理系统主要采用VisualC++6.0编程技术和Access2003数据库,分别VisualC++6.0从技术特点,应用范围,以及Access2003数据库的发展,特点和应用方面进行简述,以明确开发系统所使用的技术有足够的可行性和明显的针对性,并能满足系统移植性能的要求。第一节VisualC++6.0技术简介VisualC++6.0是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推岀VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用有很大的局限性,只适用于Windows2000,WindowsXP和WindowsNT4.0。所以实际中,更多的是以VisualC++6.0为平台。VisualC++6.0不仅是一个C++编辑器,而□是一个基于Windows操作系统的可视化集成开发环境(integrateddevelopmentenvironment,IDE)oVisualC++6.0由许多组件组成,包括编辑器,调试器以及程序向导AppWizard,类向导ClassWizard等开发工具。这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境。VisualC++6.0它大概可以分成三个主要的部分:①DeveloperStudio,这是一个集成开发环境,我们日常工作的99%都是在它上面完成的,再加上它的标题赫然写着“MicrosoftVisualC++”,所以很多人理所当然的诊断,那就是VisualC++了o其实不然,虽然DeveloperStudio提供了一个很好的编辑器和很多Wizard,但实际上它没有任何编译和链接程序的功能,真正完成这些工作的幕后英雄后面会介绍。我们也知道,DeveloperStudio并不是专门用于VC的,它也同样用于VB,VJ,VID等VisualC++Studio家族的其他同胞兄弟。所以不要把DeveloperStudio当成VisualC++。它充其量只是VisualC++的一个壳子而已。这一点请切记!②MFCo从理论上讲,MFC也不是专用于VisualC++,BorlandC++,C++Buider和SymantecC++同样可以处理MFC。同吋,用VisualC++来编写SDK 程序,或者使用STL,ATL,一样没有限制。不过,VisualC++本来就是为MFC打造的,VisualC++中的许多特征和语言扩展也是为MFC而设计的,所以用VisualC++而不用MFC就等于摒弃了VisualC++屮很大的一部分功能。但是,VisualC++也不等于MFCo①PlatformSDK。这才是VisualC++和整个VisualStudio的精华和灵魂,虽然我们很少能直接触到它。大致说来,PlatformSDK是以MicrosoftC/C++编译器为核心,配合MASM,辅以其他一些工具和文档资料。上面说到的DeveloperStudio没有编译程序的功能,那么这项工作是由谁来完成的呢?是CL,是NMAKE,和其他许许多多命令行程序,这些我们看不到的程序才是构成VisualStudio的基石⑵。第二节ACCESS技术简介图书管理系统开发选择了MicrosoftAccess2003数据库。MicrosoftAccess在很多地方得到广泛使用,例如小型企业,大公司的部门,和喜爱编程的开发人员专门利用它来制作处理数据的桌而系统。它也常被用来开发简单的WEB应用程序.这些应用程序都利用ASP技术在InternetInformationServices运行.Access的最初名称是Cirrus。它开发于VisualBasic之前,当时的窗口引擎称作Ruby。比尔盖茨看过Ruby的原型后决定把这个基于Basic语言的组件作为一个独立的可扩展应用程序与Access联合开发。这个项目称作ThunderoMicrosoftAccess1.0版本在1992年11月发布。2003年微软正式发布了access2003,这是继2002年后发布的最新版本,它在继承了以前版本的优点外,又新增了一些使用功能。一、Access数据库安全方式1>密码式给数据库起一个随机复杂的名称,避免被猜到被下载,这种方式在以前很流行,因为大家都对自己的代码很有自信。但随着错误提示对数据库地址的泄露导致数据库被非法下载,这种方式也就越来越少人用了。2、”#”式。在数据库名称里加上#号,从URL上请求时#是请求地址和请求参数的一个 分隔字符,如果知道了数据库名,直接请求的话,如:http://www.xx.eom/access#.mdb,WEB服务器会认为请求的是access而不是access#.mdb,所以会提示找不到文件,但是很遗憾,URL屮对于这些特殊的字符都会有一个特殊的表示方式,#的特殊表示就是%23,如http://www.xx.com/access%23.mdb,那么access#.mdb将会被下载。还有如果用FlashGetZ类的下载工具也可以直接下载。3、ASP式。这种作法是比较专业但也是很安全的也是现在比较流行的作法,但是现在许多的人只是作了一半,只是将数据名改成ASP而以,这样的话直接用FlashGet之类的下载工具一样可以将数据库下载,这种方式的正确作法有两步:首先在数据库内创建一个字段,名称随意,类型是OLE对象,内容设置为单字节型的”这段代码运行完之后将会在数据库内生成一个nodownload表,表内字段是notdowno果数据库内已有同名的数据表存在请将代码内的nodownload改成自己想要的数据表名即可。4、asa式。这种方式的真谛是利用IIS对ASA文件的保护,从而使得数据库文件不能从URL上直接请求下载,但是这种方式被误解成只要将文件后缀改成ASA就可以了。要知道IIS只是对global.asa这个文件名有请求保护,所以这种方式只能将数据库名设置为global.asa,而且要注意的是,设置成global.asaZ后最好不要将其放在主机或虚拟目录的根目录里,不然会被IIS当然正常的global.asa文件进行尝试运行的⑶。二、Access的优点1、存储方式单一Access管理的对象有表、查询、窗体、报表、页、宏和模块,以上对象都存放在后缀为(.mdb)的数据库文件种,便于用户的操作和管理。2、面向对象Access是一个面向对象的开发工具,利用面向对象的方式将数据库系统中的各种功能对象化,将数据库管理的各种功能封装在各类对象中。它将一个应用系统当作是由一系列对象组成的,对每个对象它都定义一组方法和属性,以定义该对象的行为和外国,用户还可以按需要给对象扩展方 法和属性。通过对象的方法、属性完成数据库的操作和管理,极大地简化了用户的开发工作。同时,这种基于而向对彖的开发方式,使得开发应用程序更为简便。3.界面友好、易操作Access是一个可视化工具,是风格与Windows完全一样,用户想要生成对象并应用,只要使用鼠标进行拖放即可,非常直观方便。系统还提供了表生成器、查询生成器、报表设计器以及数据库向导、表向导、查询向导、窗体向导、报表向导等工具,使得操作简便,容易使用和掌握。4、集成环境、处理多种数据信息Access基于Windows操作系统下的集成开发环境,该环境集成了各种向导和生成器工具,极大地提高了开发人员的工作效率,使得建立数据库、创建表、设计用户界面、设计数据查询、报表打印等可以方便有序地进行。5、Access支持ODBC利用Access强大的DDE(动态数据交换)和OLE(对象的联接和嵌入)特性,可以在一个数据表中嵌入位图、声音、Excel表格、Word文档,述可以建立动态的数据库报表和窗体等。Access还可以将程序应用于网络,并与网络上的动态数据相联接。利用数据库访问页对象生成HTML文件,轻松构建Internet/lntranet的应用。三、ODBC技术简介ODBC(OpenDatabaseConnectivity,开放数据库互连)是微软公司开放服务结构(WOSA,WindowsOpenServicesArchitecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access,MYSQL述是Oracle数据库,均可用0DBCAPI进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。 一个完整的ODBC由下列几个部件组成:①应用程序(Application)oODBC管理器(Administrator)。该程序位于Windows95控制面板(ControlPanel)的32位ODBC内,其主要任务是管理安装的ODBC驱动程序和管理数据源。②驱动程序管理器(DriverManager)o驱动程序管理器包含在ODBC32.DLL屮,对用户是透明的。其任务是管理ODBC驱动程序,是ODBC中最重要的部件。③ODBCAPI。④ODBC驱动程序。是一些DLL,提供了ODBC和数据库Z间的接口。数据源。数据源包含了数据库位置和数据库类型等信息,实际上是一种数据连接的抽彖。应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。在ODBC中,ODBCAPI不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。驱动程序管理器负责将应用程序对ODBCAPI的调用传递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过驱动程序管理器返回给应用程序。在访问ODBC数据源时需要ODBC驱动程序的支持。用VisualC++5.0安装程序可以安装SQLServer、Access、Paradox>dBaseFoxPro、Excel>Oracle和MicrosoftText等驱动程序.在缺省情况下,VC5.0只会安装SQLServer^Access>FoxPro和dBase的驱动程序.如果用户需要安装别的驱动程序,则需要重新运行VC5.0的安装程序并选择所需的驱动程序。ODBC使用层次的方法来管理数据库,在数据库通信结构的每一层,对可能出现依赖数据库产品自身特性的地方,ODBC都引入一个公共接口以解决潜在的不一致性,从而很好地解决了基于数据库系统应用程序的相对独立性,这也是ODBC—经推出就获得巨大成功的重要原因之一⑷。第三节本章小结 开发工具的选择,是关系到一个项目的开发的重要选择,选择较好的开发工具有帮于增强项目的认识程度和运行效率。在第二章的内容中,简单的介绍了开发图书管理系统,所用的工具及技术,增强了对所用工具的背景的了解,为后面的实际开发打下基础。 第三章系统需求分析第一节需求分析概述需求分析是对用户需求的真正明确,是对要解决的问题的彻底理解。在解决问题之前要理解问题,只有真正的理解问题才能更好的解决问题。需求分析就是给系统分析、设计人员一个和用户交流来理解问题的机会一了解用户究竟需要什么。需求分析也是一个建模的过程,与在概要设计中建模不同在需求分析中建模是面向用户的过程。而在概要设计中的建模过程是面向开发人员的过程。这样两种建模的过程就会存在差异和不同,从而使用自然语言进行描述也就不同。在传统的软件工程中并不建议大量的使用自然语言对软件的需求进行描述,因为太多的自然语言会引发岀很多问题。比如说,二义性即不同的人对自然语言的描述会有不同的理解,就是再好的文档编写人员也不会保证他的文档不存在二义性。毕竟我们不是语言学家。这样就引入了借用图示进行功能的描述和建模的过程。图示有其自己的优势比如,清晰,明确给人直观的感觉。无论是何种背景的人群都可以理解。这样就大大减少需求分析中的二义性。从而使系统设计人员和用户更加有效的沟通。这样也增加了软件的正确性。在传统的软件工程中提供了多种不同的图示,每一种都从不同的角度对同一个问题进行描述,之所以这样。可以使系统开发人员在不同的图示中挑岀最适合他和他的团队进行问题详尽描述的一个或者一些图示。比如数据流图,在需求分析中使用数据流图,就充分体现了数据在软件系统中移动时被变换的逻辑过程。所以就是一个建立功能模型的最好图示;而实体关系图,就是描述数据对象以及他们之间关系的图示,所以就是一个建立数据模型的最好例子。状态转换图通过事件的外部作用从而对状态进行改变,这就是一个建立行为模型的例子⑹。第二节用户特点木软件的最终用户是面向管理员(图书管理员和其它管理人员)、读者(老师和同学等),他们都具有一定的计算机应用基础,可以比较熟练操作计算机。管理员和读者都是经常性用户。系统维护人员为计算机专业人员,懂计算机基础知识、数据库与C++编程等相关知识,能熟练操作VC工具。维护人员为间隔性用户。木软件用于图书管理,使用频繁,要求长时间不间断运营,性能稳定。 第三节需求描述在图书管理系统屮,管理员要为每个读者建立借阅账户,并給读者发放不同类别的借阅卡(借阅卡可提供卡号、读者姓名),账户内存储读者的个人信息和借阅记录信息。持有借阅卡的读者可以通过管理员(作为读者的代理人与系统交互)借阅、归还图书,不同类别的读者可借阅图书的范围、数量和期限不同,可通过图书馆内查询终端查询图书信息和个人借阅情况,以及续借图书(系统审核符合续借条件)。借阅图书时,先输入读者的借阅卡号,系统验证借阅卡的有效性和读者是否可继续借阅图书,无效则提示其原因,有效则显示读者的基本信息,供管理员人工核对。然后输入要借阅的书号,系统查阅图书信息数据库,显示图书的基本信息,供管理员人工核对。最后提交借阅请求,若被系统接受则存储借阅纪录,并修改可借阅图书的数量。归还图书时,输入图书号,系统验证是否有此借阅纪录以及是否超期借阅,无则提示,有则显示读者和图书的基本信息供管理员人工审核。如果有超期借阅或丢失情况,先转入过期罚款或图书丢失处理。然后提交还书请求,系统接受后删除借阅纪录,并改变图书的借阅状态。图书管理员定期或不定期对图书信息进行入库、修改、删除等图书信息管理,包括图书类别和出版社管理,图书管理员还可实现对数据备份等通用功能。、数据流图图3.1顶层图 0询牯車再图3.32层图(2书籍管理) 图3.52层图(4借阅管理)二、数据流图加工处理功能简单描述1.书籍管理书籍类别管理:增、删除、改等管理。书籍信息管理:新书入库,图书购入后由图书管理人员将书籍编码并将其具体信息录入书籍信息表。书籍信息修改,书籍信息由于工作人员的疏忽而出现错误时,可修改其信息。管理员按不同方式查询、统计,读者按不同方式查询。 1.读者管理读者类别信息管理:增、删除、改等管理。读者信息管理:办理、挂失、暂停借、录入、删除读者信息。3・借阅管理还书管理:根据借阅卡编号、图书ID等,在借阅信息表屮找到相应的记录,将借书记录删除,更新该记录的相应数据(图书信息表)。根据违反规定情况计算和登记罚款记录。借书管理:根据借阅卡编号和图书编号,进行借书登记。在借阅信息表屮插入一条借书记录,该记录包括读者ID、图书ID、借出口期、借阅编号、图书名等信息,更新该记录的相应数据(图书信息表)。并把读者借阅图书以列表的形式显示出来。第四节数据描述通过对图书管理系统需求及其数据流图的分析,可以得出该系统涉及读者、书籍、借阅和还书信息表等数据实体。一、E-R图图3.6图书管理系统E・R图二、数据实体结构描述表3.1图书信息表功能名称:图书信息表存储位置:图书信息存储组织:一本图书一条记录主键:图书编号 数据元素数据采集方式说明图书编号人工釆集主键,必须输入图书名称人工釆集必须输入作者人工釆集译者人工采集单价人工采集出版社人工釆集出版时间人工釆集是否注销人工釆集内容简介人工采集备注人工采集相关提供数据主要功能模块:书籍管理、借阅管理、注销管理数据输出接受主要功能模块:书籍管理、借阅管理、注销管理修改记录:表3.2读者信息表功能名称:读者信息表存储位置:读者信息存储组织:一个读者一条记录主键:读者编号数据元素数据采集方式说明读者编号(借书证号码和用户名与此同)人工采集主键,必须输入读者姓名人工釆集必须输入读者类别人工釆集读者性别人工采集读者状态人工采集已借图书数量自动釆集证件名称人工釆集 证件号码人工采集读者单位人工釆集联系地址人工釆集联系电话人工釆集EMAIL人工采集用户密码人工采集相关提供数据主要功能模块:读者管理、借阅管理数据输出接受主要功能模块:读者管理、借阅管理修改记录:表3.3借阅信息表功能名称:借阅信息表存储位置:借阅信息存储组织:一本借阅一条记录主键:图书编号数据元素数据采集方式说明图书编号人工采集主键,必须输入图书名称自动釆集读者编号人工釆集主键,必须输入图书价格自动釆集借阅H期自动采集应还日期口动采集续借次数自动釆集借阅操作员自动釆集相关提供数据主要功能模块:借阅管理、续借管理数据输出接受主要功能模块:借阅管理、续借管理修改记录: 表3.4读者信息表功能名称:读者类别表存储位置:读者类别存储组织:一类读者一条记录主键:读者类别编号数据元素数据采集方式说明读者类别编号人工采集主键,必须输入读者类別名称工人采集必宿输入可借书数量人工采集可借书天数人工采集可续借次数人工采集逾期缓冲天数人工采集逾期每天罚款金额人工采集丢失罚款倍数人工采集相关提供数据主要功能模块:读者类别管理数据输出接受主要功能模块:读者管理、读者类别管理修改记录:第五节性能需求一、数据的准确性①从数据库中提取数据时,要求数据定位准确。②向数据库输入数据时,要求录入数据有校验准确。③查询返回的信息均来源于数据库⑹。二、特性要求由于此开发项目针对图书馆,使用频度较高,使用性要求比较高。为防止对信息资料和管理程序的恶意破坏,要求有较为可靠的安全性能。总之,要求稳定、安全、便捷,易于管理和操作。①查询速度:不超过10秒; ①其它所有交互功能反应速度:不超过3秒;②可靠性:平均故障间隔时间不低于200小时。第六节运行环境硬件环境①处理器(CPU):Pentium900M(推荐Pentium41.2G)②内存容量(RAM):至少256M(推荐512M)软件环境①操作系统:Windows98/2000/2003/XPo②数据库管理系统:Access2003,ODBC协议。③VisualC++6.0软件。第七节接口一、硬件接口考虑到大量数据的备份等要求,需要保持与磁带机和光盘刻录机的接口,这较易实现。二、软件接口这里,主要考虑软件与操作系统、数据库管理系统的接口,以及局域网和互联网软件之间的数据交换。考虑到文档处理时有可能需要较常用的办公软件。例如Microsoft的Office系列,所以应尽量实现它们之间的数据格式的自动转换。第八节本章小节一个好的项目,需求分析是相当关键了,只有充分的了解用户的需求才能被用户所接受,在激烈竞争的市场上才能得到用户的认可。本章重点对图书管理系统作了需求分析,站在用户的角度,了解用户所需的系统是什么样子,使其开发的系统 不偏离市场。同时为后而的概要设计与实际开发打下基础。 第四章系统概要设计经过需求分析阶段的工作,图书管理系统必须“做什么”已经清楚了,现在决定“怎么做”的时候了。接下来主要说明该系统的设计原理,功能模块设计和数据库设计。第一节设计原理这一节主要讲述图书管理系统在设计过程中遵循的基本原理。一、模块化模块是构成程序的基木构件,模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户需求。采用模块化原理可以使软件结构清晰,不仅容易设计也容易阅读和理解。该系统正是釆用模块化的原理,将整个系统分成几个主要模块,每个模块都有它独立的功能,整个图书管理系统结构清晰,用户容易理解和操作。二、抽象当考虑对任何问题的模块化解法时,可以提出许多抽彖的层次,系统设计过程的每一步都是对软件解法的抽彖层次的一次精化,在可行性研究阶段,是对整个图书管理系统的抽彖,在需求分析阶段,是对图书管理系统功能的抽彖。三、逐步求精逐步求精是对整个设计过程的细化,由可行性研究到需求分析,再到总体设计和详细设计,每一步都对图书管理系统进行了细化,这样图书管理系统的结构越来越清晰,功能越来越完善。 、信息隐藏和局部化在图书管理系统的设计过程中,涉及到许多数据信息,有的信息对于不需要它的模块来说是不可能访问的,需要隐藏起来,而局部化有助于实现信息隐藏,该系统正是运用了这一原理来进行设计的。五、模块独立该系统的各个模块之间没有过多的相互作用,每个模块的功能都比较独立,这样的软件容易开发出来。系统的各模块都相对独立,修改设计和程序需要的工作量比较小,错误传播范围小,需要扩充功能时能够插入模块,这样系统比较容量测试和维护⑺。第二节设计原则为了使木系统功能齐全完备,操作简便,最大限度的提高软件的质量,从而满足用户的实际需要,在设计开发过程中遵循了如下原则⑻:①合法性原则:依据图书管理系统的工作规定以及要求,参照管理工作的实际情况,进行诸如借书,查询等工作。②实用性原则:适合图书管理系统工作的实际需求,并能够处理一些特殊情况要求,此外,尽可能预留空间,以便扩充功能。③准确性原则:对输入的相关资料建立检错机制,及时报错,使用户能够及时准确的输入合法资料(如:类型匹配,不能重复输入等)。④易操作原则:要求设计的系统功能齐全,界面友好,操作方便,必要的地方进行提示。⑤源程序可读性原则:为了便于其他设计,维护人员读懂代码或以后的代码修改,软件升级维护,即可能做好代码注释工作。⑥优化原则:为了达到优化的目的,合理运用窗口,菜单,对象等的继承,自定义用户对象,事件,函数,减少了不必要的重复性代码,使程序简介明了,也方便了将来的维护。⑦安全性原则:可以为该系统的用户设置不同的权限,职能。 第三节功能模块设计模块化是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干个模块的过程。每个模块完成一个特定的功能,所有的模块都按某种方法组织起来,成为一个整体,完成整个系统所要求的功能⑼。根据前面在需求分析阶段提出的系统功能需求,将系统结构分成两个大的模块:管理员管理模块,用户查询管理模块,每个模块的具体功能如下:一、管理员管理模块实现对图书,读者等基本信息管理的功能,让管理员对整个图书馆的图书信息及读者信息有详细的了解,这个模块包括“用户管理”,“图书管理”,“借阅管理”,“数据库管理”,“读者管理”五个功能模块。①用户管理,这个模块对图书管理员的密码进行管理,包括密码管理,注销,退出操作。②图书管理,这个模块的主要功能是对图书管理系统的图书进行管理,包括新图书入库,无用图书岀库,数据库中图书查询等操作。③借阅管理,这个模块的主要功能是对读者进行借书,还书操作。④数据库管理,这个模块的主要功能是对数据库进得备份和恢复操作。⑤读者管理,这个模块的主要功能是新增读者,读者挂失,读者取消挂失操作。二、用户查询管理模块该模块实现读者对图书的查询管理,让读者对所需相关书籍信息的了解,这个模块包括“用户管理”,“图书查阅”,“借还信息”三个功能模块。①用户管理:这个模块对读者的密码进行管理,包括密码管理,注销,退出操作。②图书查阅:这个模块主要完成读者对所需书籍信息的查询,用户可使用书名查询,编号查询,读者还可使用模糊查询。③借述信息:这个模块主要列出读者所借书籍的信息。功能模块如图4.3・1所示: 用户制逢的]iMJF门川Art尚廿用W41-|讣『1|叩肚],"^|5憫”帼书空i:A.勺WKMfril用户粕用出谗耆Mfr.ft取消(|先LIM卜伽询图4.1图书管理系统功能模块图第四节数据库设计数据库是信息管理的基础,其结构直接关系到各种功能的实现和程序运行的效率,进行数据库设计首先必须准确了解与分析用户需求(包括数据与处理)[,0]o根据前面的需求分析,建立了一个名为:Manager的数据库,其中有五个数据表分别为:book(图书信息表),borrowinfo(读者借阅信息表),manager(管理员信息表),user(读者登陆表),userinfo(读者信息表)。图书信息表:此表中记录了图书的所有信息,管理员通过此表对图书进行出库,入库管理,也可通过此表查询某本书的信息,也可对图书进行模糊查询,此表的主键为book_noe其结构如下表所示。 表4.1图书信息表字段名数值类型(长度)是否允许为空说明book_no文本否图书编号book_name文本否图书名press文本是岀版社author文本是作者price数字是价格press_data时间是出版时间is_borrow数字否是否借出读者借阅信息表:此表记录了图书管理系统中读者借阅的书籍,管理员通过此表对图书馆中的借阅情况进行管理,当读者借书时,管理员向表中插入数据,读者还书时,管理员从表中删除记录。此表的主键为user和book_noo其结构如下表所示:表4.2读者借阅信息表字段名数值类型(长度)是否允许为空说明user文本否用户编号book_no文本否图书编号name文本是用户姓名book_name文本是图书名borrow_time时间是借书时间return_time时间是还书时间管理员信息表:此表记录了图书管理员陆登信息,只有符合一定信息的管理员才能登陆管理员系统,对图书管理系统进行维护和读者管理。此表的主键为user。其结构如下表所示:表4.3管理员信息表字段名数值类型(长度)是否允许为空说明user文本否管理员编号password文本否密码读者登陆表:此表记录了读者的登陆信息,只有拥有授权的编号和密码才能登 录读者查询系统,查看记者的借书情况,并可通过编号或名字查询所需书情况。此表的主键为user。其结构如下表所示:表4.4读者登陆表字段名数值类型(长度)是否允许为空说明user文木否用户编号sdept文本是用户专业name文本是用户姓名type文本是用户类型status数字否用户状态第五节本章小节需求分析是决定系统“做什么”,而概要设计是决定“怎么做”O本章是在需求分析的基础上进一步分析图书管理系统的设计原理,区分出不同的功能模块,分析出各功能模块的关联耦合以及明确各功能模块该如何设计。同时,通过需求分析作好数据表的设计,分析岀数据库中各表的关联关系。为后续的详细设计作好理论上的准备。 第五章详细设计与实现通过前面章节的分析与设计,接下来进行系统的详细设计,详细设计的根本目标是确定应该怎样具体地实现所要求的系统,主要任务是设计出程序的“蓝图”,再根据这个蓝图写出实际的程序代码第一节登陆窗体的设计与实现管理员登陆界面、代码设计为了提高系统的安全性,在图书管理系统的管理员登陆界面设置了用户名以及密码。管理员登陆窗体很简单,首先在用户名处输入,用户编号,再对应输入密码,程序将与管理员数据库连接,确认管理员身份,如用户名,密码正确,刚进入系统;否则出现出错提示。界面如下图所示:图5.1管理员登陆界而管理员登陆流程图 IY图5.2管理员登陆流程图登陆核心代码如下strSQL.Format("user」%s‘andpassword=,%s‘mstrUser,mstrPassword);〃进行数据查询的SQL语句user,mstrFi11er=strSQL;user.Requery();if(user.IsEOFO)//查询为空{user.Close();MessageBox("输入有误,重输!〃);m_strUser=〃“;m_strPassword二〃“;m_ctrUser.SetFocus();UpdateData(FALSE); else//有相应的记录存在App->m_strUser=m_strUser;//记录用户user.Close();CDialog::OnOK();[12]第二节图书管理系统主体窗口的设计与实现图书管理系统的主体窗口,是管理员正确登陆后进入的窗口,管理员可以通过不同的功能选择相应的操作,设用相应的窗体,实现对图书管理系统的管理。界面如下图所示:图5.3图书管理系统主体图第三节图书管理模块的设计与实现一、图书管理界面、代码设计 图书管理模块是管理员对图书馆中的图书进行管理,有新书买入后,由管理员对其进入入库操作,当图书信息要从系统中清除,由管理员对其进行出库操作。界面如下图所示:图5・4图书入库不意图、图书出库入库流程图馆i◄ftWK41^——、、功”—f丫Y图5.5图书入库流程图图5.6图书出库流程图 三、图书管理的核心代码如下if(!user.Open())//连接数据库。{McssagcBox(〃数据库连接失败!〃,〃数据库错误〃,MB_OK);return;}strSQL・Format(,,book_no='%s'm_strBooko);//入库时查询是否有相同编号书籍user.m_strFilter=strSQL;user・Requcry();if(!uscr.IsEOFO)//图书编号相同。{user.Close();McssagcBox(〃图书编号已存在!“);m_strBookNo="”;m_ctrBookNo.SctFocus();UpdatcData(FALSE);return;}else{user.AddNcwO;//向数据库是加入新的图书信息。user・mbookno二mstrBookNo;user.m_book_name=m_strBookName;user.m_prcss=m_strBookPrcss;user,mauthor=mstrBookAuthor;user.m_price=m_strBookPrice;user.m_prcss_date=m_strBookTimc;user.m_is_borrow=0;user.Update();user.Close();McssagcBox(z,入库成功!“);CDialog::OnOK();} 第四节图书查询模块的设计与实现一、图书管理界面、代码设计图书查询模块主要是方便管理员对整个图书管理里的书进行查询,管理,同时也方便读者对自己所需图书的信息进行查询。本系统支持编号和书名两种查询方式,由于图书查询大多时候只了解核心词,为满足用户需要木系统支持模糊查询,界面如下图所示阳:x|■岀版社岀版日期图书作者图书价格状态■八图书编号09109103020910910305091091030709109103110910910312091091031309109103190910910320091091032109109103220910910331091091033209109103330910910334091091033909109103400910910341数据结构、算法与应用一一C“语言・・・数据结构实用教程(C/CH描述)数据结构C+薈语亘描述应用标准模板・・・CH类和数据结fil(国外计算机科学经・・・数据结构(用面向对象方法与C“描…数据结构与面向对眾理序设计—CH版数据结构、算法与应用一一CH语言…数据结枚算法与应用一一C州吾言・・・数据结枚算法与应用一一C“语言・・・数据结构、算法与应用一一C“语言・・・数据结构实用教程(c/Uf描述)数据结构妥用教程(C/C*描述)数据结构实用教程(C/CW描述)数据结构实用教程(C/CW描述)数据结构CE吾莒描述应用标准模板…数据结构CE吾言描述应用标准模板…社社社社社社社社社社社社社社社社补版版版版版版版版版版版版版版版版版出岀出岀岀岀岀岀岀岀岀岀出岀岀岀出业业业业业学学学学学学学工大大大大大工工工工大大大大大大犬械华华华华华械械械械华华华华华华华机清清淸清清机机机机消涓清清涓淸洁SartaiS...徐孝飢美濛"…SartajS...SartajS...SartajS...SartajS...徐孝凯徐孝凯徐孝凯""353535元阮元187.535331073元.99元元元元元元远沅远沅元元亓8岀岀阅岀岀阅阅阅阅阅阅阅阅阅阅阅阅>借借借借借借借借借借借借借借借借倍己己可己己可可可可可可可可可可可可确定…取消I图5.7图书管理系统书名模糊查询示意图图书查询流程图图5.8图书查询流程图 图书查询的核心代码如下strSQLL.Format(,z%%%s%%/z,m_strBookNamc);//数据库查询语句strSQL.Format("bookjnamelike'%s'〃,strSQLL);bb.m_strFi1tcr=strSQL;bb・Rcqucry();inttempl=0;m_ctrBoList.SctRedraw(FALSE);if(bb.IsEOFO)//查询结果为空{McssagcBox("查阅失败!","该图书不存在",MB_OK);return;bb.m_book_no);1,2,3,4,5,bb.m_book_namc);bb.m_prcss);bb.m_press_date);bb.m_author);bb.m_pricc);whilc(!bb.IsEOFO)//查询结果非空,刚显示m_ctrBoList.Insertltem(templ,m_ctrBoList.SetltemText(tempi,m_ctrBoList.SetltemText(tempi,m_ctrBoList.SetltemText(tempi,m_ctrBoList.SetltemText(tempi,m_ctrBoList.SetltemText(tempi,if(bb.m_is_borrow==l)m_ctrBoList.SctltcmTcxt(tcmpl,6,〃已借出“);}elsem_ctrBoList.SetltemText(tempi,6,〃可借阅〃);tcmpl++;bb.MoveNext();bb.CloscO; 第五节图书借还模块的设计与实现一、图书管理界面、代码设计在图书管理系统中,管理员通过借还模块,向读者借还图书馆内的书籍,实现对图书馆内的图书管理。其界面如下[⑷:图5.9图书借书示意图二、图书借还流程图3入型同4LIVIK我为F图5.10图书借书流程图图5.11图书还书流程图 三、图书借还的核心代码如下:strSQL.Format(z,book_no='%s'〃,mstrBookNO);//查询图书信息bb.mstrFi11er=strSQL;bb.Requery();bookname=bb.mbookname;//记录图书信息bb.Edit();bb.m_is_borrow=l;bb.Update();bb.Close();br.AcIcINewO;//将图书的状态设置为已借阅//增加新的借阅记录,将信息写入借书信息表中br.m_book_name=bookname;br.mbook_no=m_strBookNO;br.m_user=m_strUser;br.m_name=m_username;br.Update();br.Close();mctrAlList.SetRedraw(FALSE);mctrAlList.DeleteAllItems();mctrAlList.SetRedraw();mctrBoList.DeleteAllItems();mctrBoList.SetRedraw(FALSE);mctrBoList.SetRedraw();mstrBookNO=〃“;MessageBox(〃借阅成功!“);strSQL.Format("user二'%s,气mstrUser);br.mstrFi1ter=strSQL;//从新从数据库中读出信息,以刷新显示br.Requery();mAlread)^=0;mctrAlList.SetRedraw(FALSE);wh订e(!br.IsEOFO)mctrAlList.InsertItem(mAlread)^br.muser); mctrAlList.SetitemText(mAlready,1,br.mname);mctrAlList・SctItemTcxt(mAlready,2,br.mbookno);m_ctrAlList.SetItcmTcxt(m_Alrcad)s3,br.m_book_namc);4,br.mborrowtime);mctrAlList.SctltcmTcxt(mAlready,br.mreturntime);mctrAlList.SetitemText(mAlready,5,m_Alrcad>^++;br.MovcNcxt();第六节读者管理读者管理包括新增读者、读者挂失、读者挂失恢复等功能。管理员通过此模块实现对读者的管理:图5.12读者开户图第七节读者查询系统读者查询系统是方便读者对自己所需资料的查询,以及对自己借阅情况的了解 和密码的管理。查询也分为编号查询,与书名查询。其中编号查询是在知道一本书的确切编号后进行的查询是精确查询,而内容查询是想知道相关的内容,是模糊查询。在读者查询系统屮,所实现的功能包括:查询,密码修改,借阅信息查询等这些功能与管理系统所介绍的功能十分相似,在此就不要重介绍了。第八节本章小结详细设计是在需求分析、概要设计的基础上经过实际的编码开发岀实际的系统。是系统成形的十分重要的一个组成部分。本章较详细的讲述的系统重要功能的演示图,介绍了一些功能的核心代码。 第六章系统测试运行第一节测试的介绍软件测试就是在软件投入运行前,对软件需求分析、设计规格说明和编码的最终复审,是软件质量保证的关键步骤。软件测试是为了发现错误而执行程序的过程。软件测试在软件生存期中横跨两个阶段:通常在编写岀每一个模块之后就对它做必要的测试(称为单元测试)。编码和单元测试属于软件生存期中的同一个阶段。在结束这个阶段后对软件系统还要进行各种综合测试,这是软件生存期的另一个独立阶段,即测试阶段悶。一、软件测试的目的①测试是程序的执行过程,目的在于发现错误;②一个好的测试用例在于发现至今未发现的错误;③一个成功的测试是发现了至尽未发现的错误的测试;二、测试的原则①应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。②测试用例应由测试输入数据和与之对应的预期输出结果两部分组成。③程序员应避免检查自己的程序。(注意不是指对程序的调试)④在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。不合理的输入条件是指异常的,临界的,可能引起问题异变的输入条件。⑤充分注意测试中的群集现象。经验表明,测试后程序残存的错误数目与该程序中以发现的错误数目或检错率成正比。应该对错误群集的程序段进行重点测试。⑥严格执行测试计划,排除测试的随意性。测试计划应包括:所测软件的功能,输入和输岀,测试内容,各项测试的进度安排,资源要求,测试资料,测试工具,测试用例的选择,测试的控制方法和过程,系统的组装方式,跟踪规则,调试规则,以及回归测试的规定等等以及评价标准。⑦应当对每一个测试结果做全面的检查。⑧妥善保存测试计划,测试用例,岀错统计和最终分析报告,为维护提供方便。 三、软件测试步骤测试过程按单元测试、集成测试、确认测试和系统测试及发版测试。开始是单元测试,集屮对用源代码实现的每一个程序单元进行测试,检查各个程序模块是否正确地实现了规定的功能冏。1、单元测试单元测试又称模块测试,是针对软件设计的最小单位一程序模块,进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。单元测试需要从程序的内部结构出发设计测试用例。多个模块可以平行地独立进行单元测试。⑴单元测试的内容在单元测试时,测试者需要依据详细设计说明书和源程序清单,了解该模块的I/O条件和模块的逻辑结构,主要采用口盒测试的测试用例,辅Z以黑盒测试的测试用例,使之对任何合理的输入和不合理的输入,都能鉴别和响应。①错误处理测试出错的描述是否难以理解;出错的描述是否能够对错误定位;显示的错误与实际的错谋是否相符;对错谋条件的处理正确与否;在对错谋进行处理之前,错谋条件是否已经引起系统的干预等②边界测试注意数据流、控制流中刚好等于、大于或小于确定的比较值时出错的可能性。对这些地方要仔细地选择测试用例,认真加以测试。如果对模块运行时间有要求的话,还要专门进行关键路径测试,以确定最坏情况下和平均意义下影响模块运行时间的因素。2、集成测试集成测试把已测试过的模块组装起來,主要对与设计相关的软件体系结构的构造进行测试。确认测试则是要检查已实现的软件是否满足了需求规格说明中确定了的各种需求,以及软件配置是否完全、正确。系统测试把已经经过确认的软件纳入实际运行环境屮,与其它系统成份组合在一起进行测试。根据对软件产品的测试关注点不同,可以将测试方法划分为黑盒测试和白盒测试。1、黑盒测试黑盒测试又称功能测试,数据驱动测试或基于规格说明的测试。它测试的依据是程序的外部特性。因此,黑盒测试是从用户观点出发的测试。这一方法的主要缺点是它依赖于规格说明书的正确性。 实施黑盒测试的方法又有基于图的测试、等价类划分和边界值分析等方法。2、白盒测试口盒测试又称结构测试,逻辑驱动测试或基于程序的测试。在口盒测试中,依据由弱到强的覆盖准则,最常见的测试方法有:语句覆盖、分支覆盖或判定覆盖、条件覆盖、判定/条件覆盖黑盒测试是依据程序的外部特性进行的测试,它完全不涉及到程序的内部结构,如果外部特性本身有问题或规格说明有课,用黑盒测试则发现不了。另一方而口盒测试完全相反,它只依据程序的内部结构进行测试,而不考虑外部特性,如果程序本身有问题,如程序逻辑有错误,或有遗漏,则无法发现。第二节测试概要、图书管理系统功能分解表6.1图书管理系统功能表登陆图书管理图书查询管理员登陆登户用陆图书入库图书出库按编号查询按名字查询由管理员输入用户名,密码调用数据库进行验证由用户输入用户名,密码调用数据库进行验证由管理员输入图书的基本信息存入数据库由管理员输入图书编号,将图书信息从数据库中删除用用户输入图书的编号从系统中进行查询由用户输入所需图书关键字进行查询挂失开户借还管理由用户申请,由管理员对用户进行挂失或取消挂失操作由管理员输入用户的信息,将用户用户信息存入数据库中借书管理还书管理由管理员输入用户编号,图书编号,写入数据库中,借出图书由管理员输入图书编号,删除数据表中的借阅记录数据库管理修改密码 可以管理员对数据库进行数据备份和数据恢复由用户输入新的密码,修改数据表中的信息二、测试内容1、功能测试按照功能表对图书管理系统进行一步一步地测试,测试的主要目的是发现实现和预期岀现不符合的部分。在发现不符的情况下,按照序号记录发生的问题,问题的概要,发生的条件和推断导致问题的原因。同上一步的过程一样,对读者查询系统进行测试。然后,将管理员管理系统和读者查询系统统一起进行测试,看同时运行是否出现不良情况,同样记录问题。在整合完毕后将所得的信息牛成报告书。2、运行时间测试测试毎步操作及实现其功能所需要的时间。需要重复进行,确保由于时间延误导致的失败尽可能少。假如时间延误达到一定阀值,将其作为一个错误记录下来。3、数据库操作测试对数据库删除,写入,修改的操作,测试数据越界后系统是否出现隐藏错误,以进一步测试系统的稳定性,抗干扰性为目的。4、错误测试由于用户有意或无意的错误输入不可避免,系统应在用户输入错误后给出相应的错误提示,而不应该出现假死机现象,影响用户的进一步操作。木测试将测试图书管理系统具体测试举例在下文将会有所提及。同时我们应尽量去减少用户的不小心输入错误,系统应在易岀错的地方,给出相应的提示,使系统的可操作性更强,提高用户的效率和增强用户对木系统的信心。第三节测试用例一、功能测试设定系统的输入值,测试系统的输出值是否与期望值相符合。在WindowsXP系统上运行系统并釆用微软公司的ACCESS数据库存储数据,在此基础上对系统功能进行测试。测试系统所需实现的慕本功能,根据需求文档的要求设计测试用。测试用例如下: 1、用户登陆部分:输入:帐户,密码(分三组输入,包括正确组,密码错误组,账号错误组)预期结果:正确组:系统正确登陆,系统可正常运行。密码错误组:系统给岀帐户或密码错误提示。账号错误组:系统给出帐户或密码错误提示。2、入库部分:输入:入库图书编号,书名,作者等图书信息(分三组输入,包括正确组,不输入图书编号,输入图书编号系统已存在)预期结果:正确组:系统给出入库成功提示。不输入图书编号:系统提示图书编号不能为空。输入图书编号系统已存在:系统提示图书编号存在。3、出库部分:输入:出库图书编号(分三组输入,包括正确组,不输入图书编号,输入图书编号系统有存在)预期结果:正确组:系统给出出库成功提示。不输入图书编号:系统提示图书编号不能为空。输入图书编号系统有存在:系统提示该图书不存在。4、查询部分:本部分为系统内部操作,看返回结果与数据库内容是否相否即可。5、数据库管理:本部分为系统内部操作,看数库备恢复后与备份前是否相同即可。6、修改密码部分:输入:新密码两次(分两组,包括正确组,两组密码不一致)预期结果:正确组:系统给出密码修改成功提示两组密码不一致:系统给出两次密码输入不一致提示7、开户部分:输入:用户的基本信息,用户编号号,密码等(分组四输入,包括正确组,用户编号与已有编号重复组,两次密码输入不一致组,用户编号为空组)预期结果:正确组:系统给岀开户成功提示用户编号与已有编号重复组:系统给出该编号已存在提示。两组密码不一致:系统给出两次密码输入不一致提示。用户名为空:系统给出开户名不为空提示。 8>挂失部分:输入:用户编号(分二组,包括正确组,用户编号错误组)预期结果:正确组:系统给岀挂失成功提示用户编号错误组:系统给出该用户不存在提示9、借书部分:输入:用户编号,图书编号(分三组,包括正确组,用户编号错误组,图书已借组)预期结果:正确组:系统给出借书成功提示用户编号错误组:系统给岀该用户不存在提示图书已借组:系统给出图书已借出提示10、还书部分:输入:图书编号(分三组,包括正确组,图书编号不存在组,图书末借出组)预期结果:正确组:系统给出还书成功提示图书编号不存在组:系统给出该书末借出提示图书末借出组:系统给出该书末借出提示二、运行时间测试首先可以通过多次重复进行测试,人工估计时间问题。在发现问题的情况下,进行精化测试,如下:请测试人员在程序的相应部位加入这个函数,测试相应的操作花费的时间,输入相应的操作,运行程序在显示屏上输出对应的时间,然后记录下问题时间,分析可能存在的问题和引起问题的原因。三、数据库操作测试通过应用程序对数据库进行添加,删除,修改的操作,查看数据库内部数据与系统操作是否同步。以检查数据数据库的一致性错误测试通过模仿用户的习惯输入一些用户无意中输入的数据,女山用户不小心碰到退出系统按钮,系统应给出提示,问用户是否退出系统,以增强系统的可操作性.系统突然关机,数据库修改未完成,数据库应恢复修改前状态。 第四节测试结果及基本功能、系统测试结果汇总把本项测试中实际得到的动态输出(包括内部生成数据输出)结果同对于动态输出的要求进行比较,陈述其中的齐项发现。表5.2图书管理系统测试结果表输入数据预期输出结果运行输出结果结果正常是否正常测试输入数据读者查询管理1用户登陆登陆成功登陆成功V2编号查询显示编号查询结果编号查询成功V3书名查询显示书名查询结果查询成功V4借阅信息显示借阅信息显示借阅信息5修改密码密码修成功密码修成功6退出系统系统退出系统退出成功V管理员管理系统1管理员登陆登陆成功登陆成功V2图书出库出库成功出库成功V3图书入库图书入库图书入库4查询查询成功查询成功V5借书借书成功借书成功6还书还书成功还书成功7修改密码密码修成功密码修成功V8开户开户成功数据库写入V9挂失挂失成功挂失成功10退出系统系统退出系统退出成功V导致反常输入数据管理员管理系统1开户:某项留空提示输入不能为空提示输入不能为空V2开户:用户名重复提示该用户己被注册提示该用户已被注册V3开户:两次密码不一致提示密码不一致捉示密码不一致V4查询:输入为空提示输入不能为空提示输入不能为空5登陆:某项留空提示输入不能为空提示输入不能为空V6登陆:密码错误提示用八名或密码不对提示用户名或密码不对V7挂失:用户编号错误提示用户不存在提示用户不存在8修改密码:两组密码不一致提示两次密码不一致提示两次密码不一致V9出库:图书编号不存在提示该图书不存在提示该图书不存在V10入库:图书编号存在提示该图书编号存在提示该图书编号存在V 11借书:用户不存在提示用户不存在提示用户不存在V12借书:图书已借出提示该图书已借出提示该图书已借出V13还书:该图书编号不存在提示该图书末借出提示该图书末借岀14还书:该图书编号末借出提示该图书末借出提示该图书末借出V用户查询系统1登陆:某项留空提示输入不能为空提示输入不能为空V2登陆:密码错误提示用户名或密码不对提示用户名或密码不对V3登陆:用户已挂失提示用户已挂失与管理员联系提示用户已挂失与管理员联系4修改密码:两组密码不一致提示两次密码不一致提示两次密码不一致V5查询:输入为空提示输入不能为空提示输入不能为空J二、具有的基本功能1、读者查询系统:①用户登陆能过输入帐号,密码实现用户的认证,进得登陆。②查询:用户可以通过编号或者关键字进行查询所需图书的基本信息③借阅信息:用户点击以前看当前借书情况。④修改密码部分:通过用户重新输入两次密码进行密码修改。2、管理员管理系统:①管理员登陆能过输入帐号,密码实现用户的认证,进得登陆。②查询:管理员可以通过编号或者关键字进行查询所需图书的基本信息③图书入库:管理员输入图书信息,使新书入库。④图书岀库:管理员输入图书编号,以清除不需要的书籍。⑤借书管理:管理员向读者借出图书。⑥还书管理:读者通过管理员将图书还回图书馆。⑦数据库备份/恢复;管理员可对数据库进行备份/恢复。⑧修改密码:通过用户重新输入两次密码进行密码修改。⑨开户:管理员向系统内新增读者。⑩挂失/取消挂失:管理员根据用户的申请,对用户挂失/取消挂失。第五节本章小结测试是项目开发的一个重要环节,是项目质量的重要保证,也是客户接受的依 据。本章详细的介绍了图书管理系统的测试过程,包括测试用例与测试结果,指出的系统实现的主要功能。参考文献[1]康桂颖•高校图书馆如何规划与设计管理信息系统[J]•情报科学,2003(3)・[2]CSDN社区中心[EB/0L].http://community,csdn.net/.[3]崔俊杰.我要学习MicrosoftACCESS数据库.承德民族职业技术学院学报,2004(2)・[4]康鸿,李向军,段隆振.ODBC数据源在客户机上的自动配置.南昌大学学报(工科版),2003(1)・[5]张海藩.软件工程导论[M]・北京:清华大学出版社,2003.[6]萨师煩,王珊.数据库系统概论[M]・北京:高校教育出版社,2000.[7][美]RogerS.Pressman.SoftwareEnginecring:APractitioner'sApproach(sixthEdition).北京:机械工业出版社.2005[8]张湘辉.软件开发的过程与管理[M]・北京:清华大学出版社2004[9]李闵溟,吴继刚,周学明.VisualC++数据库开发实例对导航[M]・北京:人民邮电出版社,2002.[10]李俊民,高春燕等.Access数据库开发实例解析.机械工业出版社,2006.[11]袁丁等.VisualC++精彩实例详解[M]・北京:机械工业出版社,2004.[12]孙鑫.VC++深入详解[M]・北京:电子工业出版社,2006.[13]JohnE.Swankc,前导工作室译.VisualC++MFC扩展编程实例.北京:机械工业出版社,2000.[14][美]JeffProsisc・ProgrammingWindowsWithMFC.北京:机械工业出版社,2005.[15][美]RonPatton.SoftwareTesting(2ndEdition)[M].北京:机械工业出版社,2005.[16]佟伟光.软件测试技术[M]・北京:人民邮电出版社,2005.一、英文全文:ObjectlandscapesandlifetimesTechnically,OOPisjustaboutabstractdatatyping,inheritance,andpolymorphism,butotherissuescanbeatleastasimportant.Theremainderofthissectionwillcovertheseissues. Oneofthemostimportantfactorsisthewayobjectsarecreatedanddestroyed.Whereisthedataforanobjectandhowisthelifetimeoftheobjectcontrolled?Therearedifferentphilosophiesatworkhere.C++takestheapproachthatcontrolofefficiencyisthemostimportantissue,soitgivestheprogrammerachoice.Formaximumrun-timespeed,thestorageandlifetimecanbedeterminedwhiletheprogramisbeingwritten,byplacingtheobjectsonthestack(thesearesometimescalledautomaticorscopedvariables)orinthestaticstoragearea.Thisplacesapriorityonthespeedofstorageallocationandrelease,andcontrolofthesecanbeveryvaluableinsomesituations.However,yousacrificeflexibilitybecauseyoumustknowtheexactquantity,lifetime,andtypeofobjectswhileyouTewritingtheprogram.Ifyouaretryingtosolveamoregeneralproblemsuchascomputer-aideddesign,warehousemanagement,orair-trafficcontrol,thisistoorestrictive.Thesecondapproachistocreateobjectsdynamicallyinapoolofmemorycalledtheheap.Inthisapproach,youdon'tknowuntilrun-timehowmanyobjectsyouneed,whattheirlifetimeis,orwhattheirexacttypeis.Thosearedeterminedatthespurofthemomentwhiletheprogramisrunning.Ifyouneedanewobject,yousimplymakeitontheheapatthepointthatyouneedit.Becausethestorageismanageddynamically,at run-time,theamountoftimerequiredtoallocatestorageontheheapissignificantlylongerthanthetimetocreatestorageonthestack.(Creatingstorageonthestackisoftenasingleassemblyinstructiontomovethestackpointerdown,andanothertomoveitbackup.)Thedynamicapproachmakesthegenerallylogicalassumptionthatobjectstendtobecomplicated,sotheextraoverheadoffindingstorageandreleasingthatstoragewillnothaveanimportantimpactonthecreationofanobject.Inaddition,thegreaterflexibilityisessentialtosolvethegeneralprogrammingproblem.Javausesthesecondapproach,exclusively1.Everytimeyouwanttocreateanobject,youusethenewkeywordtobuildadynamicinstanceofthatobject.There'sanotherissue,however,andthat'sthelifetimeofanobject.Withlanguagesthatallowobjectstobecreatedonthestack,thecompilerdetermineshowlongtheobjectlastsandcanautomaticallydestroyit.However,ifyoucreateitontheheapthecompilerhasnoknowledgeofitslifetime.InalanguagelikeC++,youmustdetermineprogrammaticallywhentodestroytheobject,whichcanleadtomemoryleaksifyoudoiftdoitcorrectly(andthisisacommonprobleminC++programs).Javaprovidesafeaturecalledagarbagecollectorthatautomaticallydiscoverswhenanobjectisnolongerinuseanddestroysi匸Agarbagecollectorismuchmoreconvenientbecauseitreducesthenumberofissuesthatyoumusttrackandthecodeyoumustwrite.Moreimportant,thegarbagecollectorprovidesamuchhigherlevelofinsuranceagainsttheinsidiousproblemofmemoryleaks(whichhasbroughtmanyaC++projecttoitsknees).Therestofthissectionlooksatadditionalfactorsconcerningobjectlifetimesandlandscapes.1CollectionsanditeratorsIfyoudoiftknowhowmanyobjectsyouregoingtoneedtosolveaparticularproblem,orhowlongtheywilllast,youalsodorftknowhowtostorethoseobjects.Howcanyouknowhowmuchspacetocreateforthoseobjects?Youcan't,sincethatinformationisn'tknownuntilrun-time.Thesolutiontomostproblemsinobject-orienteddesignseemsflippant:youcreateanothertypeofobject.Thenewtypeofobjectthatsolvesthisparticularproblemholdsreferencestootherobjects.Ofcourse,youcandothesamethingwithanarray,whichisavailableinmostlanguages.Butthere?smore.Thisnewobject,generallycalledacontainer(alsocalledacollection,buttheJavalibraryusesthatterminadifferentsensesothisbookwilluse"containeFlwillexpanditselfwhenevernecessarytoaccommodateeverythingyou placeinsidei匸Soyoudorftneedtoknowhowmanyobjectsyouregoingtoholdinacontainer.Justcreateacontainerobjectandletittakecareofthedetails.Fortunately,agoodOOPlanguagecomeswithasetofcontainersaspartofthepackage.InC++,it^spartoftheStandardC++LibraryandissometimescalledtheStandardTemplateLibrary(STL).ObjectPascalhascontainersinitsVisualComponentLibrary(VCL).Smalltalkhasaverycompletesetofcontainers.Javaalsohascontainersinitsstandardlibrary.Insomelibraries,agenericcontainerisconsideredgoodenoughforallneeds,andinothers(Java,forexample)thelibraryhasdifferenttypesofcontainersfordifferentneeds:avector(calledanArrayListinJava)forconsistentaccesstoallelements,andalinkedlistforconsistentinsertionatallelements,forexample,soyoucanchoosetheparticulartypethatfitsyourneeds.Containerlibrariesmayalsoincludesets,queues,hashtables,trees,stacks,etc.Allcontainershavesomewaytoputthingsinandgetthingsout;thereareusuallyfunctionstoaddelementstoacontainer,andotherstofetchthoseelementsbackout.Butfetchingelementscanbemoreproblematic,becauseasingle-selectionfunctionisrestrictive.Whatifyouwanttomanipulateorcompareasetofelementsinthecontainerinsteadofjustone?Thesolutionisaniterator,whichisanobjectwhosejobistoselecttheelementswithinacontainerandpresentthemtotheuseroftheiterator.Asaclass,italsoprovidesalevelofabstraction.Thisabstractioncanbeusedtoseparatethedetailsofthecontainerfromthecodethat'saccessingthatcontainer.Thecontainer,viatheiterator,isabstractedtobesimplyasequence.Theiteratorallowsyoutotraversethatsequencewithoutwonyingabouttheunderlyingstructure一thatis,whetherit^sanArrayList,aLinkedList,aStack,orsomethingelse.Thisgivesyoutheflexibilitytoeasilychangetheunderlyingdatastructurewithoutdisturbingthecodeinyourprogram.Javabegan(inversion1.0and1.1)withastandarditerator,calledEnumeration,forallofitscontainerclasses.Java2hasaddedamuchmorecompletecontainerlibrarythatcontainsaniteratorcalledIteratorthatdoesmorethantheolderEnumeration.Fromadesignstandpoint,allyoureallywantisasequencethatcanbemanipulatedtosolveyourproblem.Ifasingletypeofsequencesatisfiedallofyourneeds,therebenoreasontohavedifferentkinds.Therearetworeasonsthatyouneedachoiceofcontainers.First,containersprovidedifferenttypesofinterfacesandexternalbehavior.Astackhasadifferentinterfaceandbehaviorthanthatofaqueue,whichisdifferentfromthatofasetoralist. Oneofthesemightprovideamoreflexiblesolutiontoyourproblemthantheother.Second,differentcontainershavedifferentefficienciesforcertainoperations.ThebestexampleisanArrayListandaLinkedLis匚Botharesimplesequencesthatcanhaveidenticalinterfacesandexternalbehaviors.Butcertainoperationscanhaveradicallydifferentcosts.RandomlyaccessingelementsinanArrayListisaconstant-timeoperation;ittakesthesameamountoftimeregardlessoftheelementyouselect.However,inaLinkedListitisexpensivetomovethroughthelisttorandomlyselectanelement,andittakeslongertofindanelementthatisfurtherdownthelist.Ontheotherhand,ifyouwanttoinsertanelementinthemiddleofasequence,it'smuchcheaperinaLinkedListthaninanArrayList.Theseandotheroperationshavedifferentefficienciesdependingontheunderlyingstructureofthesequence.Inthedesignphase,youmightstartwithaLinkedListand,whentuningforperformance,changetoanAiTayList.Becauseoftheabstractionviaiterators,youcanchangefromonetotheotherwithminimalimpactonyourcode.Intheend,rememberthatacontainerisonlyastoragecabinettoputobjectsin.Ifthatcabinetsolvesallofyourneeds,itdoesn^treallymatterhowitisimplemented(abasicconceptwithmosttypesofobjects).Ifyoureworkinginaprogrammingenvironmentthathasbuilt-inoverheadduetootherfactors,thenthecostdifferencebetweenanArrayListandaLinkedListmightnotmatter.Youmightneedonlyonetypeofsequence.Youcanevenimaginethe"perfectcontainerabstraction,whichcanautomaticallychangeitsunderlyingimplementationaccordingtothewayitisused.1ThesinglyrootedhierarchyOneoftheissuesinOOPthathasbecomeespeciallyprominentsincetheintroductionofC++iswhetherallclassesshouldultimatelybeinheritedfromasinglebaseclass.InJava(aswithvirtuallyallotherOOPlanguages)theansweris"yes,'andthenameofthisultimatebaseclassissimplyObject.Itturnsoutthatthebenefitsofthesinglyrootedhierarchyaremany.Allobjectsinasinglyrootedhierarchyhaveaninterfaceincommon,sotheyareallultimatelythesametype.Thealternative(providedbyC++)isthatyoudon^tknowthateverythingisthesamefundamentaltype.Fromabackward-compatibilitystandpointthisfitsthemodelofCbetterandcanbethoughtofaslessrestrictive,butwhenyouwanttodofull-onobject-orientedprogrammingyoumustthenbuildyourownhierarchytoprovidethesameconveniencethat9sbuiltintootherOOPlanguages.Andinanynewclasslibraryyouacquire,someotherincompatibleinterfacewillbeused.Itrequireseffort(andpossibly multipleinheritance)toworkthenewinterfaceintoyourdesign.Istheextra"flexibility^ofC++worthit?Ifyouneedit一ifyouhavealargeinvestmentinC一it'squitevaluable.Ifyou9restartingfromscratch,otheralternativessuchasJavacanoftenbemoreproductive.Allobjectsinasinglyrootedhierarchy(suchasJavaprovides)canbeguaranteedtohavecertainfunctionality.Youknowyoucanperformcertainbasicoperationsoneveryobjectinyoursystem.Asinglyrootedhierarchy,alongwithcreatingallobjectsontheheap,greatlysimplifiesargumentpassing(oneofthemorecomplextopicsinC++).Asinglyrootedhierarchymakesitmucheasiertoimplementagarbagecollector(whichisconvenientlybuiltintoJava).Thenecessarysupportcanbeinstalledinthebaseclass,andthegarbagecollectorcanthussendtheappropriatemessagestoeveryobjectinthesystem.Withoutasinglyrootedhierarchyandasystemtomanipulateanobjectviaareference,itisdifficulttoimplementagarbagecollector.Sincerun-timetypeinformationisguaranteedtobeinallobjects,you'11neverendupwithanobjectwhosetypeyoucannotdetermine.Thisisespeciallyimportantwithsystemleveloperations,suchasexceptionhandling,andtoallowgreaterflexibilityinprogramming.1CollectionlibrariesandsupportforeasycollectionuseBecauseacontainerisatoolthatyouTlusefrequently,itmakessensetohavealibraryofcontainersthatarebuiltinareusablefashion,soyoucantakeoneofftheshelfBecauseacontainerisatoolthatyou'llusefrequently,itmakessensetohavealibraryofcontainersthatarebuiltinareusablefashion,soyoucantakeoneofftheshelfandplug让intoyourprogram.Javaprovidessuchalibrary,whichshouldsatisfymostneeds.Downcastingvs.templates/genericsTomakethesecontainersreusable,theyholdtheoneuniversaltypeinJavathatwaspreviouslymentioned:Object.ThesinglyrootedhierarchymeansthateverythingisanObject,soacontainerthatholdsObjectscanholdanything.Thismakescontainerseasytoreuse.Tousesuchacontainer,yousimplyaddobjectreferencestoit,andlateraskforthemback.But,sincethecontainerholdsonlyObjects,whenyouaddyourobjectreferenceintothecontaineritisupcasttoObject,thuslosingitsidentity.Whenyoufetchitback,yougetanObjectreference,andnotareferencetothetypethatyouputin.Sohowdoyouturnitbackintosomethingthathastheusefulinterfaceoftheobjectthatyouputintothecontainer? Here,thecastisusedagain,butthistimeyou^renotcastinguptheinheritancehierarchytoamoregeneraltype,youcastdownthehierarchytoamorespecifictype.Thismannerofcastingiscalleddowncasting.Withupcasting,youknow,forexample,thataCircleisatypeofShapesoit9ssafetoupcast,butyoudon'tknowthatanObjectisnecessarilyaCircleoraShapesoit'shardlysafetodowncastunlessyouknowthat^swhatyou'redealingwith.It^snotcompletelydangerous,however,becauseifyoudowncasttothewrongthingyouTlgetarun-timeerrorcalledanexception,whichwillbedescribedshortly.Whenyoufetchobjectreferencesfromacontainer,though,youmusthavesomewaytorememberexactlywhattheyaresoyoucanperformaproperdowncast.Downcastingandtherun-timechecksrequireextratimefortherunningprogram,andextraeffortfromtheprogrammer.WouldrTtitmakesensetosomehowcreatethecontainersothatitknowsthetypesthatitholds,eliminatingtheneedforthedowncastandapossiblemistake?Thesolutionisparameterizedtypes,whichareclassesthatthecompilercanautomaticallycustomizetoworkwithparticulartypes.Forexample,withaparameterizedcontainer,thecompilercouldcustomizethatcontainersothatitwouldacceptonlyShapesandfetchonlyShapes.ParameterizedtypesareanimportantpartofC++,partlybecauseC++hasnosinglyrootedhierarchy.InC++,thekeywordthatimplementsparameterizedtypesis"template?"Javacurrentlyhasnoparameterizedtypessinceitispossibleforittogetby一howeverawkwardly一usingthesinglyrootedhierarchy.However,acurrentproposalforparameterizedtypesusesasyntaxthatisstrikinglysimilartoC++templates.二、英文翻译:对象的创建和存在时间从技术角度说,OOP(面向对象程序设计)只是涉及抽彖的数据类型、继承以及多形性,但另一些问题也可能显得非常重要。本节将就这些问题进行探讨。最重要的问题Z—是对象的创建及破坏方式。对彖需要的数据位于哪儿,如何控制对象的“存在时间”呢?针对这个问题,解决的方案是各异其趣的。C++认为程序的执行效率是最重要的一个问题,所以它允许程序员作出选择。为获得最快的运行速度,存储以及存在时间可在编写程序时决定,只需将对彖放置在堆栈(有时也 叫作自动或定域变量)或者静态存储区域即可。这样便为存储空间的分配和释放提供了一个优先级。某些情况下,这种优先级的控制是非常有价值的。然而,我们同时也牺牲了灵活性,因为在编写程序时,必须知道对彖的准确的数量、存在时间、以及类型。如果要解决的是一个较常规的问题,如计算机辅助设计、仓储管理或者空中交通控制,这一方法就显得太局限了。第二个方法是在一个内存池中动态创建对彖,该内存池亦叫“堆”或者“内存堆”。若采用这种方式,除非进入运行期,否则根本不知道到底需要多少个对象,也不知道它们的存在时间有多长,以及准确的类型是什么。这些参数都在程序正式运行时才决定的。若需一个新对彖,只需在需要它的时候在内存堆里简单地创建它即可。由于存储空间的管理是运行期间动态进行的,所以在内存堆里分配存储空间的时间比在堆栈里创建的时间长得多(在堆栈里创建存储空间一般只需要一个简单的指令,将堆栈指针向下或向下移动即可)。由于动态创建方法使对彖本来就倾向于复杂,所以查找存储空间以及释放它所需的额外开销不会为对象的创建造成明显的影响。除此以外,更大的灵活性对于常规编程问题的解决是至关重要的。C++允许我们决定是在写程序时创建对彖,还是在运行期间创建,这种控制方法 更加灵活。大家或许认为既然它如此灵活,那么无论如何都应在内存堆里创建对彖,而不是在堆栈中创建。但还要考虑另外一个问题,亦即对彖的“存在时间”或者“生存时间”(Lifctime)o若在堆栈或者静态存储空间里创建一个对象,编译器会判断对彖的持续时间有多长,到时会自动“破坏”或者“清除”它。程序员可用两种方法来破坏一个对彖:用程序化的方式决定何时破坏对象,或者利用由运行环境提供的一种“垃圾收集器”特性,自动寻找那些不再使用的对象,并将其清除。当然,垃圾收集器显得方便得多,但要求所有应用程序都必须容忍垃圾收集器的存在,并能默许随垃圾收集带來的额外开销。但这并不符合C++语言的设计宗旨,所以未能包括到C++里。但Java确实提供了一个垃圾收集器(Smalltalk也有这样的设计;尽管Delphi默认为没有垃圾收集器,但可选择安装;而C++亦可使用一些由其他公司开发的垃圾收集产品)。本节剩下的部分将讨论操纵对象时要考虑的另一些因素。1集合与继承器针对一个特定问题的解决,如果事先不知道需要多少个对象,或者它们的持续时间有多长,那么也不知道如何保存那些对象。既然如此,怎样才能知道那些对象要求多少空间呢?事先上根本无法提前知道,除非进入运行期。在面向对象的设计中,大多数问题的解决办法似乎都有些轻率一一只是简单地创建另一种类型的对象。用于解决特定问题的新型对象容纳了指向其他对象的句柄。当然,也可以用数组来做同样的事情,那是大多数语言都具有的一种功能。但不能只看到这一点。这种新对象通常叫作“集合”(亦叫作一个“容器”,但AWT在不同的场合应用了这个术语,所以本书将一直沿用“集合”的称呼。在需要的时候,集合会自动扩充自己,以便适应我们在其中置入的任何东西。所以我们事先不必知道要在一个集合里容下多少东四。只需创建一个集合,以后的工作让它自己负责好To幸运的是,设计优良的OOP语言都配套提供了一系列集合。在C++中,它们是以“标准模板库”(STL)的形式提供的oObjectPascal用自己的“可视组件库”(VCL)提供集合。Smalltalk提供了一套非常完整的集合。而Java也用自己的标准库提供了集合。在某些库中,一个常规集合便可满足人们的大多数要求;而在另一些库中(特别是C++的库),则面向不同的需求提供了不同类型的集合。例如,可以用一个矢量统一对所有元素的访问方式;一个链接列表则用于保证所有元素的插入统一。所以我们能根据自己的需要选择适当的类型。其中包括集、队列、散列表、树、堆栈等等。所有集合都提供了相应的读写功能。将某样东西置入集合时,采用的方式是十分明显的。有一个叫作“推”(Push)、“添加”(Add)或其他类似名字的函数用 于做这件事情。但将数据从集合中取出的时候,方式却并不总是那么明显。如果是一个数组形式的实体,比如一个矢量(Vector),那么也许能用索引运算符或函数。但在许多情况下,这样做往往会无功而返。此外,单选定函数的功能是非常有限的。如果想对集合中的一系列元素进行操纵或比较,而不是仅仅而向一个,这时又该怎么办呢?办法就是使用一个“继续器”(Iterator),它属于一种对象,负责选择集合内的元素,并把它们提供给继承器的用户。作为一个类,它也提供了一级抽象。利用这一级抽象,可将集合细节与用于访问那个集合的代码隔离开。通过继承器的作用,集合被抽彖成一个简单的序列。继承器允许我们遍历那个序列,同时毋需关心基础结构是什么一一换言之,不管它是一个矢量、一个链接列表、一个堆栈,还是其他什么东西。这样一来,我们就可以灵活地改变基础数据,不会对程序里的代码造成干扰。J3V3最开始(在1.0和1.1版屮)提供的是一个标准继承器,名为Enumeration(枚举),为它的所有集合类提供服务。Java1.2新增一个更复杂的集合库,其中包含了一个名为Iterator的继承器,可以做比老式的Enumeration更多的事情。从设计角度出发,我们需要的是一个全功能的序列。通过对它的操纵,应该能解决自己的问题。如果一种类型的序列即可满足我们的所有要求,那么完全没有必要再换用不同的类型。有两方而的原因促使我们需要对集合作出选择。首先,集合提供了不同的接口类型以及外部行为。堆栈的接口与行为与队列的不同,而队列的接口与行为又与一个集(Set)或列表的不同。利用这个特征,我们解决问题时便有更大的灵活性。其次,不同的集合在进行特定操作时往往有不同的效率。最好的例子便是矢量(Vector)和列表(List)的区别。它们都属于简单的序列,拥有完全一致的接口和外部行为。但在执行一些特定的任务时,需要的开销却是完全不同的。对矢量内的元素进行的随机访问(存取)是一种常时操作;无论我们选择的选择是什么,需要的时间量都是相同的。但在一个链接列表中,若想到处移动,并随机挑选一个元素,就需付出“惨重”的代价。而且假设某个元素位于列表较远的地方,找到它所需的时间也会长许多。但在另一方面,如果想在序列屮部插入一个元素,用列表就比用矢量划算得多。这些以及其他操作都有不同的执行效率,具体取决于序列的基础结构是什么。在设计阶段,我们可以先从一个列表开始。最后调整性能的时候,再根据情况把它换成矢量。由于抽象是通过继承器进行的,所以能在两者方便地切换,对代码的影响则显得微不足道。最后,记住集合只是一个用来放置对象的储藏所。如果那个储藏所能满足我们的所有需要,就完全没必要关心它具体是如何实现的(这是大多数类型对彖的一个基本概念)。如果在一个编程环境中工作,它由于其他因素(比如在Windows下运行,或者由垃圾收集器带来了开销)产生了内在的开销,那么矢量和链接列表之间在系统开销上的差异就或许不是一个大问题。我们可能只需要一种类型的序列。甚至可 以想象有一个“完美”的集合抽象,它能根据自己的使用方式自动改变基层的实现方式。2单根结构在面向对象的程序设计中,由于C++的引入而显得尤为突出的一个问题是:所有类最终是否都应从单独一个基础类继承。在Java中(与其他儿乎所有OOP语言一样),对这个问题的答案都是肯定的,而且这个终级基础类的名字很简单,就是一个“Object”o这种“单根结构”具有许多方面的优点。单根结构中的所有对象都有一个通用接口,所以它们最终都属于相同的类型。另一种方案(就象C++那样)是我们不能保证所有东四都属于相同的基本类型。从向后兼容的角度看,这一方案可与c模型更好地配合,而且可以认为它的限制更少一些。但假期我们想进行纯粹的面向对象编程,那么必须构建自己的结构,以期获得与内建到其他OOP语言里的同样的便利。需添加我们要用到的各种新类库,还要使用另一些不兼容的接口。理所当然地,这也需要付出额外的精力使新接口与自己的设计方案配合(可能还需要多重继承)。为得到C++额外的“灵活性”,付出这样的代价值得吗?当然,如果真的需要一一如果早已是C专家,如果对C有难舍的情结一一那么就真的很值得。但假如你是一名新手,首次接触这类设计,象Java那样的替换方案也许会更省事一些。单根结构中的所有对象(比如所有Java对象)都可以保证拥有一些特定的功能。在自己的系统中,我们知道对每个对象都能进行一些基本操作。一个单根结构,加上所有对象都在内存堆中创建,可以极大简化参数的传递(这在C++里是一个复杂的概念)。利用单根结构,我们可以更方便地实现一个垃圾收集器。与此有关的必要支持可安装于基础类中,而垃圾收集器可将适当的消息发给系统内的任何对象。如果没有这种单根结构,而且系统通过一个句柄来操纵对象,那么实现垃圾收集器的途径会有很大的不同,而且会面临许多障碍。由于运行期的类型信息肯定存在于所有对象中,所以永远不会遇到判断不出一个对象的类型的情况。这对系统级的操作来说显得特别重要,比如违例控制;而且也能在程序设计时获得更大的灵活性。3集合库与方便使用集合由于集合是我们经常都要用到的一种工具,所以一个集合库是十分必要的,它应该可以方便地重复使用。这样一来,我们就可以方便地取用各种集合,将其插入自己的程序。Java提供了这样的一个库,尽管它在Javd1.0和1・1中都显得非常有限(Java1・2的集合库则无疑是一个杰作)。 下溯造型与模板/通用性为了使这些集合能够重复使用,或者“再生”,Java提供了一种通用类型,以前曾把它叫作“Object”o单根结构意味着、所有东西归根结底都是一个对象”!所以容纳了Object的一个集合实际可以容纳任何东西。这使我们对它的重复使用变得非常简便。为使用这样的一个集合,只需添加指向它的对象句柄即可,以后可以通过句柄重新使用对象。但由于集合只能容纳Object,所以在我们向集合里添加对象句柄时,它会上溯造型成Object,这样便丢失了它的身份或者标识信息。再次使用它的时候,会得到一个Object句柄,而非指向我们早先置入的那个类型的句柄。所以怎样才能归还它的木来面貌,调用早先置入集合的那个对象的有用接口呢?在这里,我们再次用到了造型(Cast)o但这一次不是在分级结构中上溯造型成一种更“通用”的类型。而是下溯造型成一种更“特殊”的类型。这种造型方法叫作“下溯造型”(Downcasting)0举个例子来说,我们知道在上溯造型的时候,Circle(圆)属于Shape(儿何形状)的一种类型,所以上溯造型是安全的。但我们不知道一个Object到底是Circle还是Shape,所以很难保证下溯造型的安全进行,除非确切地知道自己要操作的是什么。但这也不是绝对危险的,因为假如下溯造型成错误的东西,会得到我们称为“违例”(Exception)的一种运行期错误。我们稍后即会对此进行解释。但在从一个集合提取对象句柄时,必须用某种方式准确地记住它们是什么,以保证下溯造型的正确进行。下溯造型和运行期检查都要求花额外的时间来运行程序,而且程序员必须付出额外的精力。既然如此,我们能不能创建一个“智能”集合,令其知道自己容纳的类型呢?这样做可消除下溯造型的必要以及潜在的错误。答案是肯定的,我们可以釆用“参数化类型”,它们是编译器能自动定制的类,可与特定的类型配合。例如,通过使用一个参数化集合,编译器可对那个集合进行定制,使其只接受Shape,而且只提取Shapeo参数化类型是C++—个重要的组成部分,这部分是C++没有单根结构的缘故。在C++中,用于实现参数化类型的关键字是template(模板)。Java目前尚未提供参数化类型,因为由于使用的是单根结构,所以使用它显得有些笨拙。但这并不能保证以后的版木不会实现,因为“generic”这个词己被Java“保留到将来实现”(在Ada语言中,“generic”被用来实现它的模板)。Java采取的这种关键字保留机制其实经常让人摸不着头脑,很难断定以后会发生什么事情

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭