八文_文档搜索
 
设为首页   |  加入收藏夹
 八文网 - 汇聚八方文档 - 做最优秀的免费文档下载网站
 

第十二章

文档类型: Microsoft PowerPoint PPT 演示文稿 文档大小:440.5KB
第十二章,面向对象实现面向对象实现
面向对象实现主要包括两项工作:把面向对象设计结果,翻译成用某种程序语言书写的面向对象程序;测试并调试面向对象的程序.面向对象程序的质量基本上由面向对象设计的质量决定,但是,所采用的程序语言的特点和程序设计风格也将对程序的可靠性,可重用性及可维护性产生深远影响.
目前、软件测试仍然是保证软件可靠性的主要措施,对于面向对象的软件来说,情况也是如此.面向对象测试的目标,也是用尽可能低的测试成本发现尽可能多的软件错误.但是,面向对象程序中特有的封装、继承和多态等机制,也给面向对象测试带来一些新特点、增加了测试和调试的难度.必须在实践中努力探索适合于面向对象软件的更有效的测试方法.
主要内容结构
12.1 程序设计语言
12.2 程序设计风格
12.3 测试策略
12.4 设计测试用例
12.5 小结面向对象的语言面向对象设计的结果既可以用面向对象语言、也可以用非面向对象语言实现.
使用面向对象语言时,由于语言本身充分支持面向对象概念的实现,因此,编译程序可以自动把面向对象概念映射到目标程序中.使用非面向对象语言编写面向对象程序,则必须由程序员自己把面向对象概念映射到目标程序中.所有非面向对象语言都不支持一般-特殊结构的实现,使用这类语言编程时要么完全回避继承的概念,要么在声明特殊化类时,把对一般化类的引用嵌套在它里面.
到底应该选用面向对象语言还是非面向对象语言、关键不在于语言功能强弱.从原理上说,使用任何一种通用语言都可以实现面向对象概念.当然,使用面向对象语言、实现面向对象概念,远比使用非面向对象语言方便,但是,方便性也并不是决定选择何种语言的关键因素.选择编程语言的关键因素,是语言的一致的表达能力、可重用性及可维护性.
从面向对象观点看来,能够更完整,更准确地表达问题域语义的面向对象语言的语法是非常重要的,因为这会带来下述几个重要优点:一致的表示方法可重用性可维护性从前面章节的讲述中可以知道,面向对象开发基于不随时间变化的,一致的表示方法.这种表示方法应该从问题域到OOA,从OOA到OOD,最后从OOD到面向对象编程(OOP),始终稳定不变.一致的表示方法既有利于在软件开发过程中始终使用统一的概念,也有利于维护人员理解软件的各种配置成分.
为了能带来可观的商业利益,必须在更广泛的范围中运用重用机制,而不是仅仅在程序设计这个层次上进行重用.因此,在OOA,OOD直到OOP中都显式地表示问题域语义、其意义是十分深远的.随着时间的推移,软件开发组织既可能重用它在某个问题域内的OOA结果,也可能重用相应的OOD和OOP结果.
尽管人们反复强调保持文档与源程序一致的必要性,但是,在实际工作中很难做到交付两类不同的文档,并使它们保持彼此完全一致.特别是考虑到进度,预算,能力和人员等限制因素时,做到两类文档完全一致几乎是不可能的.因此,维护人员最终面对的往往只有源程序本身.
举例以ATM系统为例,说明在程序内部表达问题域语义对维护工作的意义.假设在维护该系统时没有合适的文档资料可供参阅、于是维护人员人工浏览程序或使用软件工具扫描程序,记下或打印出程序显式陈述的问题域语义、维护人员看到ATM,账户,现金兑换卡等、这对维护人员理解所要维护的软件将有很大帮助.
因此,在选择编程语言时,应该考虑的首要因素,是在供选择的语言中哪个语言能最好地表达问题域语义.一般说来,应该尽量选用面向对象语言来实现面向对象分析,设计的结果.
面向对象语言的技术特点面向对象语言的形成过程在选择面向对象语言时应该着重考察的一些技术特点:支持类与对象概念的机制实现整体-部分结构的机制实现一般-特殊结构的机制实现属性和服务的机制类型检查类库效率持久保存对象参数化类(模板机制)开发环境面向对象语言的形成借鉴了历史上许多程序语言的特点、从中吸取了丰富的营养.当今的面向对象语言、从20世纪50年代诞生的LISP语言中引进了动态联编的概念和交互式开发环境的思想,从20世纪60年代推出的SIMULA语言中引进了类的概念和继承机制,此外,还受到20世纪70年代末期开发的Modula_2语言和Ada语言中数据抽象机制的影响.
20世纪80年代以来,面向对象语言像雨后春笋一样大量涌现,形成了两大类面向对象语言.一类是纯面向对象语言、如Smalltalk和Eiffel等语言.另一类是混合型面向对象语言、也就是在过程语言的基础上增加面向对象机制,如C等语言.
纯面向对象语言着重支持面向对象方法研究和快速原型的实现,而混合型面向对象语言的目标则是提高运行速度和使传统程序员容易接受面向对象思想.成熟的面向对象语言通常都提供丰富的类库和强有力的开发环境.
所有面向对象语言都允许用户动态创建对象,并且可以用指针引用动态创建的对象.允许动态创建对象,就意味着系统必须处理内存管理问题,如果不及时释放不再需要的对象所占用的内存,动态存储分配就有可能耗尽内存.
有两种管理内存的方法,一种是由语言的运行机制自动管理内存,即提供自动回收垃圾的机制;另一种是由程序员编写释放内存的代码.自动管理内存不仅方便而且安全,但是必须采用先进的垃圾收集算法才能减少开销.
实现整体部分结构的机制一般说来,有两种实现方法,分别使用指针和独立的关联对象实现整体-部分结构.大多数现有的面向对象语言并不显式支持独立的关联对象,在这种情况下,使用指针是最容易的实现方法,通过增加内部指针可以方便地实现关联.
实现一般特殊结构的机制既包括实现继承的机制也包括解决名字冲突的机制.所谓解决名字冲突、指的是处理在多个基类中可能出现的重名问题,这个问题仅在支持多重继承的语言中才会遇到.某些语言拒绝接受有名字冲突的程序,另一些语言提供了解决冲突的协议.不论使用何种语言、程序员都应该尽力避免出现名字冲突.
对于实现属性的机制应该着重考虑以下几个方面:支持实例连接的机制;属性的可见性控制;对属性值的约束.
对于服务来说,主要应该考虑下列因素:支持消息连接(即表达对象交互关系)的机制;控制服务可见性的机制;动态联编.程序设计语言可以按照编译时进行类型检查的严格程度来分类.如果语言仅要求每个变量或属性隶属于一个对象,则是弱类型的;如果语法规定每个变量或属性必须准确地属于某个特定的类,则这样的语言是强类型的.面向对象语言在这方面差异很大,例如,Smalltalk实际上是一种无类型语言(所有变量都是未指定类的对象);C和Eiffel则是强类型语言.
有利于在编译时发现程序错误;增加了优化的可能性.混合型语言(如C, Objective_C等)甚至允许属性值不是对象而是某种预定义的基本类型数据(如整数,浮点数等)、这可以提高操作的效率.
大多数面向对象语言都提供一个实用的类库.某些语言本身并没有规定提供什么样的类库,而是由实现这种语言的编译系统自行提供类库.存在类库,许多软构件就不必由程序员重头编写了,这为实现软件重用带来很大方便.
类库中往往包含实现通用数据结构(例如,动态数组,表,队列,栈,树等等)的类,通常把这些类称为包容类.在类库中还可以找到实现各种关联的类.
更完整的类库通常还提供独立于具体设备的接口类(例如,输入输出流)、此外,用于实现窗口系统的用户界面类也非常有用,它们构成一个相对独立的图形库.
许多人认为面向对象语言的主要缺点是效率低.产生这种印象的一个原因是,某些早期的面向对象语言是解释型的而不是编译型的.
事实上,使用拥有完整类库的面向对象语言、有时能比使用非面向对象语言得到运行更快的代码.这是因为类库中提供了更高效的算法和更好的数据结构,例如,程序员已经无须编写实现哈希表或平衡树算法的代码了,类库中已经提供了这类数据结构,而且算法先进、代码精巧可靠.
任何应用程序都对数据进行处理,如果希望数据能够不依赖于程序执行的生命期而长时间保存下来,则需要提供某种保存数据的方法.希望长期保存数据主要出于以下两个原因:为实现在不同程序之间传递数据,需要保存数据;为恢复被中断了的程序的运行、首先需要保存数据.一些面向对象语言、没有提供直接存储对象的机制.这些语言的用户必须自己管理对象的输入输出、或者购买面向对象的数据库管理系统.
另外一些面向对象语言(例如,Smalltalk),把当前的执行状态完整地保存在磁盘上.还有一些面向对象语言、提供了访问磁盘对象的输入输出操作.
参数化类所谓参数化类,就是使用一个或多个类型去参数化一个类的机制,有了这种机制,程序员就可以先定义一个参数化的类模板(即在类定义中包含以参数形式出现的一个或多个类型),然后把数据类型作为参数传递进来,从而把这个类模板应用在不同的应用程序中、或用在同一应用程序的不同部分.Eiffel语言中就有参数化类,C语言也提供了类模板.
软件工具和软件工程环境对软件生产率有很大影响.由于面向对象程序中继承关系和动态联编等引入的特殊复杂性,面向对象语言所提供的软件工具或开发环境就显得尤其重要了.
至少应该包括下列一些最基本的软件工具: 编辑程序,编译程序或解释程序,浏览工具,调试器(debugger)等.
选择面向对象语言开发人员在选择面向对象语言时,还应该着重考虑以下一些实际因素:将来能否占主导地位类库和开发环境其他因素程序设计风格良好的面向对象程序设计风格,既包括传统的程序设计风格准则,也包括为适应面向对象方法所特有的概念(例如,继承性)而必须遵循的一些新准则.
提高可重用性提高可扩充性提高健壮性软件重用有多个层次,在编码阶段主要涉及代码重用问题.
一般说来,代码重用有两种:
本项目内的代码重用:主要是找出设计中相同或相似的部分,然后利用继承机制共享它们.新项目重用旧项目的代码.提高可重用性的准则提高方法的内聚如果某个方法涉及两个或多个不相关的功能,则应该把它分解成几个更小的方法.
减小方法的规模如果某个方法规模过大,则应该把它分解成几个更小的方法.保持方法的一致性功能相似的方法应该有一致的名字,参数特征(包括参数个数,类型和次序),返回值类型,使用条件及出错条件等.
把策略与实现分开
策略方法:负责做出决策,提供变元、并且管理全局资源.策略方法应该检查系统运行状态、并处理出错情况,它们并不直接完成计算或实现复杂的算法.
实现方法:负责完成具体的操作,但却并不做出是否执行这个操作的决定,也不知道为什么执行这个操作.
实现方法仅仅针对具体数据完成特定处理,通常用于实现复杂的算法.
全面覆盖如果输入条件的各种组合都可能出现,则应该针对所有组合写出方法,而不能仅仅针对当前用到的组合情况写方法.
此外,一个方法不应该只能处理正常值,对空值,极限值及界外值等异常情况也应该能够作出有意义的响应.
尽量不使用全局信息应该尽量降低方法与外界的耦合程度,不使用全局信息是降低耦合度的一项主要措施.
利用继承机制调用子过程最简单的做法是把公共的代码分离出来,构成一个被其他方法调用的公用方法.
可以在基类中定义这个公用方法,供派生类中的方法调用.分解因子从不同类的相似方法中分解出不同的因子(即不同的代码)、把余下的代码作为公用方法中的公共代码.
把分解出的因子作为名字相同算法不同的方法,放在不同类中定义、并被这个公用方法调用.
使用委托当逻辑上不存在一般-特殊关系时,为重用已有的代码、可以利用委托机制把代码封装在类中程序员往往希望重用用其他方法编写的,解决同一类应用问题的程序代码.
重用这类代码的一个比较安全的途径,是把被重用的代码封装在类中.
提高可扩充性的准则封装实现策略应该把类的实现策略(包括描述属性的数据结构,修改属性的算法等)封装起来,对外只提供公有的接口,否则将降低今后修改数据结构或算法的自由度.
不要用一个方法遍历多条关联链一个方法应该只包含对象模型中的有限内容.违反这条准则将导致方法过分复杂,既不易理解,也不易修改扩充.
避免使用多分支语句一般说来,可以利用DO CASE语句测试对象的内部状态、但是不要根据对象类型选择应有的行为.
应该合理地利用多态性机制,根据对象当前类型,自动决定应有的行为.
精心确定公有方法修改公有方法的代价通常都比较高.为提高可修改性,降低维护成本,必须精心选择和定义公有方法.提高健壮性的准则预防用户的操作错误当用户在输入数据时发生错误,不应该引起程序运行中断、更不应该造成死机.
任何一个接收用户输人数据的方法,对其接收到的数据必须进行检查,即使发现了非常严重的错误,也应该给出恰当的提示信息,并准备再次接收用户的输入.
检查参数的合法性对公有方法,尤其应该着重检查其参数的合法性,因为用户在使用公有方法时可能违反参数的约束条件.
不要预先确定限制条件在设计阶段,往往很难准确地预测出应用系统中使用的数据结构的最大容量需求.因此不应该预先设定限制条件.
如果有必要和可能,则应该使用动态内存分配机制,创建未预先设定限制条件的数据结构.
先测试后优化为在效率与健壮性之间做出合理的折衷,应该在为提高效率而进行优化之前、先测试程序的性能.
经过测试,合理地确定为提高性能应该着重优化的关键部分.面向对象测试一般说来,对面向对象软件的测试可分为下列四个层次进行:算法层测试类中定义的每个方法,基本上相当于传统软件测试中的单元测试.
类层测试封装在同一个类中的所有方法与属性之间的相互作用.主题层测试一组协同工作的类-对象之间的相互作用,大体上相当于传统软件测试中的子系统测试.
系统层把各个子系统组装成完整的面向对象软件系统,在组装过程中同时进行测试.
设计测试方案的传统技术,例如,逻辑覆盖,等价划分,边界值分析和错误推测等方法,仍然可以作为测试类中每个方法的主要技术.
面向对象测试的主要目标,也是用尽可能低的测试成本和尽可能少的测试方案,发现尽可能多的错误.
但是,面向对象程序中特有的封装、继承和多态等机制,也给面向对象测试带来一些新特点、增加了测试和调试的难度.
在测试类的实现时,测试人员面对的已不再是一段顺序执行的代码、传统的测试方法也不再完全适用了.
传统测试方法:选定一组输入数据,交给待测程序处理,通过比较实际输出结果和预期输出结果,判断程序是否有错.
在测试类的实现时,应该从各种可能的启动操作的次序组合中、选出最可能发现属性和操作错误的若干种情况,着重进行测试.
在传统的程序中、重用不影响测试过程.传统程序中的重用无非是从已有的程序中复制一段代码、放到当前的程序中、或者调用标准的库函数.
但是面向对象程序中的继承和多态(包括重载)机制,却给测试过程带来了新特点、对于子类往往需要展开来测试.
目前、面向对象软件的测试用例的设计方法,还处于研究,发展阶段.与传统软件测试(测试用例的设计由软件的输入0处理0输出视图或单个模块的算法细节驱动)不同、面向对象测试关注于设计适当的操作序列以检查类的状态.
12.4.1 测试类的方法前面已经讲过,软件测试从小型测试开始,逐步过渡到大型测试.对面向对象的软件来说,小型测试着重测试单个类和类中封装的方法.测试单个类的方法主要有随机测试,划分测试和基于故障的测试等3种.
1. 随机测试下面通过银行应用系统的例子,简要地说明这种测试方法.该系统的account(账户)类有下列操作: open(打开)、setup(建立),deposit(存款),withdraw(取款),balance(余额)、summarize(清单),creditLimit(透支限额)和close(关闭).上列每个操作都可以应用于account类的实例,但是,该系统的性质也对操作的应用施加了一些限制,例如,必须在应用其他操作之前先打开账户,在完成了全部操作之后才能关闭账户.即使有这些限制,可做的操作也有许多种排列方法.一个account类实例的最小行为历史包括下列操作:open・setup・deposit・withdraw・close这就是对account类的最小测试序列.但是,在下面的序列中可能发生许多其他行为:
open・setup・deposit・[deposit|withdraw|balance|summarize|creditLimit]n・withdraw・close从上列序列可以随机地产生一系列不同的操作序列,例如:
测试用例r1:open・setup・deposit・deposit・balance・summarize・withdraw・close
测试用例r2:open・setup・deposit・withdraw・deposit・balance・creditLimit・withdraw・close执行上述这些及另外一些随机产生的测试用例,可以测试类实例的不同生存历史.
2. 划分测试与测试传统软件时采用等价划分方法类似,采用划分测试(partition testing)方法可以减少测试类时所需要的测试用例的数量.首先,把输入和输出分类,然后设计测试用例以测试划分出的每个类别.下面介绍划分类别的方法.
(1) 基于状态的划分这种方法根据类操作改变类状态的能力来划分类操作.再一次考虑account类,状态操作包括deposit和withdraw,而非状态操作有balance, summarize和creditLimit.设计测试用例,以分别测试改变状态的操作和不改变状态的操作.例如,用这种方法可以设计出如下的测试用例:
测试用例p1:open・setup・deposit・deposit・withdraw・withdraw・close
测试用例p2:open・setup・deposit・summarize・creditLimit・withdraw・close测试用例P1改变状态、而测试用例P2测试不改变状态的操作(在最小测试序列中的操作除外).
(2) 基于属性的划分这种方法根据类操作使用的属性来划分类操作.对于account类来说,可以使用属性balance来定义划分,从而把操作划分成3个类别:使用balance的操作;修改balance的操作;不使用也不修改balance的操作.然后,为每个类别设计测试序列.
(3) 基于功能的划分这种方法根据类操作所完成的功能来划分类操作.例如,可以把account类中的操作分类为初始化操作(open,setup),计算操作(deposit, withdraw),查询操作(balance, 和终止操作(close).然后为每个类别设计测试序列.
3. 基于故障的测试基于故障的测试(fault based testing)与传统的错误推测法类似,也是首先推测软件中可能有的错误,然后设计出最可能发现这些错误的测试用例.例如,软件工程师经常在问题的边界处犯错误,因此,在测试SQRT(计算平方根)操作(该操作在输入为负数时返回出错信息)时,应该着重检查边界情况: 一个接近零的负数和零本身.其中零本身用于检查程序员是否犯了如下错误:把语句;
误写成if(x>;
为了推测出软件中可能有的错误,应该仔细研究分析模型和设计模型,而且在很大程度上要依靠测试人员的经验和直觉.如果推测得比较准确,则使用基于故障的测试方法能够用相当低的工作量发现大量错误;反之,如果推测不准,则这种方法的效果并不比随机测试技术的效果好.
12.4.2 集成测试方法开始集成面向对象系统以后,测试用例的设计变得更加复杂.在这个测试阶段,必须对类间协作进行测试.为了举例说明设计类间测试用例的方法,我们扩充12.4.1小节引入的银行系统的例子,使它包含图12.3所示的类和协作.图中箭头方向代表消息的传递方向,箭头线上的标注给出了作为由消息所蕴含的协作的结果而调用的操作.
和测试单个类相似,测试类协作可以使用随机测试方法和划分测试方法,以及基于情景的测试和行为测试来完成.
1. 多类测试Kirani和Tsai建议使用下列步骤,以生成多个类的随机测试用例.
对每个客户类,使用类操作符列表来生成一系列随机测试序列.这些操作符向服务器类实例发送消息.
对所生成的每个消息,确定协作类和在服务器对象中的对应操作符.对服务器对象中的每个操作符(已经被来自客户对象的消息调用),确定传递的消息.
对每个消息,确定下一层被调用的操作符,并把这些操作符结合进测试序列中.
为了说明怎样用上述步骤生成多个类的随机测试用例,考虑Bank类相对于ATM类(见图12.3)的操作序列:
verifyAcct・verifyPIN・[(verifyPolicy・withdrawReq)|depositReq|acctInfoREQ]n
对Bank类的随机测试用例可能是:
测试用例r3:verifyAcct・verifyPIN・depositReq为了考虑在上述这个测试中涉及的协作者、需要考虑与测试用例r3中的每个操作相关联的消息.Bank必须和ValidationInfo协作以执行verifyAcct和verifyPIN,Bank还必须和Account协作以执行depositReq.因此,测试上面提到的协作的新测试用例是:
测试用例・[]・verifyPINBank・[]・depositReq・[depositaccount]
多个类的划分测试方法类似于单个类的划分测试方法(见12.4.1节).但是,对于多类测试来说,应该扩充测试序列以包括那些通过发送给协作类的消息而被调用的操作.另一种划分测试方法,根据与特定类的接口来划分类操作.如图12.3所示、Bank类接收来自ATM类和Cashier类的消息,因此,可以通过把Bank类中的方法划分成服务于ATM的和服务于Cashier的两类来测试它们.还可以用基于状态的划分(见12.4.1节),进一步精化划分.
图12.3 银行系统的类-协作图
2. 从动态模型导出测试用例在本书第9章中已经讲过,怎样用状态转换图作为表示类的动态行为的模型.类的状态图可以帮助我们导出测试该类(及与其协作的那些类)的动态行为的测试用例.图12.4给出了前面讨论过的account类的状态图,从图可见、初始转换经过了empty acct和setup acct这两个状态、而类实例的大多数行为发生在working acct状态中、最终的withdraw和close使得account类分别向nonworking acct状态和dead acct状态转换.
图12.4 account类的状态转换图设计出的测试用例应该覆盖所有状态、也就是说,操作序列应该使得account类实例遍历所有允许的状态转换:
测试用例s1:open・setupAccnt・・・close应该注意,上面列出的序列与12.4.1节讨论的最小测试序列相同.向最小序列中加入附加的测试序列,可以得出其他测试用例:
测试用例s2:open・setupAccnt・・deposit・balance・credit・・close
测试用例s3:open・setupAccnt・・deposit・withdraw・accntInfo・・close还可以导出更多测试用例,以保证该类的所有行为都被适当地测试了.在类的行为导致与一个或多个类协作的情况下,应该使用多个状态图去跟踪系统的行为流.
小结面向对象方法学把分析,设计和实现很自然地联系在一起了.虽然面向对象设计原则上不依赖于特定的实现环境、但是实现结果和实现成本却在很大程度上取决于实现环境.因此,直接支持面向对象设计范式的面向对象程序语言、开发环境及类库,对于面向对象实现来说是非常重要的.
为了把面向对象设计结果顺利地转变成面向对象程序,首先应该选择一种适当的程序设计语言.面向对象的程序设计语言非常适合用来实现面向对象设计结果.事实上,具有方便的开发环境和丰富的类库的面向对象程序设计语言、是实现面向对象设计的最佳选择.
良好的程序设计风格对于面向对象实现来说格外重要.它既包括传统的程序设计风格准则,也包括与面向对象方法的特点相适应的一些新准则.
面向对象方法学使用独特的概念和技术完成软件开发工作,因此,在测试面向对象程序的时候,除了继承传统的测试技术之外,还必须研究与面向对象程序特点相适应的新的测试技术.
面向对象测试的总目标与传统软件测试的目标相同、也是用最小的工作量发现最多的错误.但是,面向对象测试的策略和技术与传统测试有所不同、测试的焦点从过程构件(传统模块)移向了对象类.
一旦完成了面向对象程序设计,就开始对每个类进行单元测试.测试类时使用的方法主要有随机测试,划分测试和基于故障的测试.每种方法都测试类中封装的操作.应该设计测试序列以保证相关的操作受到充分测试.检查对象的状态(由对象的属性值表示)、以确定是否存在错误.
可以采用基于线程或基于使用的策略完成集成测试.基于线程的测试,集成一组相互协作以对某个输入或某个事件作出响应的类.基于使用的测试,从那些不使用服务器类的类开始,按层次构造系统.设计集成测试用例,也可以采用随机测试和划分测试方法.此外,从动态模型导出的测试用例,可以测试指定的类及其协作者.
面向对象系统的确认测试也是面向黑盒的,并且可以应用传统的黑盒方法完成测试工作.但是,基于情景的测试是面向对象系统确认测试的主要方法.
谢谢大家!
ppt文档的标签: 十二
更多推荐标签: 岩溶地貌论文   稼动率   使用资金数据   员工离职表   ·¨èè   库存论文   车载机   压税钱   赣州英语介绍   供水生产   教师推荐信   消防演练方案   海景集团   商会工作规划   行政沟通   银行通讯录   企业制度评价   痕量汞的测定   学刹羌   税收学教案   宣传总结   安装岗位职责   操作系统迷宫   报关思考论文   医学论文   二叉树应用   华罗庚传   行政公文范文   购置相机申请   Á쵼ѧ  
相关文档推荐
2006年4月12日星期三第十二版体育新
太原市第十二中学观后感
第十二章
第十二章
第十二届上海电视节国际广播电影电视设备展
中华医学会第十二次全国医学信息学术会议
北京大学第十二届"挑战杯&qu
工学院九十二学年度第六次行政会议纪录
第十二章
亚东技术学院九十二学年度第四次行政会议纪
第十二章
第五十二章
第十二章
政协徐州市第十二届委员会第四次会议提案
合肥市第六十二中学Z+Z智能平台运用于.
第十二章
微笑三代第十二届全国三代同堂孝亲楷模表扬
第十二届深圳国际玩具及礼品展览会
第十二章电子商务安全
2006年度第十二批排放合格车型目录
推荐文档下载
上海市高兴实验学校保持员先进性教育
安全生产检查表(外业)
办公室自动化的定义
"环境保护行政许可月报表(十月
第十六届学生会评议会
宫本和他的第一只导盲犬丘特
"先进集体"
九江职业技术学院与北京航空航天大学等重点
1个月"海外汉语教师来华研修项
电子商务商业计划设计构架
广告学(050303)专业培养计划
代理报关委托书
挑战杯大学生创业计划竞赛
全球医药原料药市场走势分析报告
港龙航空公司
初二语文期中考试试卷
牡丹国际信用卡积分活动通告
国家留学基金全额资助项目
数据库原理
昭通市工商行政管理局
 
文档下载提示:
·最新免费文档下载、毕业论文免费下载、Word文档下载、Excel表格下载、PDF电子书下载、PowerPoint提案下载
·所有文档均为网友上传,仅供学习参考,用作其它用途时请征得相关权益人许可.
·八文网只提供文档共享平台,不对文档内容的正确性及相关内容所引发的后果负责.
·如此文档"第十二章"涉及您的权益,请附上网址来信告知web_8wen(#)126.com,本站将认真配合并改正。
Copyright ©2005-2008 八文网-  8Wen.com . All rights reserved.