毕业论文软件工程关于代码自动生成技术的分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
前言 (1)
第一章概述 (2)
1.1背景 (2)
1.2研究代码自动生成技术的必要性 (4)
1.3 本课题的主要研究内容 (6)
第二章代码自动生成技术 (6)
2.1 代码生成的机理 (6)
2.2 三层B/S架构 (7)
2.3 设计模式 (8)
2.4 反射技术 (10)
2.5 缓存技术 (11)
2.6 XML技术 (13)
2.7 语法高亮显示 (15)
第三章系统分析与设计 (15)
3.1 系统分析 (15)
3.1.1 系统开发环境 (15)
3.1.2 需求分析 (16)
3.1.3 系统用例图及详细说明 (17)
3.2 系统设计方案 (22)
3.2.1 设计原则 (22)
3.2.2 系统类 (22)
第四章系统实现 (24)
4.1 系统界面设计 (24)
4.2系统功能实现 (25)
4.2.1 数据库新连接(即导入数据库信息)功能的实现25
4.2.2 代码生成功能的实现 (25)
4.2.3 代码导出功能的实现 (25)
4.2.4 数据库查询分析功能的实现 (26)
第五章难点与对策 (26)
5.1 数据库表信息的读取 (26)
5.2 将xml数据加载到树形控件上 (28)
5.3 语法高亮显示的实现 (30)
第五章总结及展望 (31)
5.1 总结 (31)
5.2 展望 (32)
致谢 (33)
参考文献 (33)
前言
现在软件工程所涉及到的系统规模越来越大。

大型的程序需要多人共同参与和开发,每个人的程序风格不同,再加上时间上的压力,这使得系统完成以后在测试及维护上带来了沉重的负担。

计算机科学家一直致力于这方面的研究。

在解决代码规范以及工作效率上,代码自动生成技术显现出了其很大的优越性。

代码自动生成器一个最关键的功能就是让程序员尽可能减轻负。

当然任何东西都不能取代人在当中的作用,代码自动生成器主要来完成一些有规律可寻的代码生成。

比如我们平常一般用到的MODEL类就是一个很简单的基类,它的模式基本上是固定的。

如果一个系统有上百个MODEL类,那么程序员可能要话很长的时间来编写。

而用了相应的自动生成器只需简单几步就很全部生成。

我想这样的工作是非常有意义的。

TianHao正是在这样的环境下计划开发的。

TianHao生成的代码基于面向对象的思想和三层架构设计。

现在的系统常用到的是三层架构。

一个典型的例子就是微软的示例代码Petshop。

Petshop包含了很多经典的思想和设计模式。

TianHao结合了Petshop的开发模式,寻求编码规律,并融入了工厂模式,反射机制等一些思想。

TianHao 同时提供支持多类型数据库,并且能够方便的对数据库查询分析,存储过程生成,代码批量自动输出等多项开发工作中常用到的功能。

第一章概述
1.1背景
在软件工程发展过程中,计算机科学家为了降低软件开发得强度,缩短开发周期,减少代码的重复书写,从而减轻程序员的编程负担,一直以来都致力于代码自动生成方面的研究。

Lex/Yacc 是最早用于自动化编写编译程序的工具。

我们可以将代码生成技术分为两大类:被动模式和主动模式。

在被动模式下,代码生成器产生一系列的代码,然后软件开发者可以自由的修改、编辑这些代码,但代码生成器不再承担对代码的维护工作。

大多数软件集成开发环境(IDE)中的应用“向导”就是这种类型的代码生成器。

被动模式的代码生成技术有其应用的范围,但是被动模式的生成系统有天生的局限性。

生成器只运行一次,然后就不再承担对代码的维护工作。

与此相反,主动模式下的代码生成器则对生成的代码“长期”负责,可以通过改变生成器的输入参数并重新运行生成器来改变输出的代码。

如编译器生成器就是一种主动模式的代码生成器。

下面我们介绍几种常见的代码生成技术,这些技术对开发一个实用的代码生成器非常重要。

可以依据代码生成技术的使用场合、复杂度等对这些生成技术进行分类,这里我们采用依据生成技术的输入、输出对它们进行分类。

