王朝网络
分享
 
 
 

用Visual Studio 2005创建宏代码生成器

王朝厨房·作者佚名  2007-01-04
宽屏版  字体: |||超大  

目前的软件并不是自动生成的,但是我们都知道软件将会一代代地发展下去。那么,为什么我们不努力于自动生成的软件?为什么不努力于创造能够一代代自动生长或发展使用的软件而却致力于改变现有的?目前我们所拥有的哪些技术能够支持生成的软件而遗忘了哪些技术呢?对这些问题的回答可能还不存在,但是VS 2005中已经具有一些能力来支持生成的代码了。

在Visual Studio 2005中,你可以使用宏来为你书写代码。这些宏代码生成器并不是随便生成的,而你也不必凭想象和发明来构划要写什么样的宏。两个独立但仍有联系的研究领域-设计模式和重构-明确地提供了许多的选择用于书写易理解的,具有良好文档的代码生成器(代码生成与生成的代码并不是一回事,这是在使用宏引擎时所必须要理解的)。本文将向你展示怎样使用Visual Studio 2005中的宏引擎创建一个代码生成器来为VB.NET实现重构封装字段。

二、重构:封装字段

重构是一个为提高代码实现质量的定义过程。具体地说,重构是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。在最简单意义上,重构从代码中提取了一些主观性。作为软件工程师,我们不必再依赖于舆论和意志力来判断编码是好的还是不好的;我们能运用一个客观的标准并同意重构的代码优于非重构的代码。

就象设计模式一样,重构是命名的代码模式,带有充分的描述,指令,要想达到的结果。任何一个程序员,不管是否有开发经验,都能读取相应的描述,并象遵循医生的处方一样使用预先确定的指令,并取得可以预料的进步。

一个重构的例子称作封装字段。封装字段意指,使字段名成为私有的并通过公共的属性方法来限制到这些字段的存取。限制到一对象的状态的存取优于无限制的存取,封装字段正是基于相信对数据的限制存取所具有的价值(有些人可能还不同意基本的前提-有约束的存取优于自由的存取-而有些人还认为基于对象进行设计并没有多少好处,更不用争论重构是良性的还是非良性的问题了。不过,本文假定是良性的重构)。

三、实现宏

如果你正处于Visual Studio 2005的一个C#工程上下文中,那么一定会存在一个重构菜单。而在VB.NET工程上下文中,是不存在这样的菜单的(至少到目前发行的beta 2版本中是如此)。然而,你能容易地为VB.NET仿效这种支持的行为-例如通过书写一个轻量级的代码生成器来实现封装字段(或其它重构)。

为了实现封装字段,自动化下列步骤:

1. 选择一个字段,不需要一个一致的属性方法。

2. 把字段的存取修饰词改成private。

3. 稍微改变一下该字段名以避免属性冲突(使用任何你喜欢的习惯)。

4. 生成getter/setter属性方法以及一些代码已提供对该字段的存取。

提示:开始用宏进行工作的一个好办法是打开宏记录器,完成一项任务,进而分析在集成开发环境中生成了哪些宏语句。然后,再进一步归纳录制下的宏。

Visual Studio对象模型支持所有这些能力,甚至还有更重要的能力。列表1展示封装字段的一个实现。

列表1:利用VS 2005中的宏能力来把创建的字段封装成一个代码生成器

Imports EnvDTE

Imports EnvDTE80

Imports System.Diagnostics

Public Class Refactoring

Public Shared Sub EncapsulateField()

Dim projectItem As ProjectItem = DTE.ActiveDocument.ProjectItem

Dim fileCodeModel As FileCodeModel = projectItem.FileCodeModel

’ 得到当前的选定内容

Dim selection As TextSelection = DTE.ActiveDocument.Selection

’得到当前的光标位置

Dim point As TextPoint = selection.ActivePoint

’尽量读取当前位置作为一个代码元素

Dim codeElement As CodeElement = fileCodeModel.CodeElementFromPoint( _

point, vsCMElement.vsCMElementVariable)

