没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记163(2006)19-29www.elsevier.com/locate/entcsa(MDR2)2:一种模型驱动的多维关注点分离方法,OCLHansSchippers和Dirk Janssens软件工程中的形式化技术{hans.schippers,dirk.janssens}@ua.ac.be佛兰德研究基金会研究助理摘要在面向对象的软件工程过程中,一个典型的活动是构造一个类结构,系统行为将根据这个类结构来具体化。然而,行为通常由多个任务组成,每个任务通常只需要该类结构中可用的部分信息。此外,所需信息的不同表示可能是适当的。因此,能够具有关于全局类结构的多个视图将是有用的,每个视图都适合于特定任务的具体化。 本文介绍了一种实现这种策略的方法(MDR2)2。它将OCL作为一种强大的查询语言,并倡导模型驱动的开发过程,从而减轻了开发人员手动编写大量繁琐且容易出错的代码的负担。保留字:MDE,角色建模,视图,MDSoC1介绍在软件工程中使用面向对象技术有很多优点,其中之一是可理解性和可维护性。更具体地说,现实可以直观地用交流对象来描述,这一事实可以被利用。利用D.诺曼因此,心理模型和OO软件模型之间的差距应该比其他方法更小。然而,在实践中,差距仍然可能很大,这是不方便的。事实上,系统包含了几个关注点,这个术语的定义非常广泛(并且接近其字典含义),即对更具体地说,系统应该执行的每个用例或任务都可以被视为关注点。为了最大限度地提高可理解性和可维护性,软件系统1571-0661 © 2006 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2006.07.00720H. Schippers,D.Janssens/Electronic Notes in Theoretical Computer Science 163(2006)19+教师+课程0..*+课程0..*+参与者1教学课程参加课程0..*+课程0.. *课程安排+时间表1+print()+scheduleCourse(slot:course,course:Course)-slotMap:HashMap<<基础课程>>附表+conflicts(c:Course):Boolean- 联系人:陈先生-name:String-name:String<<基础课程>>学生<<基础课程>>当然<<基础课程>>老师图1. 一个排课应用程序应该以这样一种方式模块化,即不同的关注点可以尽可能独立地指定,这一原则通常被称为关注点分离[24]。每一个关注点都涉及到某些通信对象,这些对象的抽象应该与软件模型中的实体相对应。不幸的是,适合于一种关注的抽象不一定同样适合于另一种关注。例如,在房地产背景下,一个关注点可能需要根据价格类别区分属性,而另一个关注点可能更关心它们的空置率。因此,完整系统的模型实际上应该被看作是某种妥协,试图同时为每个关注点提供尽可能方便的抽象,而不引入任何歧义。换句话说,必须选择一种基于对象的分解,它必须用于所有任务的指定,这种现象也被称为“主导分解的这就是为什么,根据R。Brooks,程序理解的困难在于问题域和程序域之间的映射的重建[3],或者等价地,在心智模型和软件模型之间的映射的重建。因此,关注点分离的概念后来扩展到多维关注点分离[32],以强调这样一个事实,即理想情况下,用于一个关注点的分解标准不应该影响另一个关注点的分解标准。考虑一个非常简单的课程安排系统的OO软件模型[17],如图1所示。它包含课程、参与课程的学生和教师等实体。该系统的目的,顾名思义,是产生一个时间表,其中每个课程被分配一个时间段,以便没有两个课程,无论是由同一个老师教,或由同一个学生,被安排在同一时间。假设负责实现调度任务的开发人员希望通过图形着色算法来实现。这样的算法当然是用节点和边来表示的,在这种情况下,节点对应于而边对应于不应被分配相同时隙的两个进程的组合。然后,每个节点将被分配一种颜色,这样就不会有两个由边连接的节点最终具有相同的颜色。最后,H. Schippers,D.Janssens/Electronic Notes in Theoretical Computer Science 163(2006)1921<<角色>>边缘+边缘nodesOfEdge0..*+print()+节点2+print()- 颜色:红色<<角色>>节点图2.面向对象的图形着色软件模型其对应节点被分配不同颜色的课程也应该在课程时间表中被分配不同的时隙虽然图1的OO软件模型中的实体可能足以完成为学生订阅课程或为教师分配他们应该教授的课程等任务,但该模型在调度方面显然是次优的。事实上,后者的心理模型抽象了涉及课程的事实,并且应该包括“节点”和“边缘”实体。因此,如图2所示的模型可能更合适。总之,提高程序理解力的一个有趣的方法是允许根据最适合该特定任务的实体来指定任务(即行为),从而支持多维分离关注点的想法。这应该对可理解性有双重积极的影响,因为它不仅会缩小心理模型和软件模型之间的差距,而且如果能够使用针对该关注点的最佳软件模型,则虽然使用多个模型来匹配不同关注点的想法不一定是新的(如第3节所指出的),但真正的挑战是确保指定所有这些模型如何相互关联所需的额外工作的成本不会超过这个概念的好处。本文提出了一个(MDALO)2,模型驱动,基于OCL的方法,旨在支持多维分离的关注,同时最大限度地减少额外的复杂性。它的结构如下:首先,所提出的解决方案将被详细讨论,并通过课程调度的例子,这已经简要介绍了上面说明。接下来,对相关工作进行概述,最后提出今后工作中需要注意的问题,并作总结性发言。2提出的解决方案2.1概念如前所述,(MDR2)2的基本思想是,与某个关注点相关的行为应该根据最适合这种情况的实体来具体化但是,尽管对行为的关注有明确的分离,但对数据却事实上,考虑到数据,所有关切之间显然不可避免地存在大量重叠。毕竟,它们共同构成了一个相同的软件系统,如果有几个完全分离的数据结构,情况显然不会如此。22H. Schippers,D.Janssens/Electronic Notes in Theoretical Computer Science 163(2006)19EdgeIs课程<<实景>>+课程2<<基础课程>>当然(courseschallenge.basemodel)+conflicts(c:Course):Boolean+课程1NodeIsCourse<<实景>>0..*+边缘<<角色>>边缘{context课程+节点1<<角色>>节点inv:Course. alllog()->product(Course. alllog())->select(C|c.第一次冲突(c.第二次))}+边缘nodesOfEdge+节点{context课程inv:Course. alllog()}- 颜色:红色+print()0..*2{context Edge+print()inv:self.getCourse()->收集(c|c.get_courseslogging_graphview_node())}图3.面向对象的图形着色软件模型因此,对问题域进行一个集中的OO分解(称之为基本模型(BM)),并将任何其他分解定义为派生,这似乎是一个好主意。这样,每个派生实体都是基础模型的一个或多个实体上的视图,很像(OO)数据库中的(可更新)视图概念[29]。衍生的分解将作为行为规范的起点,并应被称为角色模型。 因此,在这样一个角色模型中的每个实体,除了定义一个关于BM的视图之外,也是一个角色,这意味着它直接参与与该角色模型相关的关注相关的行为规范。 这一作用由参与的巴塞尔公约实体“发挥”,in the view视图.值得注意的是,榜样不一定是分解整个问题域的。相反,它可能会忽略某些实体,如果这些实体被判断为在这种情况下是不相关的。当然,这并不适用于基本模型。回顾第1节中的课程安排示例,图1中的OO软件模型可以作为基础模型,因为它包含指定完整应用程序所需的所有实体图着色关注点的模型将是一个角色模型,其中的实体都是根据BM实体定义这如图3所示;由于BM和角色模型本质上都是基于类的面向对象模型,因此(MDO)2支持UML [22]作为其建模语言,特别是因为后者包括一个以profiles形式存在的扩展机制。概要文件是原型和/或标记值的集合,它们在概念上扩展了UML模型元素定义以用于特定目的。例如,baseclass>>原型表示UML类是BM的一部分,而在角色模型中,role>>原型用于表示实体实际上是从BM派生的。确切地说,哪些BM实体与某个角色有关,可以从用视图> >原型标记的关联中推断出来。角色模型实体和BM之间的视图关系表示为OCL 2.0 [23]查询,并通过UML约束进行建模,如在“Edge”和“Node”角色上所见。角色之间的关联由类似的查询定义,其中提供了特殊的方法来导航到BM并返回 必要时例如,H. Schippers,D.Janssens/Electronic Notes in Theoretical Computer Science 163(2006)1923//订阅阶段Course c = new Course(...Student s = new Student(...//图形着色阶段(例如在Schedule类中的方法中)集合节点=GraphViewManager.switchTo();for(i=nodes.iterator()){ Node n=(Node)it.next();setColor(...); //计算每个节点的颜色}图4. 课程安排示例其映射到BM中的两个路线c1和c2,应该与映射到c1和c2上的两个节点使用OCL的一个优点是它提供了表达复杂视图定义的能力。这在“Edge”角色的情况下说明,其中OCL查询声明边缘是满足特定条件的两个过程的元组(由“product”运算符表示,其具有carbohydrate product语义)。这是一个显著的优势,超过了只允许琐碎映射的方法,比如角色和BM类之间的一对一映射(有关此类方法的示例,请参见第3节)。请注意,到目前为止,只提到了平台无关的模型从这些模型中,现在可以使用代码生成过程生成特定平台(例如Java)的源代码,更多细节将在第2.2节中给出。因此,(MDR2)2很适合模型驱动的工程范式。最重要的结果是,开发人员不需要担心如何维护角色模型和BM之间的映射的细节,并且可以专注于根据他找到的最合适的实体来指定行为。但是,开发人员确实有责任通过对特殊交换机管理器类的方法调用来激活他希望使用的角色模型。在幕后,这个交换机管理器将确保到该特定角色模型的映射是最新的,并且所涉及的角色的实例是可用的。很有可能在大部分时间里,以完全自动化的方式执行这些视图切换所需的信息都不可用。 例如,对于图的集合使用不同的变量名可能是方便的。节点,而不是一个集合的课程。此外,没有任何东西可以保证在“订阅”任务期间使用所有课程的集合另一方面,将某个角色实例从角色模型A传递到角色模型B作为起点(当然是在应用不同的包装器之后)可能是有用的,而不是仅仅因此,即使调查哪些可能性切换到一个新的角色模型应该被认为是未来的工作,24H. Schippers,D.Janssens/Electronic Notes in Theoretical Computer Science 163(2006)19JMI-PSM(UML)JMI-PSM(财政UML2MOF模型转换包装纸(可实例化的Java类)PIMMDR JMI生成(ant)BM(UML)安德罗姆达-阿姆<<包装>>MDR自定义实现JMI接口<><<执行>>安德罗姆达-阿姆RMYATL4MDR<<联系我们>>榜样管理器(“开关”功能,.)评估/代码生成用于OCL查询图5. 代码生成过程引入显式方法调用似乎是有道理的。这种视图切换的示例可以在图4中找到,其中,首先,使用BM实体订阅了许多接下来,每当开发人员决定实现图形着色部分时,就会执行一个开关调用(以粗体标记),然后提供适当的角色。请注意,对象创建语句(包含new关键字)只允许用于BM实体。角色在视图切换期间自动创建,具体取决于BM的当前状态。这意味着BM实体的创建可能对视图切换过程的结果具有间接影响。2.2执行为了让(MDO2)2提供在上一节中已经简要提到的代码生成功能,构建了一个工具链。图中概述了此过程中涉及的工具以及它们所需的输入五、第一个重要的观察是,为了支持查询机制,需要某种类似数据库的存储库来存储所有对象,以及与该存储库兼容的查询引擎。为此,选择了YATL4MDROCL引擎[7],它在Sun的元数据存储库(MDR [ 19 ])上运行后者实际上是一个模型存储库,通常用于保存模型和元模型,它们位于MOF元数据架构的M1和M2级别[21]。然而,没有什么能阻止它在实例级(M0)存储对象H. Schippers,D.Janssens/Electronic Notes in Theoretical Computer Science 163(2006)1925如在这种情况下所需要的。描述这些实例的结构的M1模型被当作M2元模型,即MOF实例。 由于MOF基本上是UML的一个子集,并且包含了在这个上下文中所必需的所有构造,这不会导致任何有问题的结果。作为一个符合MOF的模型存储库,MDR需要一个符合MOF的 XMI格式作为其输入。因此,BM以及所有角色模型(实际上是UML模型)都由UML2MOF转换工具处理,该工具包含在MDR发行版中并处理此转换。之后,MDR被指示生成Java接口,以便通过JMI标准提供对其内容的程序级访问[18]。 因为不希望为了让开发人员了解这些规范,(MDRIGHT)2包含了一个AndroMDA [2]代码生成器的插件,它负责生成包装器,从而有效地屏蔽了这种复杂性。最后,为每个视图生成一个开关管理器类,它提供视图开关调用,并负责执行OCL查询(通过调用YATL4MDROCL引擎)和处理结果。请注意,这是模型驱动方面真正值得考虑的地方。要求开发人员自己编写所有的包装器和管理器类,这将带来不可接受的成本。通过在高抽象级别上引入一些模型,可以自动推导出大量与视图管理相关的技术细节,并将其纳入生成的代码中。还要注意的是,使用OCL/MDR作为查询机制的主要结果是,所有建模实体(来自基础模型的类以及角色)的实例在整个程序生命周期中都驻留在存储库中3相关工作关注点和超空间的多维分离概念[32]起源于面向主题的社区[10],基本上是试图解决与本文讨论的相同的基本问题。其思想是为每个关注点构造一个适当的类层次结构,一个与每个关注点相关的业务逻辑规范的基础。这样,问题域被分解了几次,同时集中在不同的优先级上(可以说系统沿着多个轴分解,因此术语多维)。元语言用于指示不同关注点中的哪些实体匹配。然后,将这些信息作为编译步骤的输入,将所有内容编织在一起,从而实现整个系统的完整实现。从概念的角度来看,元语言实际上描述了关注点之间的重叠。Harrison等人也在诸如Hyper/J [32]和关注操纵环境(CME)[11]等工具中实现了他们的想法,这些工具通常被归类为面向方面的领域[15]。与更传统的面向方面的工具(如AASPJ [14])的主要区别在于,AASPJ区分了基本程序和方面。更具体地说,描述关注点的方面包含26H. Schippers,D.Janssens/Electronic Notes in Theoretical Computer Science 163(2006)19关于如何将其“附加”到基本程序的信息。另一方面,在Hyper/J和CME的情况下,关注点之间没有区别,并且使用单独的工件来描述编织。换句话说,第一种策略是不对称的,而另一种是对称的。看看第1节中描述的基本问题,单独和独立地指定每个关注点,然后根据它们重叠的地方将它们编织在一起的想法似乎是一个自然的候选解决方案。因此,许多其他人集中注意这一办法的各种变化也就不足为奇了S. 例如,Clarke [5]将概念转移到更高的抽象层次,高于代码。在MDA [20]上下文中,这可以称为PIM级别。她使用UML作为建模语言,并结合使用模板参数绑定和显式组合指令来驱动组合过程。R. France等人 [27]也在代码之上的抽象层上操作,将该思想应用于非功能性问题(即与业务逻辑无关),例如安全性、容错性或安全性。他们基本上扩展了UML元模型,以包括例如与安全相关的元类,他们称之为角色。然后,通过指示哪些元类应该在业务逻辑中实例化,业务逻辑可以被“角色”一词Reenskaug [30],虽然有相当多的工作在这个话题[26,16,25,9]。 这个想法是,关注点是根据角色来指定的,在这种情况下,角色代表相关实体。然后这些角色由到目前为止提到的“编织”方法的主要问题是,也许并不意外,编织规范本身。通常,可以使用一组固定的构造(上面称为元语言)来表达所有的担忧。然而,这通常缺乏灵活性,特别是当事情变得比识别属于不同关注点的两个匹配实体更复杂时。这已经被M. Mezini和K. Ostermann,他借此机会发展了凯撒方法[17]。与前面提到的方法相比,最重要的区别是关注点不再被编译掉,而是在运行时维护。 更具体地说,就角色而言,角色以包装器的形式存在,在程序执行期间,对象根据当时正在完成的任务以及为其定义的角色进行包装和解包装。Kiczales [13]:“Fluid AOP涉及到临时转移程序的能力。到一个不同的结构来做一些工作,然后把它移回来。然而,Caesar最重要的缺点是,开发人员应该一直编写和处理包装器,H. Schippers,D.Janssens/Electronic Notes in Theoretical Computer Science 163(2006)1927相当低的抽象层次还有其他的工作遵循类似的、动态的角色建模方法[25,31,12],但是这些工作中的大多数都不能支持角色和对象之间的灵活映射例如,在关于课程调度的示例中,调度任务通过图形着色来实现。“Edge” isan ob- vious candidate for a role in that case, but its mapping is lessstraightforward: An edge虽然凯撒显然支持这种复杂性,但上面提到的其他工作并不支持。唯一的工作,作者Caron等人 [4],其中EJB被用作目标平台,但没有详细说明。此外,它不再支持可伸缩映射。最后,(可更新)视图的概念也存在于OO数据库的世界中[28,29],因此,就视图关系查询的处理而言,OODB系统可以被视为OCL引擎的可行替代方案。然而,实现的数量非常有限,更不用说开源了,充其量它们缺乏足够的可扩展性。4今后工作如前所述,一个应该在相对较短的时间内研究的主题是视图切换的灵活性。从理论上讲,只要开发人员能够访问OCL引擎,只需在存储库中执行切换就足够了,因为这将允许他从新角色模型中收集必要的角色对象,并继续下去。然而,在这种情况下,可以将有用查询的数量减少到几个类别,并且仅在交换机管理器类中为这些查询提供不同的方法毕竟,不限制对OCL引擎的访问将允许执行任何查询,这可能会挫败为每个关注点集中一个角色模型的想法一个不同的,稍微相关的,但更基本的问题是,一次只有一个角色模型被激活的事实,是否不会导致某些类型的软件系统的创建过程特别是在不同的任务相互影响的情况下,可能需要同时有几个积极的角色模型。这里想到的是典型的非功能性方面,例如安全性、持久性或日志记录。从这个角度来看,编织方法可能仍然是更好的方法。不过,这两种策略可能会相辅相成,而不是相互排斥。另一个问题涉及对象删除。事实上,由于对象一直驻留在存储库中,因此它们会被垃圾收集器忽略,才能将它们移除这有点不幸,因为它导致了与经典Java编程模型的分歧。另一方面,考虑到在与角色模型实体一起工作时将基本模型实体保持在范围此外,到目前为止还没有提到继承,虽然它的纳入不一定会引起许多额外的问题,但它仍然值得仔细研究。28H. Schippers,D.Janssens/Electronic Notes in Theoretical Computer Science 163(2006)19值得一提的是,作为YATL4MDR的替代方案,Kent OCL Engine [1]包括一个连接到普通Java的桥梁,从而可以在不需要存储库的情况下有效地评估然而,作者提到了几个严重的问题,比如缺少allocation操作符的翻译,因为没有简单的方法来获取Java类的所有实例。不过,代码生成可能再次成为一种解决方案,因为它可以提供一些簿记代码,以便跟踪所有角色和基类实例。这将消除对MDR和基类包装器的需要,并可能对性能产生有益的影响。最后,在某些时候,应该应用更大的案例研究,以验证软件开发的复杂性是否真的减少了,或者至少它是否增强了可理解性,从而减少了演化复杂性。5结论本文提出了一个(MDR2)2,一个模型驱动的方法来多维分离的关注,它允许指定的行为,每个关注的实体被认为是最合适的关注。 为此,构建了一个基本模型(BM),非常类似于典型的OO类结构,以及几个角色模型,定义了BM上的视图这项工作的主要贡献是结合:• 通过OCL查询支持灵活的视图映射• 一个模型驱动的开发过程,其中代码生成使开发人员避免了由于查询支持而引入的复杂性。最后,希望a(MDO)2方法将允许更好的代码压缩和减少首先编写程序的工作量。引用[1] David H.阿克赫斯特和屋大维·帕特拉斯科尤。ocl2.0-实现多元模型的标准。电子笔记理论Comput.Sci. ,102:21[2] M. 波伦AndroMDA-从UML到可展开组件、版本2003年1月2日http://andromda.sourceforge.net网站。[3] 鲁文·E布鲁克斯关于计算机程序理解的理论。 International Journal of Man-Machine Studies,18(6):543[4] Olivier Caron,Bernard Carre,Alexis Muller,and Gilles Vanwormhoudt.面向构件的信息系统中支持视图的框架。面向对象信息系统国际会议,计算机科学讲义第2817卷,第164-178页,瑞士日内瓦,2003年9月。施普林格出版社[5] Siobhán Clarke,William Harrison,Harold Ossher,and Peri Tarr.面向主题的设计:改进需求、设计和代码的一致性。在第14届ACM SIGPLAN会议上,面向对象编程,系统,语言和应用程序,第325-339页。ACM Press,1999.[6] M.主导模型分解的暴政,2002年。[7] RemcoDijkman. YATL4MDR,2004年。 http://wwwhome.cs.utwente.nl/~dijkman/YATL4MDR.html.H. Schippers,D.Janssens/Electronic Notes in Theoretical Computer Science 163(2006)1929[8] 唐纳德·诺曼。心理模型,第7-14页,关于心理模型的一些观察。LEA,1983年。[9] 德斯蒙德·F D'Souza和Alan Cameron Wills。使用UML的对象、组件和框架:催化方法。Addison-WesleyLongman出版公司股份有限公司、1999年[10] 威廉·哈里森和哈罗德·奥舍尔 Subject-Oriented Programming(对纯对象的批判)在OOPSLA[11]威廉·哈里森哈罗德·奥斯舍小斯坦利·萨顿还有佩里·塔尔关注点操作环境中的关注点建模。技术报告,IBM研究部,2004年9月21日[12] 斯蒂芬·赫尔曼对象团队:改进横切协作的模块化。 在NODe'02:Revised Papers from the InternationalConference NetObjectDays on Objects,Components,Architectures,Services,and Applications fora Networked World中,第248-264页。Springer-Verlag,2003.[13] G. Kiczales。面向秋天的编程-乐趣才刚刚开始。软件设计和生产力的新视野研讨会:研究和应用,2001年12月。[14] Gregor Kiczales,Erik Hilsdale,Jim Hugunin,Mik Kersten,Je Escherey Palm和William G.格里斯沃尔德aspectj的概述在ECOOPSpringer-Verlag,2001.[15] Gregor Kiczales 、 John Lamping 、 Anurag Menhdhekar 、 Chris Maeda 、 Cristina Lopes 、 Jean-MarcLoingtier和John Irwin。面向对象的编程。在Mehmet Akadhit和Satoshi Matsuoka的编辑,ProceedingsEuropean Conference on Object-Oriented Programming,第1241卷,第220- 229242. Springer-Verlag,柏林、海德堡和纽约,1997年。[16] L. T. Nguyen,Liping Zhao,and B.欢迎一套角色塑造的方法。第37届面向对象语言和系统技术国际会议(TOOLS-37[17] 米拉·梅兹尼和克劳斯·奥斯特曼将独立组件与按需重新模块化集成。见OOPSLA,第52-67页[18] 太阳微系统公司 Java Metadata Interface Specification,2002年6月。文档ID JSR-40。[19] 太阳微系统公司NetBeans元数据存储库,2002年。 http://mdr.netbeans.org/。[20] 对象管理组。模型驱动架构(MDA),2001年7月。文件ID orlog/01- 07-01。[21] 对象管理组。Meta-Object Facility Specification,2002年4月。版本1.4。文件ID正式/02-04-03。[22] 对象管理组。统一建模语言(UML),2003年3月。 版本1.5。文件ID正式/03-03-01。[23] 对象管理组。对象约束语言,2004年。 版本2.0。采用规范文件ID ptc/2003-10-14。[24] David L.帕纳斯关于将系统分解为模块的标准(1972)。 第411-427页[25] 乔尔·理查森和彼得·施瓦茨。方面:扩展对象以支持多个独立的角色。1991年ACM SIGMOD国际数据管理会议论文集,第298-307页。ACM Press,1991.[26] Dirk Riehle和Thomas Gross。基于角色模型的框架设计与集成。 在第13届ACM SIGPLAN会议上,面向对象编程,系统,语言和应用程序,第117-133页。ACM Press,1998.[27] 罗伯特·弗朗斯、格里·格奥尔格和因德拉克什·雷。支持设计关注点的多维分离,2003年。[28] E. A.伦登斯泰纳多视图:一种在面向对象数据库中支持多视图的方法。第18届超大型数据库国际会议(VLDBMorgan Kaufmann Publishers,Los Altos(CA),USA,1992.[29] 马克·H Scholl,Christian Laasch,and Markus Tresch. 面向对象数据库中的可更新视图。 在DOOD,第189-207页[30] T. Reenskaug,P. Wold和O.A.莱恩使用对象,OOram软件工程方法。曼宁出版公司,一九九五年[31] T. Tamai,N.Ubayashi和R.市山具有动态角色绑定的自适应对象模型在ICSE[32] 佩里湖放大图片作者:William H. Harrison,and Stanley M.小萨顿N度分离:多维度的关注点分离。软件工程国际会议,107-119页,1999年
下载后可阅读完整内容,剩余1页未读,立即下载
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![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)
会员权益专享
最新资源
- 基于嵌入式ARMLinux的播放器的设计与实现 word格式.doc
- 经典:大学答辩通过_基于ARM微处理器的嵌入式指纹识别系统设计.pdf
- 嵌入式系统课程设计.doc
- 基于飞思卡尔控制器的智能寻迹车设计ARM基础课程课程设计.doc
- 下载基于ARM7的压电陶瓷换能器导纳圆测量仪的研制PDF格式可编辑.pdf
- 课程设计基于ARM的嵌入式家居监控系统的研究与设计.doc
- 论文基于嵌入式ARM的图像采集处理系统设计.doc
- 嵌入式基于ARM9的中断驱动程序设计—课程设计.doc
- 在Linux系统下基于ARM嵌入式的俄罗斯方块.doc
- STK-MirrorStore Product Release Notes(96130)-44
- STK-MirrorStore Storage Connectivity Guide for StorageTek Disk A
- 龙虾养殖远程监控系统的设计与实现数据采集上位-机软件模块-本科毕业设计.doc
- 龙虾养殖远程监控系统的设计与实现数据采集上位-机软件模块-.doc
- 龙虾养殖远程监控系统的设计与实现数据采集上位-机软件模块-本科生毕业论文.doc
- 麻阳风貌展示网站的设计与实现毕业论文.pdf
- 高速走丝气中电火花线切割精加工编程设计.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](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)