没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记107(2004)71-86www.elsevier.com/locate/entcsDPVK -一个Eclipse插件,用于检测Ei插件系统Wei Wang,Vassilios Tzerpos王伟1,2约克大学计算机科学系加拿大多伦多摘要设计模式不仅有利于正向工程过程,而且有助于设计恢复和程序理解,这是典型的逆向工程活动。在本文中,我们介绍了DPVK,逆向工程工具,以检测模式的情况下,在Ei的电子邮件系统。为了得到更好的检测结果,我们分析了许多不同的模式,并检查Ei el软件的静态结构和动态行为。DPVK作为Eclipse插件实现,以确保更好的关键词:BON,设计模式,Eclipse,Ei模式,Grok,逆向工程1介绍在过去的十年中,设计模式在软件工程中引起了广泛的关注。这一趋势背后的一个重要原因是,设计模式在新的开发和现有的面向对象设计的理解方面都有潜在的用处Gamma等人介绍的设计模式。[2]捕获随时间发展和演变的解决方案。每个设计模式都表示一个高层次的抽象,包含专家设计知识,并代表一个如此重要的概念。1电子邮件地址:weiw@cs.yorku.ca2电子邮件地址:bil@cs.yorku.ca1571-0661 © 2004由Elsevier B. V.出版在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2004.02.04972W. Wang,V.Tzerpos/理论计算机科学电子笔记107(2004)71解决了一个常见的设计问题。一个模式可以作为一个构建块被重用,用于更好的软件构造和设计者交流。设计模式不仅有利于正向工程过程。从程序理解和设计恢复的角度来看,pat提供了系统的组织和有关角色的信息系统的每个组成部分。同时,模式还可以指示系统实现背后的设计原理设计模式的使用提高了面向对象设计的可理解性基于这种观察,由于设计模式反映了特定设计与设计背后的目的之间的开发人员可以通过研究软件系统中的设计模式来更好地理解软件系统模式检测工具的典型系统结构包括三个部分:解析器、检测器和数据库。解析器从实现中提取事实。然后,检测器从数据库中检索模式定义,将这些定义与事实进行比较,并输出检测结果。数据库还可以用于存储检测到的模式实例以供进一步分析。尽管不同的工具可能有不同的结构,但所有这些工具都必须解决几个基本但关键的问题。三个最重要的问题是:如何定义模式,如何呈现模式,以及如何存储模式。定义是这些问题的核心,因为它反映了模式的特征,并将一种模式与另一种模式区分开来。如果我们把这样一个定义看作一组条件,那么这个集合就必须包含所有必要条件,而不包含任何不必要的条件。定义的严格性是逆向工程工具找到正确模式实例而不遗漏任何实例的先决条件。模式定义中的冗余越多,可能报告的误报就越多。定义模式的一种典型方法是简单地考虑其UML图的组成。然而,趋势是从静态结构和动态行为两方面来定义模式。这种定义模式的方式不仅增加了完整性,而且减少了冗余。模式表示是指用于促进文档和通信活动的格式。这些模式可以以图形的形式可视化地呈现,或者使用某种描述语言以文本的形式呈现模式存储涉及存储模式定义及其实例的形式。在最近的研究中,关系数据库通常用于存储检测到的模式实例和其他恢复的设计信息。全自动模式检测的挑战是如何自动W. Wang,V.Tzerpos/理论计算机科学电子笔记107(2004)7173消除模式实例的大多数误报。许多最近开发的工具使用多通道[18]或递归滤波[10]来改善检测输出。同时,为了提高命中率和降低真实模式实例的丢失率,同时考虑了静态结构和动态交互[5]总体而言,逆向工程中设计模式的使用,特别是模式检测,仍处于起步阶段,有很大的改进空间。 由于这一领域最近引起了人们的广泛关注,我们可以期待未来开发出更有效和更强大的模式检测工具本文的目的是双重的:提出一个设计模式图的目录,并提出了一个反向工程工具-DPVK(设计模式验证工具包)。前者显示了设计模式的静态结构和动态行为,后者用于检测/验证Ei模式系统中的模式。 它是用Java开发的,以增强其在各种平台上的可移植性,并允许更容易地与Eclipse集成Gamma和Beck[3]介绍的Eclipse可以解释为一种技术、一个开发平台或一组工具。它也是一个生态系统,使不同的贡献者能够相互交流。为了充分利用最新的开发技术和增强DPVK目前,约克大学正在开发一个用于Eclipse的EiWebel开发工具。一旦它可用,DPVK就可以与它交互,并且在检测模式实例方面更有效和更有成效。本文件的结构如下。在第二节中,我们对相关的逆向工程工具进行了调查。这些工具中的大多数都能够检测设计模式。然而,它们是在不同的环境中设计的,并显示出不同级别的可用性、可扩展性、效率和模式检测的有效性第3节介绍了一些设计模式和Ei语言的背景知识。并介绍了相关的开发工具。在第四节中,我们给出了模式图的目录,并解释了我们是如何组成它的本节的某些部分描述了正在进行的工作。第六部分总结全文并讨论我们未来的工作。2设计模式检测工具设计模式检测工具和技术已经在文献中以各种方式分类对工具和技术的评价侧重于74W. Wang,V.Tzerpos/理论计算机科学电子笔记107(2004)71基于其支持的语言、分析方法、副产品(例如,函数报告、调用图、数据流图)[4]和效率/效率。在本文中,我们讨论了几个设计模式检测工具简单的时间顺序。(i) Pat[12]:Pat系统是一个用于C++应用程序的设计恢复工具。它直接从C++头文件中提取设计信息,并将其存储在存储库中。模式被定义为PROPERTIES规则,设计信息被转换为事实。Pat系统只能用于检测结构设计模式。图案和检查的设计都以PROTECH格式表示。实际的匹配工作是由一个PROPERTIES引擎完成的。与其他逆向工程工具相比,Pat不打算做非常详细的程序理解或设计恢复。它的局限性在于,它在处理行为模式方面有困难,因为需要太多的语义信息。(ii) KT[1]:KT是一个工具,可以从Smalltalk代码中反向工程设计图,并使用此信息来检测模式。 KT的作者主张,任何旨在检测设计模式工件的工具都必须支持静态和动态建模构造。从图的角度看,静态信息包括是类关系和有关系,动态信息包括对象交互或消息流。分 析了GOF 的 三种 设计 模式 :Composite 、 Decorator 和 Chain ofResponsibility。用于检测这些模式的方法直接编码到KT源代码中。(iii) Seemann-Gudenberg[17]:作者提出了一些关于如何从Java源代码中重新覆盖设计信息的想法。模式识别方法逐步进行,揭示了不同的抽象层。首先,编译器收集有关继承、方法调用和特定命名约定的信息,并生成一个图形作为输出。然后,利用图文法产生式对该图进行变换。 转换是在不同的层次上完成的,从方法调用到类关联和委托。最后,通过预定义的标准进行模式检测。虽然只有一次通过源代码,但每个后续的转换阶段都依赖于前一阶段的结果。(iv) SPOOL ( Spreading Desirable Properties Into the Design of Object-Oriented,Large-Scale Software Systems)项目是一个工业/大学联合项目。作为项目的一部分,设计模式工程的SPOOL环境支持正向和反向设计模式工程。SPOOL逆向工程W. Wang,V.Tzerpos/理论计算机科学电子笔记107(2004)7175环境具有三层体系结构。从上到下,他们是面向对象的数据库,存储库模式和最终用户工具。最低层提供逆向工程模型和设计信息的物理存储中间层包含逆向工程模型的面向对象模式,包括静态结构和动态行为。上层由实现特定领域功能的最终用户工具组成,例如源代码捕获和可视化分析。(v) JBOORET[15] : JBOORET ( Jade Bird Object-Oriented ReverseEngineering Tool)采用基于解析器的方法从系统构件中提取高层设计信息和概念模型。JBOORET for C++由三个主要组件组成:数据提取器、知识管理器和信息呈现器。该体系结构将数据抽取与信息表示分离,避免了对每一次高层模型抽取进行重复分析。作为前端,数据提取器是处理语言相关数据的唯一部分。这种设计使JBOORET能够很容易地适用于对用C++以外的语言编写的系统进行逆向工程。知识管理器包含开发语言的概念模型。信息呈现器组件根据用户的偏好来组织和生成设计信息(vi) Heuzeroth-Holl-Hogstrom-Lowe[5]:作者提出了一种通过结合静态和动态分析来自动检测模式的方法。前者限制了代码的构造,后者限制了运行时的可扩展性。 这种分析不依赖于编码或命名约定。模式实例由程序元素(如类、方法或属性)的元组定义。 这些元素必须符合特定设计模式的规则。首先,对源代码进行静态分析,将实现转换为AST(抽象树)节点的元组。然后,静态分析计算AST节点上的预定义模式关系,并生成模式实例的候选集。动态分析将此集合作为其输入。 它监视每个元组的节点的执行。它还跟踪执行节点的输出,以检查候选节点是否符合动态模式规则。如果违反规则,候选人将被淘汰。最后,剩余的候选集包含检测到的模式实例。作者认为,无论是静态分析还是动态分析,都不能提供一种在软件系统中发现模式的适当方法。通过检查,76W. Wang,V.Tzerpos/理论计算机科学电子笔记107(2004)71模式的协议一致性。到目前为止,该工具可以检测观察者,复合,中介, 责任链和 访问者模式。 根据[5] , 当该工具应用 于JavaSwingSet Example和工具本身时,误报的数量很小,在大多数实验中甚至为零。3设计模式与Ei模式每个设计模式中的类都以精确的方式进行交互,应该表现出适当的行为。Ei Bel提供了一种机制,即契约式设计[16],以定义类之间的相互义务和利益契约式设计具有良好的理论基础,为构造稳健设计提供了指导。它允许开发人员精确地指定义务,并明确地分配客户和供应商的责任。在语言层面上,断言、前置条件和后置条件子句用于定义客户和供应商之间的合同。此外,类不变量允许定义每个类内的一般一致性属性。不遵守合同表明存在漏洞。这可以帮助开发人员发现和处理此类设计错误。Ei语言是一种内置契约式设计机制的语言,也是一种为开发人员提供完整的面向对象设计方法的语言此外,它还支持多重继承、多态性、静态类型和动态绑定、泛型和安全异常处理。3.1Ei EjelStudio市场上有许多Ei el编译器,其中一些是免费的。在这些编译器中,SmallEiel(或GNU Ei el er,现在的SmartEi el)[19]和ISEEi elStudio是实现Ei el语言全部功能的强大工具。Ei ZelStudio包含一个IDE。但是,它不仅仅是一个IDE。系统建模、设计、实现和调试都可以在Ei EwelStudio中以流水线的方式完成.开发人员永远不需要在多个开发环境之间切换来完成这些任务。Ei Eidel此外,开发人员不需要额外的工具来更改系统架构。内置测试、指标和生产力工具使开发变得简单和安全。由于Ei elStudio可以在Windows、Unix、Linux、嵌入式甚至VMS系统上运行,因此开发人员可以在Ei el中创建应用程序,然后进行迁移W. Wang,V.Tzerpos/理论计算机科学电子笔记107(2004)7177它到任何其他的平台Ei Zeriel编译到。此外,最新版本的Ei ZeroelStudio支持微软尽管Ei WebelStudio缺乏Eclipse提供的许多功能,例如在线编译、源代码控制和重构,但它仍然提供了许多使Ei WebelStudio系统的开发更容易和更有效的工具。当Eclipse的EiWebel开发工具准备就绪时,我们计划将我们的工作与之集成。在本文中,我们选择了EiWebelStudio 5.3环境,以利用其IDE和内置的BON(业务对象表示法)支持Bon[20]是面向对象系统分析和设计的一种符号,它强调无缝性、可逆性和软件收缩。有两个主要原因,我们选择了我们的工作。首先,BON与EiEwelStudio集成。Ei ToolCase是Ei ToolStudio的一个集成工具,可直接与ISE环境的其他工具连接,并支持生成新的系统架构以及对现有架构进行逆向工程。其次,BON与UML功能相似,但前者更易于学习和使用。BON基于类似于Ei el的概念,但可以独立于Ei el使用。3.2BON CASE工具BON CASE工具[14]旨在在规划、编码和文档编制阶段之间创建无缝接口。它是一个自包含的系统,提供了处理用例图、类图和动态图的工具。该工具提供了一个系统树,可以轻松访问Ei Ewel项目的所有图表和文档。根据作者由于Ei公司没有提供绘制动态BON图的工具,我们使用BON CASE工具来绘制动态图,并在本文中做了相应的标记。4图案图目录为了更好地理解GOF模式并检测它们,在Ei语言源代码中,我们分析了它们的静态结构和动态特性。作为副产品,GOF模式的图表目录被编译[22]。在这个目录中,每一个设计模式进行了分析,并从静态和动态的角度。静态图说明了模式结构,特别是com-78W. Wang,V.Tzerpos/理论计算机科学电子笔记107(2004)71组件类。另一方面,动态图指示运行时的消息序列。Jezequel等人[11]实现了Ei el中的所有GOF[2]设计模式。我们使用这些Ei Eixel实现,Ei EixelStudio和BON CASE工具来分析和生成一系列GOF模式图。Ei el实现基于SmallEi el编译器,它们使用了与Ei elStudio不同的Ei el基础库。因此,在创建图表目录之前,我们修改了这些实现,并使其与Ei GameelStudio基础库兼容,同时保持原始设计。在此之后,借助Ei ZelStudio的集成图工具,我们生成了每个模式的静态图,并从图中删除了不必要的组件类,以保持它们的简单和完整。与创建静态图的过程相反,动态图的创建主要是手动完成的。动态图的绘制分为三个步骤:动态事实抽取、操作消去和BON图的绘制。在第一步中,我们执行所讨论的Ei语言系统,并按时间顺序收集有关每个功能调用的信息(可执行文件是通过打开调用跟踪选项进行编译创建的)。接下来,与我们对静态图所做的类似,我们需要简化输出脚本,因为有些操作与模式无关。 通过参考[11]中的UML协作图,我们删除了不相关的操作,并确保所有与模式相关的操作都保留下来。最后,我们使用BON CASE工具手工绘制动力学图。为了使图表更容易理解,我们对图表中的每个操作进行了详细描述。每个动态图由两部分组成:第一部分是表示模式中操作序列的图,第二部分是提供每个操作的详细描述的符号我们将Singleton模式的图作为一个例子。下图是单例模式的静态图。W. Wang,V.Tzerpos/理论计算机科学电子笔记107(2004)717980W. Wang,V.Tzerpos/理论计算机科学电子笔记107(2004)71下面是单例模式的动态图。W. Wang,V.Tzerpos/理论计算机科学电子笔记107(2004)71815DPVK-一个检测Ei语言逆向工程任务通常通过基于文本的搜索工具(如grep、sed或awk)或通过查询源代码的图形表示我们的实现,DPVK,是一个集成的文本搜索工具,检测设计模式在Ei的编程。DPVK是用Java编写的,目的是为多个操作系统和开发环境(如Eclipse)提供更好的兼容性和可移植性。我们首先介绍Grok,这是一个我们用于我们目的的事实操作引擎。5.1GrokGrok是一个支持脚本语言的关系计算器。它最初是由Ric Holt在1995年创建的,目的是操纵二元关系,以理解大型软件系统。它包括一个解释器,可以被视为一个关系处理器。Grok从一个事实库中提取事实,事实库是一个以RSF(Rigi标准格式)编写的关系列表。事实库收集了宇宙中每个实体之间的所有关系(可以是单个文件或多个文件)。在RSF中,每个事实被表示为形式为(R,x,y)的三元组,这表明关系R包含有序实体对(x,y)。Grok提供了类似于关系数据库的集合运算符。这些运算符主要支持集合运算,如并、交、分段、比较等,用户可以创建一个脚本,让Grok解释器对事实库进行批量运算。Grok将计算,过滤和输出合格的实体集,这些实体具有Grok脚本定义的关系。Grok还有许多其他强大的功能[6]。在DPVK中,Grok是操纵类和对象之间静态关系的理想语言,因为[21]中提出的扩展允许高效的图模式匹配。每个模式静态结构被定义为几个模式规则,这些规则被表示为RSF三元组。在DPVK中,我们使用扩展来匹配设计模式的静态定义和从Ei语言实现中提取的静态事实。Grok捕获一组组件之间的交互,并生成模式实例的候选集。在静态结构方面,DPVK考虑了类之间的继承和方法调用关系。82W. Wang,V.Tzerpos/理论计算机科学电子笔记107(2004)715.2设计检测设计模式的一个关键方面是如何精确地建模和定义在DPVK中,每个设计模式都有两个定义:一个是基于模式的静态结构,另一个是基于其动态行为。DPVK使用特殊的结构和行为来识别和精确定位设计模式,并将一个设计模式与另一个设计模式区分开来。更具体地说,DPVK将这两个定义分别与目标软件系统的静态这种方法类似于[5]中使用的方法。从理论上讲,如果静态和动态定义都是完整和精确的,那么所有的设计模式都将被发现,并且不会输出误报。如果我们把每个定义看作一组条件,那么完整而精确的定义意味着没有多余的条件,也没有必要的条件缺失。在现实世界中,一个特定的设计模式可以在一个给定的系统中实现为许多不同的变体。虽然每个变体仍然可以以类似的方式静态和动态地进行说明和分析,但随着软件系统的发展,收集每个设计模式的所有可能变体将是一项永无止境的工作。我们的解决方案是创建一个设计模式定义库,其中存储尽可能多的变量定义。很明显,事实库越完整,我们在软件系统中找到设计模式及其变体5.3执行如下图所示,DPVK包括三个模块,分为四个阶段。这些模块/阶段是静态事实提取、候选实例发现和误报消除。第四阶段是对我们方法的结果进行手动评估。下面我们将详细讨论这四个阶段。W. Wang,V.Tzerpos/理论计算机科学电子笔记107(2004)71835.3.1静态事实抽取在第一步中,Ei el源代码是唯一的输入。为了简化用户与系统的交互,DPVK只需要一个ACE(AssemblyofClassesinEi el)文件。ACE文件包含了关于Ei脚本项目的重要信息,例如所有Ei脚本源文件的位置和根类名。需要这些信息来从Ei el源代码中提取所有需要的事实静态事实提取在源文件目录中导航,扫描并解析所有.e文件(Ei文件源代码文件)。这个阶段的输出是所有类之间的静态关系。所有的关系都表示为一个三元组的形式(关系,实体1,实体2)。我们包含的关系是继承(inheritance,class 1,class 2)和客户端-供应商(clientClassSupplierClass)。静态关系通过使用EC(Ei Escherel)来检索。EC是ISE开发的命令行Ei el编译器[9](它与Ei elStudio使用的编译器相同)抽取模块管理EC遍历所有.e文件以收集静态信息,并将静态信息合并为静态事实。最后,它将收集到的静态事实呈现为RSF格式,以便在第二阶段与Grok接口。5.3.2候选实例发现正如GOF设计模式书[2]中提到的,每个设计模式都有一个独特的静态结构和动态行为。一方面,静态结构描述了类之间的编译时关系,84W. Wang,V.Tzerpos/理论计算机科学电子笔记107(2004)71设计模式所必需的,例如类A继承类B,或类C通过方法E调用类D。另一方面,动态行为表明了设计模式的运行时特性。 它通常显示为方法调用的时间顺序。在这一阶段,我们组成了我们想要检测的每个设计模式的静态结构的定义。这个定义被表示为RSF,它定义了参与设计模式的类之间的继承和调用关系。使用Grok,我们将定义与第一阶段中导出的静态关系一旦找到一组符合静态定义的类,我们就将其记录为候选实例。最后,输出列出了适合设计模式静态结构的所有类组合。输出可能包含误报,因为许多设计模式的静态结构包含少量的节点和边的组合,这可能在不包含特定设计模式的软件系统5.3.3假阳性消除这一步处理消除前一阶段输出中的假阳性。对于大型系统,这一步非常重要,因为在这一阶段去除的误报数量可能很大。我们从组成每个设计模式的动态定义开始。动态定义被格式化为TA[7],RSF的扩展,它基于设计模式中类的调用顺序。除了动态定义之外,我们还需要获得目标软件系统的动态行为事实。 EC提供了一个“调用跟踪”功能,它会生成一个日志文件,记录所有按时间顺序的方法调用。我们通过比较动态定义和动态事实文件来检查每组类。许多假阳性以这种方式被消除。DPVK生成XML格式的模式实例列表。这种设计的目的是更好的适应性,这将使其他工具,特别是其他Eclipse插件,能够访问DPVK输出并对其执行进一步的分析。5.4人工评价这是模式检测过程的最后阶段。由于这一阶段尚未实施,下文介绍了我们的近期实施计划。设计模式可以以多种不同的方式实现。 同样,相同的模式可以出现在源代码的许多部分,但每次都有不同的意图。为了提高DPVK这一阶段将让开发商W. Wang,V.Tzerpos/理论计算机科学电子笔记107(2004)7185手动验证和调整来自阶段三的输出的候选实例。他们的知识和经验可以帮助过滤掉不需要的输出,并发现未检测到的模式实例。为了让开发人员轻松地操作检测到的模式实例,我们将开发一个DPVK扩展,它接受前一阶段的XML输出,将输出呈现到BON图,并允许开发人员对候选集进行评论。6结论在本文中,我们介绍了一个图表目录的设计模式。每个模式图包括静态结构图和动态行为图。文中还讨论了生成这些图的详细过程。我们还提出了一个逆向工程工具,称为DPVK,这是用来检测/验证模式在Ei的电子邮件系统。DPVK分四个阶段运作。前三个阶段是静态事实提取,候选实例发现和误报消除。最后,第四阶段允许开发人员手动评估和调整前一阶段的输出如前一节所述,科索沃残疾人方案的实施仍在进行中。我们需要实现DPVK的最后阶段,并将其集成到现有架构中。为了评估DPVK此外,Ei elStudio中的Ei elBase库是一个理想的测试库。DPVK可以在用户交互和视觉呈现方面得到增强。例如,DPVK可以为每个模式候选者自动生成BON图如前所述,约克大学正在开发一个Eclipse的EiWebel开发工具。一旦它准备好了,DPVK可以用它来取代Ei EscelStudio和EC,它们目前被用来提取关于被检查的软件系统的静态和动态事实。从长远来看,DPVK将被扩展到检测其他流行的面向对象语言,如Java,C++等的设计模式。引用[1] 凯尔·布朗。 设计逆向工程和自动设计模式检测在Smalltalk,硕士论文,北卡罗来纳州立大学,1996年。[2] 埃里希伽马河赫尔姆河Johnson,J. “Design Patterns - elements of reusable object-orientedsoftware”, Addison-Wesley,86W. Wang,V.Tzerpos/理论计算机科学电子笔记107(2004)71[3] 埃里克·伽马肯特·贝克“Contributing to Eclipse: Principles, Patterns, and Plugins”, Addison-Wesley,[4] 杰拉尔德C.作者:Betty H. C.程软件逆向工程和设计恢复技术的分类和比较框架,逆向工程工作会议,第77-88页,1999年。[5] 德克·霍泽洛斯,托马斯·霍尔,古斯塔夫·霍格斯托姆,韦尔夫·洛。自动设计模式检测,第11届IEEE国际程序理解研讨会,第94-103页,2003年[6] R.C. 霍尔特[7] R.C. 霍尔特[8] Eclipse.org. 网址:http://www.eclipse.org/。[9] Ei Zelel Software Inc. 网址:http://www.eiffel.com/。[10] Jens H.Jahnke,Jorg P.笨蛋A History Concept for Design Recovery Tools,Proceedingsof 6th European Conference on Software Maintenance and Reengineering,第37[11] 让-马克·杰泽克米歇尔·崔恩克里斯汀·明金斯“Design Patterns and Contracts”,[12] 克里斯蒂安·克雷默卢茨·普雷切尔特《面向对象软件中结构设计模式的自动搜索设计恢复》,逆向工程工作会议,第208- 215页,1996年[13] R.凯勒河,巴西-地Schauer,S. Robitaille,and P. Page. “Pattern-based reverse-engineering ofdesign IEEE,1999年。[14] BON CASE工具。网址:http://www.cs.yorku.ca/boneitch/boncasetool/。[15] 红梅,谢涛,杨福清,北京大学。“JBOORET:an Automated Tool to Recover OO Designand Source Models”,第25届国际计算机软件和应用年会,第61-76页,2001年。[16] 伯特兰·迈耶。《面向对象的软件构造》,第二版,Prentice Hall,1997年。[17] Seemann和J.W.冯·古登堡。“Pattern-Based Design Recovery of Java Software”, ACM[18] Forrest Shull,Walcelio L. Melo和Victor R.巴西利从面向对象软件系统中发现设计模式,技术报告,马里兰大学计算机科学系,1996。[19] 聪明的埃尔·阿切尔。 网址:http://smarteiffel.loria.fr/。[20] 金·瓦尔登吉恩·马克·纳森Seamless Object-Oriented Software Architecture:Analysis andDesign of Reliable Systems,Prentice Hall,1995。[21] 放大图片作者:Jingwei Wu,Ahmed E. Hassan和Richard C.霍尔特使用图形模式提取场景,第10届国际程序理解研讨会论文集,2002年。[22] 网址:http://www.cs.yorku.ca/dpweiw/research/DPDigrams.html。
下载后可阅读完整内容,剩余1页未读,立即下载
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 利用迪杰斯特拉算法的全国交通咨询系统设计与实现
- 全国交通咨询系统C++实现源码解析
- DFT与FFT应用:信号频谱分析实验
- MATLAB图论算法实现:最小费用最大流
- MATLAB常用命令完全指南
- 共创智慧灯杆数据运营公司——抢占5G市场
- 中山农情统计分析系统项目实施与管理策略
- XX省中小学智慧校园建设实施方案
- 中山农情统计分析系统项目实施方案
- MATLAB函数详解:从Text到Size的实用指南
- 考虑速度与加速度限制的工业机器人轨迹规划与实时补偿算法
- Matlab进行统计回归分析:从单因素到双因素方差分析
- 智慧灯杆数据运营公司策划书:抢占5G市场,打造智慧城市新载体
- Photoshop基础与色彩知识:信息时代的PS认证考试全攻略
- Photoshop技能测试:核心概念与操作
- Photoshop试题与答案详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)