




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 摘要 代码自动生成技术有着非常广泛的实际应用。 本论文在考察代码自动生成技术,尤其是基于模板语言的生成技术的基础 上,提出了一种新的基于x m l 和模板语言的代码自动生成技术。该技术提供了 一种新的模板语言s p o n g e t l 及其应用框架s p o n g e 。 s p o n g e 设计思路提供了一种高效的生成器设计方法。其核心是模板语言 s p o n g e t l 。它基于x m l 描述文法,并利用x s l t 来生成其解析器。同时借鉴其 他模板语言的转义设计方法,使得s p o n g e t l 语法虽简单却有着较强的功能。 s p o n g e 框架使得s p o n g e t l 更容易嵌入到其它应用系统中。此外,对于一般非商 业化生成器对u n i c o d e 支持不够的缺陷,s p o n g e 的设计方法也提供了较好的解 决方法。 关键字代码自动生成x s l tx p a t h 模扳语言 垒! ! ! ! 竺! 一一 a b s t r a c t a u t o m a t i cg e n e r a t i o no f c o d eh a sb e e na p p l i e db r o a d l y t h i st h e s i sr e v i e w sv a r i o u sc o d eg e n e r a t i o ne s p e c i a l l yc o d eg e n e r a t i o nb a s e do n t e m p l a t el a n g u a g e t h e n ,t h i st h e s i sr e p r e s e n t san e wt e c h n o l o g yo f c o d eg e n e r a t i o n b a s e do nx m la n dt e m p l a t el a n g u a g e an e wt e m p l a t el a n g u a g en a m e ds p o n g e t l a n da n a p p l i c a t i o n f r a m e w o r kn a m e d s p o n g e a r ed e s i g n e di nt h i st h e s i s t h ed e s i g ni d e ao fs p o n g ep r o v i d e sa l lh i g he f f e c t i v em e t h o dt od e s i g nac o d e g e n e r a t o r t h ec o r eo fs p o n g e i ss p o n g e t lw h i c hi sr e s t r i c t e dt ox m ls c h e m a a n d t h ep a r s e ro f s p o n g e t l i sg e n e r a t e du s i n gx s l t a l t h o u g ht h es y n t a xo f s p o n g e t l i s s i m p l e ,i tm a y b ev e r yu s e f u la c c o r d i n gt oi t sd e s i g no ft r a n s f e r r e dm e a n i n gd e r i v e d f r o mt h ed e s i g n i n go fo t h e rt e m p l a t el a n g u a g e s p o n g ef r a m e w o r km a k e ss p o n g e t l e a s yt ob ee m b e d d e di n t oo t h e ra p p l i c a t i o ns y s t e m s f u r t h e r m o r e ,s p o n g ep r o v i d e sa b e t t e rw a yt of i tu n i c o d ew h i c hn o r m a ln o n - t r a d ec o d eg e n e r a t o r sm a yn o ts u p p o r t v e r y w e l l k e y w o r d s c o d eg e n e r a t i o n ,x s l t , x p a t h ,t e m p l a t el a n g u a g e 2 前言 第一章前言 本部分主要论述了代码自动生成技术的发展背景及其研究概况,解释了选择 该题目的目的和实际意义,最后列出了论文的主体结构以及论文的创新点和未来 的展望。 1 1 背景 在过去的几十年中,涌现出了许多软件设计方法的理论和技术。从结构化程 序设计概念的提出,到模块化( m o d u l a d z a t i o n ) 、面向对象( o b j e c t - o r i e n t e d ) 技术的深入人心,泛型技术( g e n e r i cp r o g r a m m i n g ) 1 的日渐受重视等等,这些 技术都已被逐渐应用到软件设计实践中,为推动软件生产力的发展发挥了巨大的 作用。此外,多种设计理论,如设计模式( d e s i g n p a t t e r n s ) 2 面向方面的设计 ( a s p e c t o r i e n t e d ) 3 ,以及再生式程序设计( g e n e r a t i v ep r o g r a m m i n g ) 等等也逐 渐受到重视。这些技术涵盏了代码复用到软件架构复用等多种层次上的软件复 用。4 随着软件开发对软件复用的迫切需求,代码自动生成技术作为软件复用常用 的一种技术手段也越来越受到研究人员的关注。各种各样的代码生成器层出不 穷。 平心而论,代码自动生成技术并不是一个全新的概念,只是近年来它的作用 又重新得到了认识。尤其随着企业级软件应用的蓬勃兴起,软件开发技术的一系 列变革,代码自动生成技术的市场也得到了快速发展。 可以举一个常见的应用代码自动生成技术的例子。分布式系统e j b 规范中 定义了容器( c o n t a i n e r ) 的设计规范。在设计实体b e a n 时,开发人员只需要设 计远程接口( r e m o t e ) 、主接口( h o m e ) ,或者本地接口( l o c a l ) 、本地主接口 ( l o c a lh o m e ) 以及b e a n 本身等要素,容器会自动生成实现这些接口的实现类, 以及实际的b e a n 类。e j b 的这种架构,很好的将系统级的服务和具体业务应用 分隔开来。e j b 容器提供如事务、安全等系统级的服务,而开发人员只需要关注 和自己业务相关的具体事物。最终,由容器自动生成的那些实现类和容器的紧密 粘合来完成整个的企业应用。 需要特别指出的是,本论文所论及的代码自动生成技术和编译器设计领域中 的中间代码等的生成技术并不完全相同。后者通常的产物是可在一定平台上可直 接执行的代码:本文所指的代码自动生成技术通常是生成源代码,然后利用现成 的编译器生成可执行代码,而并不直接生成可执行代码。 本论文讨论研究的重点是就是指上述概念的代码自动生成技术。这方面的研 究非常多,有基于模型的代码自动生成( m o d e l b a s e dc o d eg e n e r a t i o n ) 、基于模 式的代码自动生成( p a r e m b a s e dc o d eg e n e r a t i o n ) 、基于模板的代码自动生成 ( t e m p l a t e b a s e d c o d eg e n e r a t i o n ) 等等。m d a ( m o d e ld r i v e na r c h i t e c t u r e ) 是 o m g 组织的标准,有关这方面的研究可以参考站点w w w o m g o r g ,文献6 对此有 概述。文献7 展现了一种从概念模型自动生成代码的技术。 文献3 是代码生成技术方面重要的文献和参考。它覆盖了创建复杂的应用框 架代码的技术和实现,展现了如何构建高质量、一致性和可维护的输出技术。 1 2 研究目的和意义 如何减低软件开发成本,提高生产效率,保障软件质量是软件复用的主题, 也是代码自动生成技术的内在要求。 代码自动生成技术有着很广泛的应用,从w e b 页面生成,站点生成,到企 业级应用中都有其身影。从实际项目开发的角度来说,使用代码自动生成技术是 为了节省软件开发的成本。对于一个原本可以通过创建代码生成器来提高开发效 率和收益的软件项目而言,如果其代码生成器的开发成本较高、功能不足或者难 以掌握使用的话,那么实际上创建该生成器并没有什么实际的意义。 使用代码自动生成技术可以批量生成所需要的代码,对于软件工程化开发有 着很实际的意义。 此外,软件架构的设计中也使用代码自动生成技术。例如e j b 架构,减轻 了应用开发人员的负担。 从目前的代码生成技术,尤其是通常的基于模板语言的代码生成技术来看 ( 不包括特定的商业化的生成器,这类生成器通常是作为独立的产品开发,而且 通常并不是采用下述的通用方法来开发,而是供应商自已专有的技术) ,其开发 的成本较高,大多需要从定义文法,编写词法和语义文件,然后使用编译器的编 译器( c o m p i l e r c o m p i l e r ) 来生成代码生成器。编写繁琐而不容易检查错误( 语 义动作的错误常常要到生成编译器时才发现) 的l r 或l l 文法常常使开发人员 气馁同时现有流行的c o m p i l e r - c o m p i l e r 如y a c c l e x 、a n t l r 、j a v a c c 等对 u n i c o d e 的支持程度也不够。所以,提供一种快速而正确的选择或者开发一种生 成器的途径就有着比较实际的意义。 本论文试图提供一种快速而灵活的开发一个代码生成器的新方法和技术框 架。 4 前言 1 3 纲要 第一章“前言”介绍了本论文研究的背景、以及论文的创新和意义等。初步 介绍了代码生成技术。 第二章“代码生成技术”综述了代码生成的各种技术模型,以及衡量的标准。 第三章“模板语言技术”介绍了常见的模板语言技术,及其在代码生成中的 应用。本章和前一章是本论文生成器的理论基础和应用设计参考,从生成器的设 计技术以及模板语言的应用角度来进行阐述。 第四章“模板语言s p o n g e t l ”是本论文的核心。s p o n g e t l 模板语言的设计 特色,文法以及一个在实际中的使用的应用框架s p o n g e 。 第五章“s p o n g e t l 应用实例”通过一些实例。展现了s o n g e t l 的运用。 最后附录给出了s p o n g e t l 的文法定义,以及该语言解析器的生成算法。 1 4 创新 本论文考察了主要的几种模板语言技术在代码自动生成领域的应用,比较了 它们之间的优缺点。在研究了代码自动生成技术,尤其是基于模板语言的代码自 动生成技术的基础上,提出了一种新的利用x m l 描述的模板语言s p o n g e t l 。 论文给出了该模板语言的文法,以及解析器的具体生成实现。为快速开发代码生 成器提供了一条新的思路。 s p o n g e t l 不同以往的一些模板语言。它采用了以下的新方法来实现。 首先,它是使用x m l 描述其文法。论文给出了该文法的x m ls c h e m a 。x m l s c h e m a 语言是利用可应用到一类x m l 文档上的规则或结构模块来进行形式化 约束的语言。9 其优点是文法描述的直观性,利用现有的诸多x m l 编辑工具,如 x m l s p y 等可以很清晰的展现其文法结构,避免了编写繁琐而易错的文法文件。 同时,通过x m l 的有效性检验,可以及时的检验文档的语法,避免意外的操作。 其次,s p o n g e t l 模板语言的解析器没有采用通常模板语言解析器的生成方 法,即直接构造a s t 抽象语法树,或使用y a c c l e x 、a n t l r 、j a v a c c 等 c o m p i l e r - c o m p i l e r 来生成,而是使用x s l t 技术来生成。这样的优点在于模板解 析器的生成方法简单,其生成的代价不高,而且由于使用x m l 的缘故对于 u n i c o d e 的支持是自然的。 第三,s p o n g e t l 模板语言的文法简洁,但功能强大。设计方法借鉴了j s p 等脚本语言的设计方法,引入了转义功能。可以使用转义文法使用现有的其他功 能强大的语言功能。本论文给出了到j a v a 的转义实现。 总之,s p o n g e t l 模板语言的设计实现思路的实际意义在于:在实际的项目 开发过程中,代码生成器作为辅助工具的开发子项目,其开发成本不应该太高, 其使用也不应该太复杂,否则就失去其应用意义。本论文的设计思路以及其实现 范例s p o n g e t l 和s p o n g e 应用框架的构造可以在较短的开发周期内实现一种功 能强大的代码生成器。从而可以提高软件项目的开发效率,同时也能获得使用代 码生成器带来的良好效益。 1 。5 展望 代码自动生成技术是再生式程序设计技术中的一种,它的发展非常快。随着 基于模板语言的代码自动生成器的广泛应用,对生成器的设计要求也越来越高。 虽然论文中实现了一个简单的应用框架s p o n g e ,也已经可以较为灵活的使 用,但面对需求变化很快的应用领域,例如w e b 、分布式应用系统等领域,如何 提高s p o n g e 的实用性和灵活性需要更进一步的研究和设计。 再者,论文中仅仅给出了转义到j a v a 语言的实现,面对实际的应用这是不 够的。需要进一步的实现多种语言的转义设计。 s p o n g e t l 还相对比较简单,语言结构可以进一步的丰富以增强其功能。 此外,目前s p o n g e t l 中的信息提取采用了x p a t h 标准,随着x p a t h2 0 标 准,以及x q u e r y 等标准的应用,如何进行灵活的信息提取也是需要进一步探讨 和研究。 代码生成技术 第二章代码生成技术 代码生成技术涵盖面很广泛,高级语言到中间代码的过程也是一种代码生 成。本论文论及的其实是特指高级代码的生成过程,例如源代码的生成技术。本 部分介绍了代码自动生成技术的理论背景、基本概念,代码自动生成技术的衡量 标准,以及常见的代码自动生成技术模型。 2 。1 域工程 从根本上说,实际项目中采用代码自动生成技术并不是凭空而生的。其基本 的理论依据是项目的域工程( d o m a i ne n g i n e e r i n g ) 。有关域工程的详细内容可参 见文献1 0 。项目的域分析有时候会导致代码生成器的开发和使用。 域工程是创建一族相似系统应用工程的过程。域工程覆盖了所有构建软件核 心价值的活动。“域工程包括域分析( d o m a i n a n a l y s i s ) 、域设计( d o m a i nd e s i g n ) 和域实现( d o m a h ai m p l e m e n t a t i o n ) 。 在整个域领域应用范围中,各个应用之间存在着相同点和不同点。这些称之 为共性( c o m m o n a l i t y ) 和可变性( v a r i a b i l i t y ) 。 共性是指在域工程期间关于什么是整个域的共同性问题所做出的决策或假 设。共性可以确定域的范围、软件的功能、与其它域的分界面、操作环境、软件 的限制、标准以及应用软件公共部分实现的细节。共性的重要性在于它说明了一 个应用程序族中什么是共同的或共享的。它代表着正在被使用的“域知识”。这 种域知识可以被分析并封装成工具、组件、模板、模式以及框架等等。 而可变性是一个需要在域分析期间确认,而直到构建或运行时间才确认的决 策。可变性代表了一个应用程序族内部之间的差别。构建时的可变性集合是为建 立一个程序生成器所需要的信息中最重要的部分。这个集合可用于定义一个规范 语言和一个结构或框架。运行时的可变性则是在运行时间内确定的决策,这些信 息包括配置文件、数据库、用户定制等等。可用于建立应用软件的公共部分。1 2 2 2 什么是代码生成器 代码生成器,顾名思义是指可以自动生成代码的程序。代码生成器的范围非 常广,从简单的解析器到功能齐全的生成器如m a t l a b 。 代码生成技术 代码生成器的基本功能是读取元数据( m e t a - d a t a ) ,例如数据库模型,然后 根据一定的模式和规则生成相应的源代码。 代码自动生成的基本模型图如下所示: 图表2 - 1 代码生成器基本模型 模式,模板:代码生成中的不变关系或模式。代表了代码生成域工程中的共 性。 域元数据:是指将在生成代码中模型化的元数据。通常被开发人员所提供的 外部数据所参数化。 域规则:用以约束域数据结构和行为的规则,通常被代码生成器所封装。 2 3 代码生成器的衡量指标 在实际的项目开发中决定使用代码生成器或者选择已有的代码生成器需要 从以下的几方面来进行衡量。 质量( q u a l i t y ) :是指生成代码的质量。在一个项目的开发周期中,由于软 件工程师的编码能力的不同,手工编码会形成代码质量上的参差不齐。而使用代 码生成器则可以在整个开发周期中提高代码质量,这是因为程序的许多b u g 可以 通过修订代码模板来完善整个代码库。生成代码的质量直接影响到生成器的可用 性。 一致性( c o n s i s t e n c y ) :是指所设计的生成器的生成a p i 的类结构,变量命 名以及方法签名的是否容易保持其稳定性,从而使得软件设计人员可以在较高层 次上进行使用,而不太需要考虑底层的变动。一致性决定了一个生成器向下的兼 容性,是否设计得稳定可靠。不会因为引入了生成器反而增加了系统的太多不确 定性。 效率( p r o d u c t i v i t y ) :是指生成器可以在多大程度上替代人工的编码工作能 力。代码生成器可以节省大量的人工时间,可以使软件工程师尽可能避免烦琐的 代码生成技术 重复开发工作,从而可以把精力放在更需要创造性的任务当中。效率的大小决定 了是否需要创建或选择生成器的决策。 抽象性( a b s t r a c t i o n ) :是生成代码所具有的层次性,是否清晰,是否容易 划分业务逻辑等能力,而不是将代码混作一团。代码生成器在软件的设计和代码 基( c o d eb a s e ) 之间提供了一个抽象层。在实际的软件开发应用中,常常会发现 会比较容易陷入到代码的各种细节中,从而忽视了业务逻辑规则。生成器所产生 的确定代码可以以一种明确的形式来保持这些业务模式和业务规则。同时,这些 文件可以独立出来并且文档化。此外,这些代码和文件也可以被域专家检察和分 析。抽象性使得生成代码可以运用其它的c a s e 技术来进行分析,例如可以导入 到r a t i o nr o s e 中进行o o 分析等。 有人认为代码生成是一种不好设计观念。认为它其实是一种反模式 ( a n t i p a t t e r n ) ”。他们认为代码生成仅仅是另外一种形式上的拷贝一粘贴式的编 程方式。虽然从某种角度上来看的确如此,但相比拷贝粘贴而言它依然有着许 多的可取之处。 我们在编程实践中发现一些类似的功能模块或方法函数时,总会想着去某个 地方把它拷贝粘贴过来,并做一些必要的更动。至此,这两处的代码其实已经 失去了相关性的联系,虽然它们是很相似。通常拷贝粘贴的代码中如果发现有 b u g ,就需要对所有拷贝粘贴的代码进行修订,这很容易遗漏和疏忽。而由一个 设计良好得代码生成器所产生的代码则可以保持这些代码间的有机联系,从而比 较容易的修正这些错误。 此外,在现代软件开发中,开发框架的应用的越来越普遍,同时也越来越复 杂,人们不得不加入更多的手工代码。这也导致代码的复杂性。选择代码生成器 可以减低复杂性。 再则,代码生成器用抽象的设计模型来产生代码,这种方式具有即使是最好 的纯手工编制系统也很难具有的便利性和可维护性。如果需要业务规则写到代码 中的话,最好就是将它们重构( r e f a c t o r i n g ) “到独立的一层中。 事实上,如果使用代码生成器的理由并不充分和必要的话,就不应该使用它 来生成大量的代码。一个良好设计和实现的生成器并不应该只用来替换眼前烦琐 的代码编制,更应该从整个应用域的角度来考虑和设计。” 2 4 代码生成器的基本模型 代码生成器大致可以分为两类:活动型和钝化型的生成器。活动型的代码生 成器主要是指可以在长时间的软件开发生存期中使用的生成器。钝化型的生成器 是指创建好初始的代码以后即交由开发人员进行控制的生成器。典型的钝化生成 代码生成技术 器如许多应用程序中的w i z a r d 。 2 4 1 小代码生成器 最常见的代码生成器是小代码生成器( c o d em u n g e r ) 。它处理一个或多个源 代码文件来生成相关的输出文件。j a v a d o c 就是的一个实例。它通过分析j a v a 源 文件中特定标识的注释,利用一系列的模板来创建h t m l 文档。另外一个例子 是x d o c l e t ( h t t p :x d o c l e t s o u r c e f o r g e n e t ) ,它主要是用来生成e j b 的类和接口。 可以用下图来展示j a v a d o c 的流程。 2 4 1 1 模型评估 图表2 - 2j a v a d o e 的处理流程 质量j a v a d o e 是通过分析特定标记的注释而将源代码旁路,可以准确控 制输出文档。j a v a d o c 也不需要处理j a v a 代码中的变量等。 一致性j a v a d o e 通过d o c l e t a p i 来输出h t m l 文件,这个a p i 是稳定的, 可以进行管道处理。 效率把源代码和文档相结合,开发人员可以同时编写代码和文档。从而 也避免了之间的不一致性。 抽象性j a v a d o c 只有很少的抽象性。 表格2 1j a v a d o c 模型评估 代码生成技术 2 4 1 2 处理流程 图表2 3 小代码生成器处理流程 小代码生成器读入源文件,分析后生成一个或多个输出文件。 2 4 2 内嵌代码生成器 构建一个内嵌代码生成器( i n l i n ec o d ee x p a n d e r ) 通常需要设计一种新语言。 新语言通常是扩展现有语言的语法。然后内嵌代码生成器将该语言扩展生成高级 语言( 例如c + + 、j a v a 、p e r l 、剑等等) 。 一个例子是内嵌s q l 的c 。s q l 语句使用特殊的标记嵌入到c 源文件中。 生成器以这些文件为输入,创建相对应使用c 代码替换s q l 语句的“c ”文件。 例如: i n tm a i n ( i n ta r g c ,c h a r + a r g v 】) r e t u r n0 j ) 使用生成器创建的c 文件可以示意为: # i n c l u d e ”d b h “ i n tm a i n ( i n ta r g c ,c h a r + a r g v 【 ) d b c o n n e c t i o n + d b c o n n3d b c o n n e c t i o n ( ) ; d b d a t a s e t + d b d a t a 2 d b _ q u e r y ( d b c o n n ,”s e l e c t + f r o mo r d e r s ”) j f o r ( i n ti 0 j i l e n g t h ;i + + ) 代码生成技术 f e t c har e c o r d p r o c e s st h er e c o r d ) r e t u r n0 j 该生成器的流程可以图示为 圉表2 - 4 内嵌s q l 的c 扩展流程 生成器扩展特殊标记段并用根据模板而生成的代码来替换。 2 4 2 1 模型评估 代码生成技术 质量数据库存取代码需要丈量的s q l 命令或查询的底层实现。虽然熟练 的程序员可以写出精巧的代码,但是通常很难兼顾到程序的鲁棒性 以及可调试性,并且需要写许多相类似的代码。如果使用s q l c 的 话,这些问题就比较容易排除了,因为生成器会管理所有的底层代 码。实际上,生成器开发人员可以将额外的错误检测代码和调试支 持加入到模板当中,从而代码很容易管理和调试。 一致性生成器维护所有存取数据库的代码,从而代码基可以很清晰并且可 以适应数据库需求的发生改变或者数据库存取框架有变动的情况。 效率由于节省了大量构建和调试数据库底层代码的时问,对于提高数据 库应用的收益是显而易见的。 抽象性通过标识应用程序中的所有s q l 代码,从而将s q l 调用层抽象了 出来,可以很容易利用其他手段来检测s q l 命令和语句的有效性, 例如可以通过语法分析等等手段。再比如。可以很容易通过d b a 来生成需要检测的s q l 查询列表。也可以自己建立查询和创建列 表。 2 4 2 2 处理流程 表格2 - 2 内嵌s q l 的c 生成器模型评估 其流程图如下所示。 其输入是一种新语言的源文件,而输出是更到层次语言的源文件。 这种生成器最大的缺点是软件的调试依赖输出。这意味着,在调试结束后所 有针对输出代码的改变必须要和输入的文件保持一致。 代码生成技术 2 4 3 混合代码生成器 图表2 - 5 内嵌生成器流程 混合代码生成器( m i x e dc o d eg e n e r a t o r ) 是以源代码文件作为输入,改变 或者替换其内容。使用这种技术有个以下多种目的。 1 构建用户界面的辅助代码,从而将变量附加到用户的界面控制中。 2 从注释中的测试用例数据中构建测试用例代码。 3 从注释中的数据库存取规范中创建数据库。 例如有一种混合代码生成器有些类似于内嵌代码扩展器代码生成器,它可以 用于内嵌的s q l 语句。 # i n c l u d e ”d b h ” i n tm a i n ( i n ta r g c ,c h a r + a r g v 【】) s q l :s e l e c t + f r o mu s e r s s q le n d r e t u r n0 ; 在使用生成器以后,原始文件如下所示: # i n c l u d e ”d b h ” i n tm a i n ( i n ta r g c ,c h a r + a r g v 】) s q l :s e l e c t + f r o mu s e r s d b c o n n e c t i o n + d bc o n n ;d bc o n n e c t i o n ( ) ; d b d a t a s e t + d b d a t a 。d b _ q u e r y ( d b _ c o n n ,”s e l e c t f o r ( i n ti 一0 ,i ( d b _ d a t a 一 l e n g t h ji + + ) ( f e t c har e c o r d 代码生成技术 p r o c e s s t h er e c o r d s q le n d r e t u r n0 ; 代码生成器用所需要的s q l 语句的实现语句填写在注释之间的空白中。原 来的注释将保留以便生成器再次运行时也还可以再次进行上述的替换。 2 4 3 1 模型评估 囝表2 - 6 混台s q l 的c 处理流程 质量由于s q l 语句的底层实现代码是自动生成的,所以它可以进行鲁棒 性的错误检测以及调试。调试是在产生的代码中进行的,所以没有 和内嵌代码生成器类似的b u g 修复集成步骤。如果代码可以更容易 调试的话,这种生成器可以有更高的代码质量。 一致性由于任何s q l 存取语句都是由相同的模板所产生的,所以s q l 存 取代码是一致可靠的。 效率 和内嵌代码生成器一样,由于它们维护s q l 语句底层代码,所以可 以节省大量的开发时间。 抽象性 s q l 命令和查询的代码是从原始文件的注释中提取。这意味着s q l 语句更加轻便易用。 表格2 - 3 混台s q l 的c 生成器模型评估 代码生成技术 2 4 3 2 处理流程 模型流程如下 图表2 - 7 混合代码生成器处理流程 生成器的输入文件也是输出文件。生成器读取文件中的特殊注释,然后用生 成的代码来取代这些内部的注释。同时,调试也直接依赖于输入文件。 因为源代码可以直接调试,所以混合代码生成器模型要比内嵌代码扩展器模 型更好些。混合代码生成器也可以作为外部工具很好的集成到i d e 中。 2 4 4 局部类生成器 局部类生成器( p a r t i a lc l a s sg e n e r a t o r ) 构建了一系列由特定文件所定义的 设计规范的实现类。这些基本类是作为构建生成类的平台。基本类主要是用来处 理全部类的底层工作,使得衍生类可以根据具体的情况自由的重载特定的行为。 局部类生成器的一个示例是构建数据库的存取类。生成器为每个类及其字段 构建基本的持久性代码。而子类则负责所有的客户行为。 如下图所示。 生成器采用一个定义文件,然后构建和数据库通讯的类。子类可以为基类添 加特定的客户行为。予类则是由应用程序直接使用的。 代码生成技术 2 4 4 1 模型评估 图表2 - 8 生成数据库存取类流程 质量生成器控制着所有的数据库存储类的结构,所以代码质量是由构建 类所使用的模板直接控制。知果生成器也可以为物理模式构建s q l 的话,那么在对象层和数据库层间映射时发生错误的可能性会显著 减少。 一致性由于数据库存取层的a p i 是由生成器所创建,所以结构、方法签名 和变量命名在所有的类里是一致的。这使得很容易根据a p i 标准类 构建代码,就如同。这也意味着当新的结构元素需要时,可以很 快的实现。 效率生成器负责所有的底层持久性处理工作,从而使得开发人员可以更 多的考虑应用程序的高层处理。此外,由于持久性代码更少的b u g , 开发人员可以花很少的时间在调试生成代码上。 抽象性数据库逻辑的基本结构已经从基本代码中分离出来。并且抽象成定 义文件。这意味着生成器也可以用其他语言来构建层,这会带来许 多的便利。同时,这也意味着可以更容易的通过域输出来检测生成 代码。 表格2 4 生成数据库存取类模型评估 代码生成技术 2 4 4 2 处理流程 处理流程 图表2 - 9 局部类生成器流程 生成器读入定义文件,然后用一系列的模板来构建一个或多个基本类。这些 基本类可以由子类特性化。所有这些类随后一起编译生成最终的产品。 2 4 5 层生成器 层生成器( t i e rg e n e r a t o r ) 构建和维护应用程序中的一个完整的层。在w e b 应用服务器中,这意味着层生成器将处理应用的n - t i e r s 中的一层,例如数据库存 取、业务逻辑或用户界面。 层生成器的一个例子是操纵和维护w e b 应用的数据库存取层。如下图所示: 代码生成技术 图表2 - 10w e b 数据库存取层生成 层生成器是以描述数据库模式的定义文件作为输入,使用一系列的模板来构 建数据库存取类的。一些生成器也可以为数据库服务器构建相应的实际的物理存 取模式。 2 4 5 1 模型评估 质量和局部类生成器相类似,所生成的基本代码的质量等价于在模板中 实现代码的质量。 一致性当代码生成器负责生成全部的数据库存取时,类是可用的。这使得 类易于编码。 效率因为所有所需要做的事情就是修改模板和再生成代码,所以生成器 的效率是指可以采用不同的风格和结构的类来进行试验 抽象性由于层的所有逻辑是由外部基本代码所限定的所以层生成器是抽 象程度最高的。这包括了所有的那些没有被局部类生成器所覆盖的 应用范围。一个完全抽象的定义意味着语言和框架便理性对于数据 库而言是确定的。 表格2 5w e b 数据库存取层模型评估 9 代码生成技术 2 4 5 2 处理流程 图表2 - 1 1 层生成器流程 层生成器以抽象的定义文件作为输入,使用一系列的模板构建一个或多个输 出文件这些输出代码是作为应用的完整的功能层。 局部类生成器和层生成器之间的关键差别在于层生成器更大范围的作用。层 生成器维护层的所有代码,包括所有的边界用例。局部生成器则把这些边界用例 延迟到予类来处理。 管理完全层的优点主要有两方面。 1 所有的业务规则抽象出来以便可以由域专家来检验规则的有效性。 2 由于生成器维护整个层,处理逻辑可以通过改变模板来导出到其他的平 台。 局部类生成器常常可以是形成层生成器的良好的开始。局部类生成器遵循着 8 0 2 0 规则。生成器处理8 0 的常规用例,而把2 0 的客户定制延迟到子类来处 理。随着代码逐渐固定化,以及对问题域的更好理解,2 0 会越来越小,直到生 成器处理所有的代码。 2 5 代码生成器的基本应用 代码生成器的应用非常广泛,最常应用的领域有: 1 生成h t m l 页面。这是代码生成器最常应用的领域,甚至生成完整的 代码生成技术 w e b 站点。 2 封装数据库的操作。数据库的操作繁琐而重复的工作量比较大,而且比 较容易出错。这方面的生成器的应用主要包括建立业务对象,以及数据 库事务处理等。 3 构建e j b 部署描述文件。通常这是比较繁琐的设置过程,众多的应用服 务器供应商都提供了相应的配置部署工具来自动生成这一描述文件。 4 e j b 远程接口和主接口以及本地接口和本地主接口的实现类。这些都是 e j b 容器服务器自动生成的。 5 s q l 语句的实现。一些c a s et 具根据数据库的实体模型来生成创建数 据库就需要使用自动生成技术。此外,在一些内嵌的代码生成工具中, 常常需要将s q l 语句翻译成特定的宿主语言。等等这些,都可以使用 代码自动生成技术来完成。 6 x m l 的数据绑定( x m l d a t ab i n d i n g ) 。x m l 数据绑定需要将x m l 描 述的对象生成实际语言的对象代码。 2 6 常见代码生成器的介绍 名称u r l说明 e j b g e l l h t t p :w w w b e u s t c o e j b g e n 是一个e j b2 0 的代码生成器。使用 m e j b g e n j a v a d o e 标签标记b e a n 的类文件,然后使用 e j b g e n 来生成远程接口和主接口,以及e j b 应 用程序的部署描述符。它将诸多需要编辑维护的 e b 相关文件减少到只需要维护该b e a n 的j a v a 文件。 j e tc o d e h t t p :w w w j e t o o l s j e t 是一个基于x s l t 标准的数据库代码自动生 g e n e r a t o r c o m p r o d u c t s j e t g e 成系统。 n c a s t o r h t t p :c a s t o r c x o l a b c a s t o r 是一个开源的j a v a 数据绑定框架。它在 o r e , j a v a 对象、x m l 文档以及s q l 数据表之间提供 了最快捷的途径。它提供j a v a 到x m l 的绑定、 j a v a 到s q l 的持久性等。 x d o c l e t h t t p :x d o c l e t $ o u r cx d o c l e t 是一个基于j a v a d o c 扩展的d o c l e t 引擎。 e f o r g e n e t它可以生成源代码或者其他文件。 a c g h t w :w w w 1 9 s o f t wa c g 是一个从x m l 文档生成j a v a 源代码的自 代码生成技术 a r e d e p a c k a g e s d e 动生成器。 1 9 s o f t w a r e a c d e c c o h t t p :w w w k h i l l o r d e c c o 是一个基于数据库对象创建j a v a 类的生 g d e e c o 成器。 j g e n e r a t h t t p :w w w j a v e l i n s是一个企业级的应用生成器。可以构建用户的应 o r o f t c o m i g e n e r a t o r用架构,而不仅仅局限于已有的框架。 e b c r e a r h t t p :o p e n s o u r e e t e f a b c r e a t o r 是一个创建e j b 的开源项目。它可以 0 rf s d u e j b c r e a t o r 创建实体b e a n 、会话b e a n 、m e s s a g e - d r i v e nb e a n 、 值对象、以及a n t 的b u i l d 文件等等。 a s p e c t jh t t p :w w w e c l i p s e 是一个j a v a 的面向方面的产品- 它是另一种意 o r g a s p e c t j 义上的代码生成工具。它将面向方面的j a v a 扩 展代码编译生成j a v a 的代码。 j e n e r a t o r h t t p :w w w v i s i o n c 是一个代码生成器。它可以从不同的媒介获取元 o d i f i e d c o r n 信息,应用x s l 模板并生成代码。它不同于利 用j a v a d o c 定制标签的生成方式,它使用基于 x m l 的描述文件。 j o s t r a c a h t t p :w w w j o s t r a c a j o s t r a c a 是一个使用j s p 语法,但是可以使用任 o r g 何语言作为脚本的代码自动生成工具。它提供了 一个代码生成工具集。 表格2 - 6 常见代码生成器介绍 2 7 代码生成器的长处和不足 使用代码生成器有着以下的优点: 1 可保证的一致性。由于代码的自动生成,所以如果选择或设计合适的代 码生成器,就能够保证生成代码的一致性,而不会有手工代码所导致的 相关代码间的不同步。 2 改变了软件设计人员的工作方式:由于代码只需要完成它所必须完成的 功能,所以变得更加清晰而且更加简单。如果以后需求发生了变化,只 需要简单更改代码生成器并且重新生成新的源代码文件就可以了。 3 稳定而尽可能免除b u g 。由于代码生成器往往是在最终项目代码生成之 前所编写,所以从这个意义上来说,这时候整个项目的调试过程已经开 始。生成器的正确选择和设计可以对最终项目的正确可靠性提供最重要 的保障。 代码生成技术 4 生产效率高。由于生成器的设计和选择源自于问题域的分析,所以可以 形成可保证的最新的生成器a p i 。 5 可定制。通常各种生成器都会提供定制的功能,用户可以根据模板定制 特定的输入,从而生成相应的代码。 6 使得代码可以快速的更新。例如,如果数据库需要更动的话,可以修改 后重新运行生成器从而可以生成新的源代码,这只需要很少的时间。 7 软件开发人员可以更加集中精力于开发领域,更容易发挥他们的聪明才 智。开发人员的积极性也会得到很大的提高。 8 形成良好的代码开发习惯。由于生成器生成的代码有着更好的规范,从 而软件开发人员可以学习这种开发的代码风格,这有助于形成整个项目 的代码规范的统一性。 虽然生成器有着以上的种种优点,但它也不是万能的。它亦有着以下的一些 不足。 1 根据生成器的使用,它必须最先开发。而由域工程的分析来形成良好的 代码生成器的选择或设计是一件很困难的事情。 2 需要有特定的可应用的条件。作为域分析的产物,如果设计生成器的代 价过高的话,实际上它并不可行,这在项目开始时是必须要考虑的。 3 不是所有的程序代码都可以用代码生成器来生成,总是需要手工编写一 定的代码。实际上,代码生成器的真正作用是作为手工代码的支撑作用, 例如提供特定的a p i ,在f a b 的开发过程中,容器提供了支撑代码的自 动生成,但是具体的业务规则的b e a n 总是需要软件开发人员来设计和 实施的。 4 对于数据库代码而言,数据库必须是规范化的,有着正确的设计和形式 化。通常代码生成器不会处理专有的设计特性。从另一方面,这实际也 是代码生成器的一个优点,即可以跨越多种数据库平台,而不必绑定在 某一特定的平台上。 楼板语言技术 第三章模板语言技术 基于模板的代码生成技术是一种很有效的减低开发成本的代码生成技术。本 章考察了现有常见的一些模板语言技术。并试图归纳现有模板语言的基本特点。 3 1 常见的模板语言 模板和模板语言技术在实际的软件开发中的应用非常广泛。其中j s p ,x s l t 等技术已经运用的非常广泛。 3 1 1j s p j a v as e r v e rp a g e s ( j s p ) 是由s u n 公司倡导的一个动态w e b 页面技术标准。 其设计目的主要是为了更加容易和方便的构建基于w e b 的应用。j s p 可以用于动 态的创建w e b 页面,也可以用于创建程序。 目前,j
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东广州市天河区东风实验小学招聘小学计算机教师1人模拟试卷附答案详解(模拟题)
- 2025届招商蛇口春季校园招聘模拟试卷参考答案详解
- 2025年南安市部分公办学校专项招聘编制内新任教师58人(二)模拟试卷及答案详解(易错题)
- 2025年福建农信春季招聘149人考前自测高频考点模拟试题完整答案详解
- 2025鄂尔多斯市林业和草原局所属事业单位引进高层次人才模拟试卷及答案详解一套
- 2025年廉江事业单位真题
- 2025年辉南县补录1名乡镇、街道派驻消防文员模拟试卷附答案详解
- 2025年烟台幼儿师范高等专科学校公开招聘工作人员(30人)考前自测高频考点模拟试题及答案详解(历年真题)
- 2025年上半年江苏南京市六合区人民医院招聘编外工作人员32人模拟试卷及完整答案详解
- 2025福建福州经济技术开发区机关事务服务中心招聘编外聘用人员1人模拟试卷及参考答案详解
- 第三节 区域联系与区域协调发展教学设计高中地理湘教版2019选择性必修2-湘教版2019
- 教案2025秋形势与政策纪念抗战胜利坚定民族信念抗战胜利80周年
- 湘潭、成都工厂VDA63-2023审核员培训考核附有答案
- 水刷石外墙清洗方案
- 口腔种植技术课件
- 门店开发与选址
- 护士沟通技巧与人文关怀护理课件
- 【高中班会】高一选科指导课件
- 万千教育学前08岁儿童纪律教育给教师和家长的心理学建议
- 职高新思政-第五课:推动高质量发展
- 《复活(节选)》高二统编版语文选择性必修上册
评论
0/150
提交评论