(1)代码挑拣器,代码挑拣器的输入是源代码,通过拣取需要的信息可以生成各种文件,代码挑拣器的使用相当广泛,可以使用它来生成代码API文档、获取常量和函数原型等。

(2)内联代码扩展器,内联代码扩展器的输入是带有特殊标记的源代码,这些特殊标记经过扩展器的处理后将被替换为相关的代码从而产生最终的生产源代码,内联代码扩展器的典型应用是将SQL语句嵌入到源代码中,其主要特点是使得底层结构和复杂的查询分开。

(3)混合代码生成器混合代码生成器与内联代码扩展器很像,它也是处理源代码中的特殊注释但是与内联代码扩展器不同,它的结果将直接输出到输入的源代码中。

这种方式的一个典型应用就是在对话框控件和它们代表的变量之间建立映射关系。

(4)部分类生成器部分类生成器的输入是模板文件和包含
特定类所需信息的定义文件,这些信息经过生成器将产生应用的基类。

通过继承该基类可以完成剩余的工作。

Velocity是一个源代码开放的Java模版引擎。

(5)层第生成器层第生成器将生成一个多层应用的所有代码。

模型驱动的开发是这种生成器的一个很好例子。

通过UML模型输入和其余XML文件,生成器能够生成一个包含多个系统的完整应用,并且模型和代码之间可以单项乃至双项同步。

(6)完全领域语言完全领域语言是一个图灵完全的语言,可以直接使用来进行领域相关的操作。

目前常见的代码生成器有:
DbToCode 是一款为 C# 数据库程序员设计的自动代码生
器,DbToCode 生成的代码基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。

采用 Model + DAL + BLL + Web 的设计,主要实现在 C# 中对应数据库中表的基类代码的自动生成,包括生成属性、添加、修改、删除、查询、存在性、 Model 类构造等基础代码片断,使程序员可以节省大量机械录入的时间和重复劳动,而将精力集中于核心业务逻辑的开发。

Codematic 生成的代码基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。

Codematic 同时提供方便的多类型数据库管理,查询分析器,SQL脚本生成,存储过程生成,数据库文档生成,Web项目发布,代码批量自动输出等多项开发工作中常用到的功能,您可以很方便轻松地进行项目开发。

AutoJava 是一款免费的,针对于Oracle和SQLserver数据库的、以面向对象模式的Java代码生成工具。

AutoJava根据O/R Mapping规则生成表对应的Java对象,并且生成了所有的添加、删除、修改、查询等底层数据库操作代码。

1.2研究代码自动生成技术的必要性
随着现代化信息环境日趋复杂,各种应用软件的开发难度随之加大,这需要更有技巧,更有方法地从事软件开发,开发团队之间也必须更无障碍地沟通,否则极可能无法在有限的开发时间中完成任务。

由于时间上的压力,一般人只注重程序的编写速度,却忽略其完成后的实用性与维护性,加上大型程序多人共同参与开发,每个人都有各自的程序风格,容易造成严重的差异性,随
着系统规模越来越大,这将造成系统完成后在测试及维护上沉重的负担,代码自动生成技术更显出了其显著的优越性。

尽管这些应用没有代码生成工具也能开发完成,但利用代码生成技术可以大大加速软件的开发进度,提高软件的质量。

代码生成技术是关于自动生成程序的程序的技术。

与手工书写代码相比,代码生成器提供了下面的一些好处:
(1)所有软件实体的一致的代码质量,代码的质量依赖且只依赖于代码生成的模板、文件和模型。

与此相比,手工经常采用的拷贝粘贴的方法为前后代码质量的一致性带来了隐患。

(2)提高了代码变更的能力,特别在需要大量更改代码的情况下,只需要更改模板并重新运行代码生成器即可。

(3)提高了修复软件Bug的能力,只需要修复模板的Bug然后重新运行生成器就可以修复所有的生成文件的Bug。

(4)提高了在不同框架之间的迁移能力,一个典型的情形是我们需要生成不同框架(如J2EE/.Net)的应用代码,代码生成技术将业务逻辑以语言无关的形式单独存放,通过为不同的框架提供代码模板可以基于同一逻辑生成不同框架的应用代码。

(5)灵活的同步机制,代码生成技术自动维护代码和数据模型的一致性,通过重新运行生成器,对模型的修改可以自动反映到代码中,这种同步机制对维护数据的一致性是非常必要的。

