(计算机应用技术专业论文)基于领域工程的软件模块自动生成的研究.pdf_第1页
(计算机应用技术专业论文)基于领域工程的软件模块自动生成的研究.pdf_第2页
(计算机应用技术专业论文)基于领域工程的软件模块自动生成的研究.pdf_第3页
(计算机应用技术专业论文)基于领域工程的软件模块自动生成的研究.pdf_第4页
(计算机应用技术专业论文)基于领域工程的软件模块自动生成的研究.pdf_第5页
已阅读5页,还剩75页未读 继续免费阅读

(计算机应用技术专业论文)基于领域工程的软件模块自动生成的研究.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

西南交通大学硕士研究生学位论文第1 页 摘要 随着软件工程和软件设计理论和方法的不断发展,现代软件产品的制作逐 渐向自动化发展。这要求使用面向重用的软件工程方法来面向软件系统族进行 软件组件的制作,形成特定的软件组件库,然后使用领域特定语言 ( d o m a i n s p e c i f i cl a n g u a g e ,d s l ) ,根据软件模块的规范,实现软件组件自动 装配成所需要的软件模块。 使用面向特征领域工程方法和c + + 程序设计语言,本文实现了软件模块的 自动生成。本文关注的特定领域是经典的链表容器颁域,软件系统族的建立使 用c 十+ 程序设计语言和面向对象的程序设计方法。由特定的产生器来实现软件模 块的自动生成,产生器使用c + + 的模板编译机制来设计,产生器中包括了d s l 的定义和解释。整个链表容器的实现过程使用领域工程技术方法,包括领域分 析、领域实现和领域设计,其中领域分析使用了特征建模的方法,领域设计和 实现使用g e n v o c a 架构。 通过对c + + 模板编程机制的研究和实践表明,c + + 的模扳机制本身构成一个 图灵完备的静态程序设计语言,可以由c + + 编译器解释执行,本文实现了一个面 向静态程序设计的基本模板库( b t l ) ,b t l 做为c + + 静态元程序设计的基础库运 行在编译期,包括i 流程控制元函数、基本工具元函数、错误处理和编译期确 认、编译期类型容器、类型特性元函数,可以作为c + + 面向对象程序设计的有 益补充。 关键字:领域工程,领域分析,d s l ,代码生成,产生器 西南交通大学硕士研究生学位论文第| i 页 a b s tt a c t w i t ht h ed e v e l o p m e n to ft h es o f t w a r ee n g i n e e ra n ds o f t w a r ed e s i g nt h e o r y , t h e m o d e m p r o d u c t i o no ft h es o f t w a r eb e c o m e sa u t o m a t i c a l l yg r a d u a l l y t h er e s u l ti s m a k i n g s o f t w a r es h o u l df a c es o f t w a r e s y s t e mf a m i l y a n du s eo r i e n t e d r e u s e m e t h o do fs o f t w a r e e n 酹n e e r a n dp r o d u c ts o f t w a r e c o m p o n e n t ,w h i c hc a nb e a s s e m b l e d a u t o m a t i c a l l y o nt h eb a s i so f d o m a i n - s p e c i f i cl a n g u a g ed e s c r i b i n g s o f t w a r ec r i t e r i o n i nt h i sp a p e r ,aa r c h i t e c t u r eo f p r o d u c t i o n a b o u ts o f t w a r em o d u l e a u t o m a t i c a l l y i sb u i l t w h i c hi su s e do r i e n t e df e a t u r ed o m a i ne n d n e e rm e t h o da n dc + + p r o g r a m l a n g u a g e t h eb u i l to fs o f t w a r es y s t e mf a m i l yi su s e dc + + p r o g r a ml a n g u a g ea n d o r i e n t e d - o b j e c tp r o g r a mm e t h o di n as p e c i f i cd o m a i nn a m e dd a t ac o n t a i n e r t h e g e n e r a t o r i sm a d et oi m p l e m e n ta u t op r o d u c t i o no fs o f t w a r em o d u l e ,w h i c hi s d e s i g n e db yc + + s t a t i ct e m p l a t ep r o g r a m a n di n c l u d e st h ed e f i n i t i o na n dt r a n s l a t i o n o ft h ed s lt h ei m p l e m e n tp r o c e s so fl i s td a t ac o n t a i n e ru s e sd o m a i ne n g i n e e r i n g t e c h n o l o g y ,i n c l u d i n g d o m a i na n a l y s i s ,d o m a i nd e s i g n , d o m a i ni m p l e m e n t t h e p r o c e s so fd o m a i na n a l y s i su s e s f e a t u r em o d e l i n gm e t h o d ,d o m a i nd e s i n ga n d d o m a i n i m p l e m e n t i l q e sg e n v o c aa r c h i t e c t u r e o nt h eb a s i co fr e s e a r c ha n dp r a c t i c ei ng + s t a t i ct e m p l a t ep r o g r a m t h e m e c h a n i s mo fc + + t e m p l a t ep r o g r a mi sat u r i n gc o m p l e t el a n g u a g e w h i c hn a i l sb y c + + c o m p i l e r i n t h i s p a p e r ab a s et e m p l a t el i b r a r y i s d e s i g n e dr u n n i n g i n c o m p i l e t i m eb e i n ga b a s i cl i b r a r y , i n c l u d i n gf l o wc o n t r o lm e t a f u n c t i o n ,b a s i ct o o l m e t a f u n c t i o n , e e l o r m a n a g ea n dc o m p i l i n g t i m e a s s e r t ,c o m p i l i n g t i m e t y p e c o n t a i n e r , t y p e t r a i tm e t a - f u n c t i o n w h i c hi sab e n e f i t s u p p l e m e n t o fc + + o r i e n t e d o b j e c tp r o g r a m k e y w o r d s :d o m a i ne n g i n c c r , d o m a i na n a l y s i s ,d s kc o d eg e n e r a t o r , g e n e r a t o r 西南交通大学硕士研究生学位论文第1 页 1 1 领域工程综述 第1 章绪论 随着支持面向对象机制的编程语言不断普及,面向对象的分析( o o a ) 和面向 对象的设计( 0 0 d ) 也大行其道,比较具有代表性的是统一软件过程【”,它支持以 u m l 2 】为核心的分析设计过程,通过用例图、状态图、活动图和类图直观的工作 成果来表达最终符合客户需求的软件产品。 但是,o o a o o d 仍有其不足之处挪: o o a o o d 往往专注于对具体的应用进行建模,而不是关注于一“族”软 件系统的建模,也就是说o o a o o d 没有区分为熏用丽进行的软件工程和 带有重用的软件工程,因此造成面向对象系统的熏用性并不理想。 面向对象机制提供了一些对差异性建模的方法,比如:继承、多态、重 载等等,但这些方法都局限于一个应用程序内部,并没有区分多个应用 程序之间的差异,这造成了一些面向对象框架过于庞大,使用这种框架 的应用程序也过于庞大,为了能够顺利编译,应用程序内部被迫包含了 一些用不到的框架产物。这方面的一个例子就是微软的m f c n ,用m f c 类库编译个小程序要想在任何w i n d o w s 下单独运行都需要1 m 左右, 而相比之下引入了模板机制的a t l ! 习( 活动模板库) w t l ( w i n d o w s 模板 库) 完成相同的界面工作往往只需要几十k 而已。 面向对象的动态绑定机制造成程序运行效率低下。这也是数值分析领域 很少有纯面向对象设计的原因,几种流行的c + + 库如s t l n 、b l i t z + + 年n m t l 无不通过模板使用引入静态绑定机制来提高效率。 o o a o o d 在处理需求问题时,往往直接的和面向对象机制结合在一起, 也就是说没有做到分析和实现无关,比如,对问题的差异点进行建模时, u m l 类图直接指定了继承、多态等机制。这样就大大限制了使用一些非 面向对象,但效果更好的方法来进行实现的可能性。 使用领域工程的分析设计方法可以在菜种程度上解决上述问题,领域工程并 不完全排斥面向对象的分析和设计方法,两者可结合在一起互为补充。 西南交通大学硕士研究生学位论文第2 页 c + + 模板本身包含了图灵完备的编程机制,c + + 编译器可看做一个虚拟机,对 静态模板程序进行解释和运行。因为静态的模扳程序和动态的c + + 代码同是标准 c + + ,我们可以利用静态代码解释输入的软件规范,生成合适的,编译好的高效 的软件模块,从而在一定程度上实现软件模块的自动生成。 领域工程( d o m a i ne n g i n e e r i n g ) 是一种软件设计规程,注重对业务( 一 个领域) 的抽象,形成软件系统族【”,目的是实现设计和工件的复用。我们可 以把根据业务系统类别组织的领域称为纵向领域( v e r t i c a ld o m a i n ) ,例如订 单处理系统、库存管理系统、矩阵计算系统等。我们也可以根据软件系统部件 的功能进行类别组织的领域称为横向领域( h o r i z o n t a ld o m a i n ) ,例如数据库 系统、容器库、算法库、数值计算代码库等等。领域工程包括领域分析、领域 设计和领域实现。 应用工程( a p p l i c a t i o ne n g i n e e r i n g ) 是根据领域工程的结果和具体和客户 需求构建软件系统的进程。在应用工程中将客户需求匹配到具体的技术结构( 比 如类、函数、模板、类层次数据结构) 中,在应用工程中重用领域工程的结果, 利用领域工程中开发的可重用资源制件来制件具体的软件系统。如图1 - 1 所示 i s ,领域工程和应用工程是两个并行的过程。 领域工程 应用工程 圈1 - 1 墨于领域工程的软件开发 领域工程本身是和语言无关的,但是像类似于j a v a 的这种纯面向对象的语 言不足以支持领域工程的全部机制。c + + 是目前流行的最复杂的高级编程语言, 它支持:面向过程的程序设计、面向对象的程序设计和泛型程序设计方法。而 使用模板机制的泛型程序设计是面向对象程序设计的重要补充,在后面我们将 看到这一点。 西南交通太学硕士研究生学位论文第3 页 传统的软件工程,专注于对一个单独的客户需要;提出其解决方案,领域 工程则关注对于一族或是类的业务领域提出可重用的解决方案。 表1 1 领域工程的三种主要过程及目标日l 领域工程过程主要目标 领域分析确实领域范围,定义用于领域内系统的可重用需求 领域设计设计用于领域内软件族的通用架构 领域实现实现设计,产生可重用的软件系统,可能包括架构、可重用类、组件、 特定的领域定义语言、产生器等 1 2 领域工程的软件工程过程 1 2 。1 领域分析 领域分析主要包括这面两种主要的活动: 确定领域范围:进行需求业务分析和风险分析,识别主要风险并确定领 域范围。 领域建模:通过收集相关的领域信息并产生领域模型。 领域分析和最终目的是让设计者和用户都能获得最大利益。 在确定领域范围时,领域信息的来源可通过该颁域已有的系统、领域专家、 系统使用手册、原型、实验与未来系统有关的的已知需求、当前或潜在的客户、 标准、市场调研、技术预测等手段。多数软件开发都是由单个客户的需求所驱 动的,在进行领域分析时,要将分析拓展到多个客户的需求。这些多客户视点 有助于识别关键的业务领域。 领域分析关注是“系统族”( f a m i l y ) 的发现,族可简单定义为一组具有相 同性质的软件系统。值的注意的是,面向对象分析是发现族的一种特殊情况: 类为对象族、类层次为类族。领域分析是的族还包括架构、组件、库、算法等。 通过对系统族的关注,保证了其工作产品和后继工作的可重用性。 下面是由a r a n g o 编缉总结的领域分析活动的列表【9 1 : 表1 - 2 领域分析主要活动 l 领域分析的主要活动i 活动详解l 西南交通大学硕士研究生学位论文第4 页 选择领域 进行业务分析和风险分析,以判断哪一个领域满足组织的业务目 标,识别风险承担者和目标。 领域描述 定义领域范围定义领域的边界和内容 数据来源识别 识别领域知识的来源 信息储存的准备 创建数据来源的信息储备 抽象复原 复原抽象信息 知识启发 数据收集( 领域建模) 利用领域专家窟发知识 文献回顾 背景知识分析 实体、操作和关系识别 分析数据中的实体,相互的操作和实体之间的关系。 模块化 使用合适的建模技术,例如:面向对象分析或面向过程分析,标 识设计决策 相似性分析 分析实体、活动、事件、关系和结构等之间的相似性 数据分析( 领域建模) 差异性分析 分析实体、活动、事件、关系和结构等之间的差异性 组合分析 分析暗示典型结构或行为模式的组合。 权衡分析 分析那些存在的矛盾,例如:时间与空间,实现和成本。井做出 相应的权衡。 分群 分类( 领域建模) 集群描述 1 2 2 领域设计 领域设计的主要活动是: 开发用于领域系统族和一个架构。 制定出由架构产生具体制品的方案。 根椐b u s c h m a n n 等提出的软件架构的定义【1 0 】:软件架构是对一个软件系统 的子系统和组件以及它们之间关系的描述,典型情况下,在不同的视图中,指 定予系统和组件,以显示这个软件系统相应的功能和非功能属性。系统的软件 架构是一个工件( a r t i f a c t ) ,它是软件开发的结果。系统的架构设计的依据是 领域分析的结果,架构设计的耳的是提蹬一个灵活的系统架构,能够满足所有 熏要的需求,同时为系统的具体实现和需求的演化保留最大的灵活程度。 设计一个好的软件架构,我们需要: 考虑功能需求。 考虑非功能需求。 对系统进行清晰的划分,使用各部分的互相影响降到最低。 模块的高内聚。 考虑利用已知的设计和架构模式。 领域设计的另外一个方面是产生方案,领域设计需簧描述具体的应用系统如 何由通用的软件架构和组件产生出来的。产生方案向请求具体系统的客户描述 对外接口、组装组件的过程、处理变更请求和定制开发的过程以及和生产过程 的测量、跟踪和优化。 组装过程有三种自动化级别: 西南交通大学硕士研究生学位论文第6 页 手工组装:系统的组装要配合开发者的指导,组装可能会用到开发时的 源代码,组装要受到开发者的指导。这种组装难度较大,要求对架构和 组件有较深的理解,但能够发挥出架构和组件的全部功能。 自动组装支持:组件和组装被各种工具所支持,包括组件测览查找工具 以及自动化选择应用程序开发方面的产生器。 组装自动化:这是最成熟的级别,有一组工具支持由客户定制软件的过 程,并且整个应用程序可以由定制记录产生。 1 2 3 领域实现 领域实现的主要活动是使用合适的技术来实现领域设计中的产品架构、组 件和产生方案。产生方案的实现可能需要编写开发人员指南、实现领域特定语 言( d o m a i n - s p e c i f i cl a n g u a g e ,d s l ) 和定制6 u i 、产生器等活动。 领域特定语言是一种特定的、面向具体问题的语言,在实现了领域的架构和 组件后,可以利用领域特定语言来产生具体的软件产品。软件产品可以是具体 的源程序,也可以是编译好的软件模块。领域特定语言的一个成功例子是s o l , s o l 提供了面向关系数据库具体应用的一种语言,可以方便在的应用程序中利用 s q l 使用数据库系统的能力。 由于c + + 支持面向过程的程序设计、面向对象的程序设计和泛型程序设计多 种范型的程序设计方法,使用c + + 语言成为目前理想的实现底层架构的语言。 1 3 本文的研究工作 使用面向特征领域工程方法和c + + 程序设计语言,本文实现了软件模块的自 动生成。本文关注的特定领域是经典的数据容器领域,软件系统族的建立使用 c + + 程序设计语言和面向对象的程序设计方法。由特定的产生器来实现软件模块 的自动生成,产生器使用c + + 的模板编译机制来设计,产生器中包括了d s l 的定 义和解释。 通过对c + + 模板编程机制的研究和实践表明,c 十+ 的模板机制本身构成一个 图灵完备的静态程序设计语言,可以由c + + 编译器解释执行,本文实现了一个面 向模板静态程序设计的基本模板库( b t l ) ,运行在编译期,可作为c + + 面向对象 西南交通大学硕士研究生学位论文第7 页 程序设计的有益补充。 本文认为,适用于软件模块自动生成的软件工程方法是领域工程方法,本 文总结了软件模块自动生成所用到的领域工程的过程和技术方法。同时,针对 c + + 语言的静态编程机制,本文定义了基本模板库( b t l ) ,模板库中的惯用法并 不新鲜,但可以综合起来做为静态编程的基础库,并不断加以扩充。在文章的 最后一部分,使用b t l 和g e n v o c a 架构,实现了一个链表数据容器的组件编写 和自动生成。 西南交通大学硕士研究生学位论文第8 页 第2 章领域工程技术方法 使用领域过程来实现软件模块的自动生成需要用到多种具体的工程技术方 法,包括领域分析、领域设计和领域实现。在颁域实现的过程中,本文关注针 对c + + 语言的产生器技术。所用到的领域工程技术方法主要有:共同性和差异 性分析、应用领域分析、特征建模、领域特定语言、产生器技术。 2 1 共同性分析 领域分析关注“系统族”的发现,共同性分析是发现“族”的主要方法。 共同性( 和差异) 分析是人脑形成抽象的本质,软件设计是建立在对客观事物 进行抽象的基础上的,通过抽象,我们可现发现程序集合背后芙同的性质,从 而形成“系统族”,“系统族”是可重用的基础。通过抽象发现共同性是基本的 领域分析方法。共同性的发现往往高于具体业务,共同性常常捕获不随时间、 空间变化的领域知识抽象。 共同性分析和“低耦舍、高内聚”这两个重要的设计原则紧密结合在一起 的,“低耦合、高内聚”虽然常常和面向对象的设计方法联系在一起【1 1 】,事实这 两条原则不仅仅适合面向对象方法,在使用任何方法的程序设计中,这两条设 计原则都很薰用。软件设计需要创建出相对独立的软件模块,这些软件模块可 以单独的进行建立、实现和维护,并且每一个软件模块都是一个概念整体,从 而使整个系统更容易理解。共同性分析通过抽象并分类,自然将系统划分为相 对独立的组决( c h u n k ) ,因为各个组块之间与其他组块韵共同性很少,所以这些 组块之间相互的依赖程序就小。 可以通过两种方法来认识到共同性。第一种方法是从领域知识中找到我们 以前见过的模式或是原型。第二种方法是对陌生的原型知识总结出新的模式。 前者利用的是“经验知识”通过“归纳”的思维方法,将原型或是框架作为发 计基础。后者利用的“学习能力”通过“演绎”的思维方法。 在进行共同性分析时,可以利用领域经验,将问题划分为可以被接受的多 个分领域,划分的形式和标准有多种,比如:划分基类的标准和划分基类与派 生类的标准有所不同。一些可能的划分维度有:结构、类型、名字、行为、类 西南交通大学硕士研究生学位论文第9 页 别、算法、过程等。事实上,在共同性分析的同时我们也在进行着差异性分析, 这些维度往往也就是我们寻找差异性的的基础。 在进行共同性分析时,可能会需要关注随时间保持稳定的抽象。这样有利 于构筑一个能够适应未来变化的系统。我们希望大部分变化只产生局部的影相, 不影响全局接口。这意味着这些变化不影响实现共同性分析的的抽象结构的基 础。因些,我们在领域内实行共同性分析时,不仅要看到领域内知识结构的共 同性,还要关注领域知识的演化情况,要了解未来的领域知识是否和如今一致。 在实行共同性分析以后,可以用下面的标准对分析结果进行评估【1 2 1 : 所有的族成员的共同属性是否都已经进行了描述? 共同性是否可以用更精确的方式表达出来? 这些共同性是否准确? 这些共同性是否一致? 这些共同性抽象的是否彻底? 是否抽象出了不随时间变化的共同性? 2 2 差异性分析 共同性分析是目的是为了寻找领域中“软件族”成员的相同的属性,但是 光有共同性分析是不够的,我们必须还要关注合族成员之间的差异性。共同性 分析往往是为了构建领域实现的总体架构,是系统的可重用部分,而最终具体 的领域实现离不汗差异性分析,差异性分析驱动了架构的适用能力。 差异性分析区分了软件族的各个成员。差异性分析的结果可以是表现为参 数,当根据共同性分析和差异性分析的软件架构建立起来之后,我们可以通过 输入这些参数来产生需要的软件系统,这种软件系统可以是程序代码,也可以 是编译好的软件模块。 例如:在c 上+ 语言中可以通过 v e c t o r v e c s t r : 来定义一个容纳s t r i n g 类型的矢量容器,当系统编译时,自动生成专门容 纳s t r i n g 的变量。在这里,共同性分析使我们定义了矢量容器类的总体结构, 但在运行中容器中容纳的类型不同是差异性分析的结果,最终的架构通过应用 模板参数,即保证的总体架构的可重用性,又让最终的软件模块针对每种类型 西南交通大学硕士研究生学位论文第10 页 的保证了高效率。 对于上面的问题,也可以通过面向对象中的共同基类或是接口来实现,但 最终实现效率不高,这是因为在分析时没有对绑定时间的差异性进行分析。大 多数高级语言的绑定时间包括“编译时间”和“运行时间”。模板参数机制在编 译时间绑定具体类型,而接口或虚函数机制在运行时间绑定具体类型。后者的 效率明显不如前者。 一些高级语言特性也提供了对差异性的支持,比如:函数重载、函数参数、 参数默认值、基类和派生类、接口和虚函数、条件编译机制等。 按照辨证思考的原理共同性分析和差异性分析是密不可分的。共同性分析 是差异性分析的前提,是构成差异性的基础,没有共同性也就谈不上什么差异 性,同样差异性分析也或不可缺,离开了差异性分析,共同性分析也就失去了 意义。共同性分析和差异性分析互相联系,互为补充构成了整个领域分析的基 础。 在实行差异性分析以后,可以用下面的标准对分析结果进行评估1 1 2 】: 差异性的参数领域是否覆盖了应用领域差异性的范围。 有没有无法对应差异性的差异参数? 或反之,是否存在没有被差异参数 描述的差异性。 默认值是否合适并在参数领域内。 每种差异性是否可以描述的更加精确? 是否存在不一致的差异性? 差异性是否可以很好的预测变化? 排除了什么样的族成员? 2 3 应用领域分析 传统的分析研究的是特定的问题,而在进行领域分析时,研究的是整个问 题空间,或者说是一个问题族。在大多数具体的软件项目中,客户需求往往是 不完整,不完善的,随着开发的深入,需求会产生变化。很多软件工程方法会 关注这种变化,比如:敏捷软件工程方法鼓励变化越早发生越好。但是大多数 方法只能等待变化发生来消极应对。好的分析设计人员会利用一些模式和架构 来将变化的损失降至最低,但这要依赖经验。 西南交通大学硕士研究生学位论文第1 1 页 领域分析通过对问题空间的共同性分析和差异性分析来产生系统族的软件 架构来解决这个问题。领域工程通过从系统族和组件库中产生解决方案的方式 来隔离变化,这种产生过程往往可以是自动化或是半自动化的。 领域分析包括三种关键活动:识别业务领域、将业务领域分成多个子领域、 对每个子领域中建立抽象进行分析。 领域分析通过将单个客户需求扩展到多个客户需求或是整个行业来识别业 务领域。识别业务领域包括确定领域范围和领域特征。可以通过一些方法来帮 助解决这个问题。在分析过程中,可以建立领域词典和领域知识源的记录,并 在领域分析过程中保持同步更新,可以用领域特征图来总结和表达对领域特征 分析的结果。 定义好业务领域后,可以进一步进行子领域的划分,在划分过程中会用到 共同性分析和差异性分析。子领域是将整个系统分成多个独立的、可管理的部 分,往往以软件模块、框架或是组件库的形式出现。好的予领域划分能够做到 各子领域之间存在一定的正交性,也就是说,子领域之间显有明显的差异参数, 相互之间的影响最小,予领域往往可以被单独开发。予领域的划分是建立在对 领域范围内的客户需求和软件需求深入分析的基础上的。 子领域的划分完成后,如果子领域的复杂度还是太高,可以在子领域中继 续进行共同性分析和差异性分析,对子领域进行进一步的分析,不断迭代最终 确定整个领域的特征细节和范围。最细节的分析往往可以和具体的实现语言的 特性对应起来。 2 4 特征建模 特征建模是领域工程提出的捕捉差异性的关键性技术,是专为重用丽进行 的建模方法。通过特征建模产生的特征模型提供了一个抽象的( 和具体实现无 关) 、精简的并且包含明确差异点的建模技术。特征建模技术适用于各个层次: 系统级、子系统级、类和过程级。特征建模技术可以帮助避免两个熏要问题: 在可重用的软件中没有包含领域分析定义的领域特征和差异点。 包含了领域特征和差异点,但没有人使用它们,因此导致了不必要的复 杂性和开发维护的成本。 特征建模就是对概念和通用和可变属性以及它们的相互依赖关系进行建 西南交通大学硕士研究生学位论文第12 页 模,并组织成一个一致性的模型,该模型称为特征模型【1 3 l 。 在领域工程中,特征表示可重用、配置的需求。一个领域中的任何基本成 分和基本结构都可以做为建模的对象,包括:用例、o o 类、函数、过程、算法 等等。 在领域工程中,其它的建模形式可以做为特征建模的补充, e 如:类图、 交互图、活动图、状态转换图等。 个特征模型代表概念实例的共同性和差异性特征,以及差异性特征之间 的关系和依赖特征模型是在特征建模中过程中构建出来。由于概念的抽象性, 在软件中不可能穷尽概念的各个方面,特征模型用来表示我们所感兴趣的概念 实例的特征集合。 一个特征模型可以用特征图和某些附加信息来表示。一个特征图包含一组 节点、一组有向边和一组边的修饰。节点和边构成棵树。边的修饰是连接从 一个节点出来的所有边的子集的孤。边的修饰把节点的子节点分成多个不相交 的子集,定义了一个节点的子节点的一个划分。 一个特征图的根代表一个概念,叫做概念节点。其它的节点表示特征,称 为特征节点。一个特征节点的父节点是一个概念节点,或是是另外一个特征节 点。如图2 - 1 ,该图表示了一个概念c 的特征图,c 具有三个特征f l ,f 2 ,f 3 ,其 中f 1 的父节点是c ,f 2 的父节点是是f 1 ,f 3 的父节点是f 2 。通过这些关系我 们可以定义:f l 是c 的直接特征,f 2 和f 3 是c 的非直接特征,f 2 是f 1 的直接 予特征,f 3 是f l 的非直接子特征。 西南交通大学硕士研究生学位论文第13 页 圈2 - i 具有三个特征的特征圈 一个概念的实例描述是一组节点,这组节点总是包括概念节点以及部分或 者所有的特征节点。在一个特征图中,可以通过下面的方法来生成个概念的 实例:从特征图中的根节点开始遍历特征图,先添加概念节点,然后根据访问 节点的类型,访问节点是否被包含在特征组中,得到一个概念实例的有效描述。 在特征图中,一个节点可以直接引出多个边,也就是可以具有多个特征, 这些特征和节点的关系可以通过边的修饰来描述,区分为:强制特征、选择特 征( a l t e r n a t i v ef e a t u r e ) 和可选特征。 强制特征被包含在一个概念的实例的描述中,当且仅当它豹父节点包括在 实例的描述之中。由定义可以推出,如果是一个强制特征的父节点是可选的, 并且没有被包含在概念的实例描述中,那么强制特征就不能称为概念描述的一 部分。 强制特征节点的图形表示是:一个没有弧修饰的边作为入边,并且该边的 末尾用个实心圆终结。如图2 - 2 所示: 西南交通大学硕士研究生学位论文第14 页 圈2 - 2 强制特征特征圈 图2 - 2 表示:f l 、f 2 、f 3 、f 4 都是概念c 的强带特征。概念c 的每一个实 例都具有特征f l 和f 2 ,并且每个具有特征f 1 的c 实例也具有特征f 3 和f 4 , 因为特征f l 是每一个c 实例所必须具有的,所以每一个c 实例也就必段具有特 征f 3 和f 4 ,因此,f 1 、f 2 、f 3 、f 4 是概念c 的强制特征。每一个c 盼实例都 可以通过特征组 c ,f l ,f 2 ,f 3 ,f 4 ) 来描述。 可选特征可以包含在一个概念的实例描述中,当且仅当它的父节点包含在 该描述中。也就是说,如果父节点被包含在描述中,那么可选特征可以被包含, 也可以不被包含,但是如果父节点没有被包含在描述中,可选特征就定不能 被包含。 可选特征的图形表示是:一个没有弧修饰的边作为入边,并且该边的末尾 用一个空心圆终结。如图2 - 3 所示: 西南交通大学硕士研究生学位论文第15 页 n 一 西南交通大学硕士研究生学位论文第16 页 特征图中一个只有一组选择特征没有其它直接子特征的节点称之为维度; 另外一种比较宽泛的定义是,一个维度除了一组选择特征外还可以包括一个或 是多个强制特征。如图2 - 5 所示,f l 是一个维度,f 2 也符合比较宽泛的维度定 义,f 3 不是维度。 田2 - 5 具有维度的特征圉 维度也有选择维度,一组选择维度中的一个包含在一个概念实例的描述中,当 且仅当它的父节点包食在描述中。如图2 - 6 所示:f l 和f 2 是一组选择维度。 圈2 - 6 具有选择维度的特征圈 维度也有可选维度,可选维度中的一个包含在一个概念实例的描述中,当 酉南套通大学硕士研究生学位论文第17 页 且仅当它的父节点包含在描述中。如图2 7 所示:f 1 和f 2 是一组可选维度。 f t 西南交通大学硕士研究生学位论文第18 页 可以用特征图对概念的实例进行描述。 在特征建模中定义了些表达概念的共同性和差异性的名词。表达共同性 的名词主要是通用特征和通用子特征。 通用特征是在概念的所有实例都出现的特征。由上述定义可以看出,所有 的父节点是概念的强制特征,本身就是通用特征。或者说,如果个特征是一 个强制特征,并且是概念的直接特征,或者有由概念到些强制特征有一条路径, 这条路径上的所有节点都是强制特征,那么这个特征就是概念的通用特征。 通用子特征是相对特征节点而言的( 通用特征是相对概念节点相言) 。特征 f 的子特征是通用予特征当且仅当该子特征出现在拥有f 的所有概念实例的描 述中。由上述定义可知,如果子特征是强制特征,或者存在由f 到该子特征的 一条路径,该路径上的有所有节点都是强制特征,那么这个子特征为特征f 的 通用子特征。 表达差异性的特征建模名词育:可变特征、变异点、互斥特征等。 可变特征指的悬可选特征、选择特征、可选特征和0 1 特征。上述四种特征 类型统称为可变特征。 变异点f 1 4 j 是指可选特征所附加( 为出边) 的节点。或者说:一个变异点是 一个具有至少一人直接可变予特征( 或特征) 的特征( 或者概念) 。变异点又可 以细节为多种类型,如表2 - 1 所示。 衰2 - i 变异点类型 变异点类型定义 维度这种特征( 或者概念) 的所有直接子特征( 或者特征) 都是选择特征。 具有可选特征的这种特征( 或者概念) 的所有童接子特征( 或者特征) 都是选择可选 维度 特征。 扩展点这种特征( 或者概念) 具有至少一个直接可选子特征( 或者特征) ,或 者至少一级直接o f 子特征( 或者o r 特征) 。 具有可选特征的这种特征( 或者概念) 的所有宣接子特征( 或者特征) 都是可选特征。 扩展点 具有o r 特征的扩这种特征( 或者概念) 的所有直接子特征( 或者特征) 都是。r 特征 展点 同类与非同类变一个变异点的所有直接子特征( 或者特征) 属于相同的特征类型,贝 异点为同类变异点,否则是非同类变异点。 单一与非单一变在对一个概念实例的描述中,包含最多一个直接可交子特征( 或者特 异点征) 的的变异点为单一变异点,否则为非单一变异点。 互斥特征指的是在一个特征图中,如果没有一个概念的实例描述可以同时拥 有这两个特征,那么这两个概念就是互斥的。在一个树形特征图中,如果两个 特征在同一组选择特征中,或者一个特征的宣接父节点或者任何一个非直接父 节点与另一个特征的直接父节点或都任何一个非直接父节点处于同一组选择特 征中,那么这两个特征就是互斥的。 一个完整的特征模型由特征图和与其它相关信息组成,这些信息包食了对特 征图的注释和附加信息,具体包括网: 语义描述:对特征图中每一个特征的语义描述。图形系统比较直观,而 语义描述则更加严谨和详细。在语义描述中可能会利用到某些其它的模 型,例如:交互图、伪代码、公式等。在语义描述中可能会指出该特征 所在方面的类别,如:功能、性能、安全性等。 原理:一个特征具有一个标注,解释为什么在这个模型中包含这个特征。 同时也指明选择这个特征和不选择这个特征的条件和建议。 风险承担者和客户程序:用对特征感兴趣和风险承担者( 例如用户、开 发人员、产品经理、测试人员) 的不同角度来注解特征,有时需要用使 用这种特征的客户程序来加以注解。 范本系统:使用已知的实现了这些特征的范本系统来注解特征。 约束和默认依赖规则:约束是可变特征之间的依赖关系,约束可能跨越 多个特征视图。两种重要的约束是互斥约束( 描述非法的可变特征组合) 西南交通大学硕士研究生学位论文第2 0 页 和依赖约束( 一个特征要求其它特征出现) 。默认依赖是指在没有提供 合适的特征参数值的情况下,特征的默认参数。约束和默认依赖规则某 些特征和特征参数的自动化配置和生成提供了必要条件。 有效站点、绑定站点和绑定模式:有效站点描述一个可变特征在何时、 何地和对谁是可用的,而绑定站点描述在何时、何地、由谁绑定一个特 征,绑定模式决定一个特征是静态的、可交的或者是动态绑定的。 开放封闭属性:如果期望新的直接可变子特征,那么就将变异点标记 为开放( 0 p e n ) 。例如:矩阵的元素类型可以是整型、单精度、双精度 等类型,标记为o p e n 以表示需要时可以添加其它类型。通过把一个变 异点标记为封闭( c l o s e d ) ,表示不期望其它的直接可变子特征。 优先级:可以把优先级分配给特征或者是予特征。 特征建模的一般过程是: 1 )通过领域信息收集、领域知识获取、抽象分析等方法发现基本概念和特 征。 2 ) 通过共同性分析,发现通用特征。 3 )通过差异性分析,发现可交特征。 4 )将分析结果用特征图来表示,并在特征图中将发现的特征进行组织,并 按照强制、选择、o r 及可选选择特征等方式进行分类。 5 )分析特征的组合和交互。找到特征的互斥和依赖关系。 6 )记录各特征和概念的额外信息。 2 5 领域特定语言 领域特定语言( d o m a i n s p e c i f i cl a n g u a g e ,d s l ) 是一种特化的、面向具 体问题的语言。领域工程的目的是为了生产可重用的软件,当构建好族件族、 架构、组件、库后,需要一种方式产生出面向不同应用的具体软件产品,这种 软件产品可以是编译好的软件模块,也可以是具体的高级语言源程序。领域特 亘壹变道太字砸研究生学位论文第2 1 页 定语言实现了这一功能。 在软件工程中,有试图想描述切问题的语言,比如u m l ,但是光有这种语 言是远远不够的,我们需要一种能在不同的领域中描述特定问题的特定语言例 如:在关系数据库领域比较成功的领域特定语言是s q l 。 领域特定语言中的语言是一个泛化的概念,领域特定语言可以是文本的( 例 如s q l ) ,也可以是图形化的( 例如大多数高级语言i d e 中的g u i 设计器) 。 使用领域特定语言,可以使用软件重用变的自动化或是半自动化,大大减少 了从系统软件族到具体软件产品之间的转换难度。实现领域特定语言的技术有 下面三种: 预处理器技术。预处理器技术一般处理文本形式的领域特定语言,在这 里,领域特定语言其有严格的语法规则,利用编译技术来处理领域特定 语言并生成需要的软件产品或是源程序【阚。一般来讲,预处理器技术中 的领域特定语言的复杂程度要比生成的源程序的复杂程度小的多,这种 领域特定语言是建立在对生成源程序进行精化,并在盾台建立好庞大的 库或组件的基础上,领域特定语言往往只负责对延伸出的接口进行配 置。 高级语言的语言扩展机制。目前流行的高级语言c + + 就提供了各种机制, 可以对编码符号进行扩展和变形。比如其内置的运算符重载、模板机制、 模板元程序设计、仿函数、d e f i n e 等。幂q 用这些高级语言提供的功能, 可以将c + + 语言转化为面目全非的领域特定语言进行编码,然后再利用 后台的库和编译器产生出效率极高的c 十+ 软件模块,举个简单的例子: 只利用d e f i n e 机制,就可以用汉字进行编程,转换成标准c + + 语法的过 程全由编译器负责。 可视化编程环境。如前所述,领域特定语言可以是图形的。可以在图形 环境下设计程序,并由后台程序转化成目标语言或是软件模块。目前, 在大多数商业高级语言开发环境中都提供了gui 设计界面。这种方式 西南交通大学硕士研究生学位论文第2 2 页 可以应用到更专门的领域,比如说:数据库查询生成器,数学公式自动 编程、控制流自动生成、0le 链接技术等。 上述三种技术在某些环境下可以混合应用,来提高编程效率,在很多商业开 发环境下已经隐含提供了这些技术。领域特定语言在强大的库和组件的基础 上,提供了一种自动化生产软件和重用软件的有效途径。 2 6 产生器技术 产生器f 1 7 】f 1 8 是一段软件程序,它根据高层规范来自动生成软件系统,这个 软件系统包括过程、函数、组件、类、模块等。自动生成的软件系统可以是某 种高级语言的源程序,也可以是编译后的产物。在某些高级语言中,编译器本 身可作为产生器的一个重要组成部分。 高级语言写如的程序相对而言比较复杂、难予理解同时也不面向特定的领 域。由于即要面向对软件的客户需求,又要实现底层的软件需求( 比如:性能、 安全性) ,某些具有底层机制的编写出来的程序往往不好理解,不具备曝确的意 图性,例如:c + + ,c 。而相对一些更脱离机器的高级语言( 例如j a v a ) ,又失去 了底性机制所带来的灵活性、性能等优势,例如j a v a 。我们可以把底层的一些 工作交给产生器来做,把高层规范做为产生器的输入,产生器自动生成底层其 有性能优势的软件模块。 产生器 检查规范 规范完成 底层优化 图2 - 9 产生器模型 如图2 - 9 所示,一个典型的产生器一般要完成下列任务: 检查输入规范的有效性,包括规范的语法和语义( 对于文本格式) ,如 有必要输出报告检查结果。 西南交通大学硕士研究生学位论文第2 3 页 根据产生器的预先设置,对规范进行补充配置。编写产生器规范面向系 统族领域,输入规范面向应用领域,可以根据在产生器中预先配置的领 域知识,补充应用领域规范,这样可以输入规范的编写复杂性。 根据规范要求或是默认设置进行各种优化,可能包括运行空间、时间等 方面的优化。 产生具体软件系统实现 产生器的实现技术包括各个方面的层次,如编译器、预处理器、元函数、c a s e 工具,图形编程工具等。不同的工具面向的层次不同,通常越高级的层次就越 需要最多的自动化支持【柳,底层的实现往往比较复杂,这在某种程序中是把负 担转移到库和组件的提供商向上,这要库、组件和底层代码提供商进行良好的 领域分析,而高层产生器更加面向应用领域。 产生器可以看作一个转换引擎1 2 0 i ,软件高层规范通过这个转换引擎转化成 软件实现。这个过程可能是一个逐步演化的过程,产生器在各个演化关键环节 进行演化,最后面向客户的是意图明显的,易于使用的领域特定语言接口,领 域特定语言可以是文本或是图形形式,但是一定可以容易的被该领域的客户所 接受,比起底层的计算机编程语言,这种领域特定语言对客户来讲更加易于使 用和理解。产生器实现的是领域特定语言所描述的软件规范到软件实现的转换, 这种转换理想情况下以自动化的形式实现。 2 7c + + 静态模板元程序设计 在领域工程中,系统族软件以库、组件等形式出现,我们需要有一种方法能 自动化组件装配、目标代码产生的工作,元程序设计是实现这一功能的理想方 法,元程序实际就是“产生程序的程序”。c + + 模板机制允许通过模板代码来控制 编译器产生在运行时合

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论