If (codeElement Is Nothing) Then

MsgBox("Place mouse cursor on field before running this macro.", MsgBoxStyle.Exclamation)

Return

End If

Debug.Assert(codeElement.Kind = vsCMElement.vsCMElementVariable)

’我们测试过了,所以知道这是个变量

Dim codeVariable As CodeVariable = CType(codeElement, CodeVariable)

Dim fieldName As String = codeVariable.Name

Dim fieldType As String = codeVariable.Type.AsString

’重命名该字段,以使不发生属性冲突问题

codeVariable.Name = "F" & fieldName

’确保字段是private

codeVariable.Access = vsCMAccess.vsCMAccessPrivate

’得到变量的parent

Dim codeClass As CodeClass = CType(codeVariable.Parent, CodeClass)

’添加一个新属性

Dim codeProperty As CodeProperty = codeClass.AddProperty("dummy", "dummy", fieldType, codeElement)

codeProperty.Name = fieldName

’实现getter

Dim getter As EditPoint = codeProperty.Getter.GetStartPoint( vsCMPart.vsCMPartBody).CreateEditPoint

getter.LineDown()

getter.Indent(, 3)

getter.Insert("Return " + codeVariable.Name)

’实现setter

Dim setter As EditPoint = codeProperty.Setter.GetStartPoint( _

vsCMPart.vsCMPartBody).CreateEditPoint

setter.LineDown()

setter.Indent(, 3)

setter.Insert(codeVariable.Name + " = Value")

End Sub

End Class

为了试验这个例子,打开宏IDE:点击VS 2005中的"工具"|"宏"菜单,然后在宏文件MyMacros(可以从Macros IDE的工程资源管理器下存取它)下创建一个新的模块。

VS IDE的对象模型相当巨大,因此我不会在这里描述它。另外,列表1中的代码注释已经足够使你明白每一块宏代码所完成的任务。实质上,请考虑下列字段:

Public Foo as Integer

这个宏在字段名前加上一个前缀F并把该字段的存取修饰词改变成Private。最后,生成完整的属性语句并把它添加到包含该字段的模块中:

Private FFoo As Integer

Public Property Foo As Integer

Get

Return FFoo

End Get

Set(ByVal value As Integer)

FFoo = value

End Set

End Property

现在您可以在宏IDE中逐步试验该宏代码。

四、 测试宏

测试宏的最容易的方法是在宏IDE下运行它。在上下文中测试该代码的一个容易的办法是转到VS 2005 IDE中,打开命令窗口(View|Other Windows|Command Window),然后在命令窗口提示符处输入完整的宏例程名称,包括命名空间。根据我的实现,你可以选择任何字段,然后在IDE的命令窗口中输入下面内容:

Macros.MyMacros.Refactoring.EncapsulateField

如果你的路径不同于我的,IDE的智能感应特性将帮助你查找该宏的路径。

五、 把宏添加到菜单条上

测试完重构封装字段后,你就可以把它添加到Visual Studio菜单条或工具栏上。为把该宏加到Tools菜单上去,请遵循下面步骤:

1. 在Visual Studio 2005中,选择Tools|Customize。

2. 选择Command选项卡。

3. 从Categories列表下选择你刚才从Commands列表下创建的宏。

4. 把这个宏用鼠标拖拽到Tools菜单上去。

5. 在Tools菜单下的命令上单击鼠标右键,使用上下文菜单以更改菜单名-可以改成象"Encapsulate Field";而且,如果你愿意,可以添加一个图标。

6. 关闭该Customize对话框。

就是这么简单。你的定制的重构代码生成器现在是你的IDE副本的一个集成部分了!

六、 总结

本文集中讨论了Visual Studio中一个未被充分使用但却强有力的方面:宏与代码生成器。我真正希望我们一直处于更强有力和更有吸引力的软件系统的前端。在我有生之年剩下的开发时间内,非常希望能够看到软件变得真正具有生成性和更具有吸引力。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有