(6)大幅度提高了工作效率,运用代码生成技术可以将更多的时间花费在业务相关的设计和实现上,从而可以大大提高软件的开发效率和软件质量。

(7)是代码学习的导师,由于生成的代码具有良好的风格和100%的健壮性,程序开发者很容易模仿代码风格,从中学习。

1.3 本课题的主要研究内容
本课题的主要目标是在Windows XP 平台下,利用.NET C#实现.NET(C#)代码自动生成软件(如上1.1背景说述,该软件属于代码自动生成的部分类生成器)。

本软件主要包含功能如下:(1)实现在对应数据库中表的基类代码的自动生成,包括生成属性、添加、修改、删除、查询、存在性、Model 类构造等基础代码片断。

(2)自动生成数据库的存储过程。

(3)支持不同架构代码生成,用户可以定义命名。

(4)自动生成实体Model,DAL(数据访问层),IDAL(接口层),DALFactory(类工厂),BLL(业务逻辑层) 等多层的代码。

(5)代码批量生成自动导出功能。

第二章代码自动生成技术
2.1 代码生成的机理
代码生成器的作用是读取工程的元数据,按照指定的设计模式,混合产生出规范的源代码。

典型的代码生成器模型如图2-1所示。

在图中,为自动生成程序代码,必需的三个关键要素是设计模式(所产生代码的模板文件)、领域元数据(在代码中需建模的拓扑结构,即定义文件,通常随开发折提供的特定数据增长)。

图2-1 典型代码生成器的模型图
构建自己的代码生成器有2种方法,一是综合利用流行的代码生成器。

构建出适合自己的代码生成器;另一种方法是构造出一
个全新的代码生成器。

无论哪种方法,在构建代码生成器都应该注意下面几个方面:
(1)使用纯文字样版,使用纯文字样版的好处除了编辑方便外,也能将程序代码定义逻辑和格式化逻辑分隔开来,使实作上更有弹性。

(2)编写正规表达式(Regular Expression),正规表达式是一种字符串的表示方式,使用它不仅扩大了字符串的表达能力,让使用者很容易进行字符串判断,也可避免撰写程序进行复杂字符串解析的麻烦,也自然使得数据处理的过程变得更为迅速便利。

(3)编译器原理,在对于文本文件的处理上,先利用扫描器(Scanner)扫描出其中的字符,再实作解析器(Parser)解析出所对应的语法,然后转换成所要产生的程序语言。

(4)文档输出入的处理,由于程序产生牵涉到大量的文档读写动作,需要定义合适的数据结构及缓冲区机制来提升文档存取的效率,另一方面来说,在编写样版文档时也需考量到对于存取效率上的负担。

2.2 三层B/S架构
架构设计是非常高级的设计,也是系统设计的关键,主要是定义和说明包(子系统),以及包与包之间的相互依赖与通信机制。

系统构架模型的合理与否将决定系统的可维护性、扩展性和开发效率
包通常所需要处理的是要么是一个具体的功能区域(业务逻辑),要么是一个具体的技术区域(技术逻辑)。

业务逻辑主要考
虑的是对系统业务功能的实现,而技术逻辑则是进一步考虑用户界面、数据库或通信机制等形成的技术方案。

把技术逻辑和业务逻辑区分开来是极其重要的,这是为了当修改程序的某一部分时不会对另一部分产生影响,更加便于进行“复用”,同时易于应对来自业务逻辑的变更需求。

三层结构是一种成熟、简单并得到普遍应用的应用程序架构,它将应用程序结构划分三层独立的包,包括用户表示层、业务逻辑层、数据访问层。

其中将实现人机界面的所有表单和组件放在表示层,将所有业务规则和逻辑的实现封装在负责业务逻辑组件中,将所有和数据库的交互封装在数据访问组件中。

其结构如下图2-2所示:
图2-2 三层结构
2.3 设计模式
设计模式使人们可以更加简单方便地复用成功的设计和体系结构。

将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。

一般而言,一个模式有四个基本要素:
1. 模式名称(pattern name)一个助记名
2. 问题(problem) 描述了应该在何时使用模式。

它解释了设计问题和问题存在的前因后果,它可能描述了特定的设计问题,如怎样用对象表示算法等。

也可能描述了导致不灵活设计的类或对象结构。

有时候,问题部分会包括使用模式必须满足的一系列先决条件。

3. 解决方案(solution) 描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。

因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。

4. 效果(consequences) 描述了模式应用的效果及使用模式应权衡的问题。

尽管我们描述设计决策时,并不总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及好处具有重要意义。

软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题。

因为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩充性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。

设计模式常常划分成不同的种类,常见的种类有:
创建型设计模式,如工厂方法(Factory Method)模式、抽象工厂(Abstract Factory)模式、原型(Prototype)模式、单例(Singleton)模式,建造(Builder)模式等。

结构型设计模式,如合成(Composite)模式、装饰(Decorator)模式、代理(Proxy)模式、享元(Flyweight)模式、门面(Facade)模式、桥梁(Bridge)模式等。

行为型模式,如模版方法(Template Method)模式、观察者(Observer)模式、迭代子(Iterator)模式、责任链(Chain of Responsibility)模式、备忘录(Memento)模式、命令(Command)模式、状态(State)模式、访问者(Visitor)模式等等。

以上是三种经典类型,实际上还有很多其他的类型,比如
Fundamental型、Partition型,Relation型等等。

设计模式在特定的编程语言中实现的时候,常常会用到代码模式。

比如单例(Singleton)模式的实现常常涉及到双检锁(Double-Check Locking)模式等。

下面介绍重点介绍抽象工厂模式:
在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。

如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。

它的意图是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

模型如下图所示:
逻辑模型(图2-3):
图2-3 逻辑模型
物理模型(图2-4):
图2-4 物理模型
2.4 反射技术
反射的定义:审查元数据并收集关于它的类型信息的能力。

元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等,。

System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码。

例如:Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及
在装配件中查找类型信息,并创建该类型的实例。

Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。

MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。

反射的作用:1.可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。

2.应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。

3.反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。

2.5 缓存技术
由数据库驱动的Web应用程序,如果需要改善其性能,最好的方法是使用缓存功能。

用户从数据库中检索数据,可能是Web应用程序中执行最慢的操作之一。

因为其中涉及多个环节,例如,Web 服务器、数据库服务器等。

尤其是在用户比较多,检索的数据量比较大的情况下,会给包括用户在内的各个方面造成不小的困难。

如果能够将数据库中的数据缓存到内存(也可以存储在其他场所),则无需在请求每个页面时都访问数据库。

由于从内存中返回数据的速度始终比新提供的数据速度快,因而可以大大提供应用程序的性能。

2.0支持以下几种缓存:
页面输出缓存
页面输出缓存是最为简单的缓存机制,该机制将整个
页面内容保存在服务器内存中。

当用户请求该页面时,系统从内存中输出相关数据,直到缓存数据过期。

在这个过程中,缓存内容直接发送给用户,而不必再次经过页面处理生命周期。

通常情况下,页面输出缓存对于那些包含不需要经常修改内容的,但需要大量处理才能编译完成的页面特别有用。

需要读者注意的是,页面输出缓存是将页面全部内容都保存在内存中,并用于完成客户端请求。

页面部分缓存
顾名思义,页面部分缓存是将页面部分内容保存在内存中以便响应用户请求,而页面其他部分内容则为动态内容。

页面部分缓存的实现包括两种方式:控件缓存和替换后缓存。

前者也可称为片段缓存,这种方式允许将需要缓存的信息包含在一个用户控件内,然后,将该用户控件标记为可缓存的,以此来缓存页面输出的部分内容。

这一方式缓存了页面中的特定内容,而没有缓存整个页面,因此,每次都需重新创建整个页。

例如,如果要创建一个显示大量动态内容(如股票信息)的页,其中有些部分为静态内容(如每周总结),这时可以将静态部分放在用户控件中,并允许缓存这些内容。

缓存后替换与控件缓存正好相反。

这种方式缓存整个页,但页中的各段都是动态的。

例如,如果要创建一个在规定时间段内为静态的页,则可以将整个页设置为进行缓存。

如果向页添加一个显示用户名的Label控件,则对于每次页刷新和每个用户而言,Label的内容都将保持不变,始终显示缓存该页之前请求该页的用户的姓名。

使用缓存后替换机制,可以将页配置为进行缓存,将页的个别部分标记为不可缓存。

在此情况下,可以向不可缓存部分添加Label控件,这样将为每个用户和每次页请
求动态创建这些控件。

应用程序数据缓存
应用程序数据缓存提供了一种编程方式,可通过键/值对将任意数据存储在内存中。

使用应用程序缓存与使用应用程序状态类似。

但是,与应用程序状态不同的是,应用程序数据缓存中的数据是易失的,即数据并不是在整个应用程序生命周期中都存储在内存中。

应用程序数据缓存的优点是由管理缓存,它会在项过期、无效,或内存不足时移除缓存中的项,还可以配置应用程序缓存,以便在移除项时通知应用程序。

缓存依赖
2.0新增了SQL数据缓存依赖功能。

该功能的核心是SqlCacheDependency类。

不同版本的SQL Server,其对于SQL数据缓存依赖具有不同程度的支持,因此,使用方法差异较大。

另外, 2.0还支持以CacheDependency类为核心的自定义缓存依赖,以及以AggregateCacheDependency类为核心的聚合缓存依赖等。

2.0包括了一些有助于进行缓存配置的新功能。

例如,允许使用Web.config文件来创建缓存设置。

在Web.config文件中进行适当设置,并在单个页中引用这些设置后,就能够将缓存设置同时应用于多个页面。

同时,缓存设置还添加了更多用于自定义缓存性能的选项。

2.6 XML技术
XML是Extensible Markup Language的缩写,是一种类似于
HTML的标记语言。

XML是用来描述数据的,它的标记不是在XML 中预定义的,你必须定义自己的标记。

XML使用文档类型定义(DTD)或者模式(Schema)来描述数据。

XML和HTML的主要区别是:XML是用来存放数据的。

XML 是被设计用来描述数据的,重点是:什么是数据,如何存放数据。

HTML是被设计用来显示数据的,重点是:显示数据以及如何显示数据更好上面。

HTML是与显示信息相关的, XML则是与描述信息相关的。

.Net框架为我们提供了以下一些命名空间:System.Xml、XmlReader类是一个虚基类,它包含了读XML文档的方法和属性。

该类中的Read方法是一个基本的读XML文档的方法,它以流形式读取XML文档中的节点(Node)。

另外,该类还提供了ReadString、ReadInnerXml、ReadOuterXml和ReadStartElement等更高级的读方法。

除了提供读XML文档的方法外,XmlReader类还为程序员提供了MoveToAttribute、MoveToFirstAttribute、MoveToContent、MoveToFirstContent、MoveToElement以及MoveToNextAttribute等具有导航功能的方法。

XmlWriter类为程序员提供了许多写XML文档的方法。

XmlNode类是一个非常重要的类,它代表了XML文档中的某个节点。

该节点可以是XML文档的根节点,这样它就代表整个XML 文档了。

它是许多很有用的类的基类,这些类包括插入节点的类、删除节点的类、替换节点的类以及在XML文档中完成导航功能的类。

同时,XmlNode类还为程序员提供了获取双亲节点、子节点、
最后一个子节点、节点名称以及节点类型等的属性。

XmlDocument类代表了一个XML文档,它提供了载入和保存XML文档的方法和属性。

这些方法包括了Load、LoadXml和Save 等。

同时,它还提供了添加特性(Attributes)、说明(Comments)、空间(Spaces)、元素(Elements)和新节点(New Nodes)等XML项的功能。

2.7 语法高亮显示
语法高亮控件ICSharpCode.TextEdition来自开源项目SharpDevelop。

所谓的语法加亮编辑器就是能根据不同的文件类型,来显示文本内容。

比如利用语法加亮编辑器可以显示C#代码的效果,类型、变量等分别用不同的颜色以示区分。

具体用法可以参见:。

第三章系统分析与设计
3.1 系统分析
3.1.1 系统开发环境
A 硬件环境
普通PC ( 1.8GHZ,内存512M)一台。

B 开发工具
系统开发平台:Microsoft Windows XP professional
开发工具与环境:Microsoft Visual Studio 2005 C#。

相关文档
最新文档