【已发表于《程序员》2007年第1期,全名《程序员的私人外包专家——探索CodeSmith代码生成器》,因篇幅限制,杂志上略有删减】

引言

如果机器猫是个软件开发人员,那么它一定能从口袋里掏出如图1所示的软件,简洁明快的界面上仅有几个必要的输入控件,只要用鼠标轻轻点击这个按钮,硬盘便会像着了魔一样疯狂地发出一阵吱吱的叫声,数分钟后,当这个世界重新安静下来时,一款全新的软件诞生了!

图1,传说中机器猫的软件开发解决方案

不过就目前的技术水平来说,这还只能算是“痴人说梦”。那么,有没有什么软件可以减轻程序员的重复性劳动,将“百忙”变为“不忙”,使得大家有更多的时间来陪伴家人和女友呢?现在软件行业不是流行“外包”吗?大公司外包给小公司、小公司外包给个体户,那么程序员可以将手头上一部分编码工作外包给谁呢?除了Ctrl+C、Ctrl+V这对著名的孪生兄弟外,我想CodeSmith会是一个更好的选择。

What

什么是CodeSmith?从字面上直译可以看作“代码工匠”。这倒是个很拟人化的名称,顾名思义,CodeSmith的目标就是根据模板生成规范可用的代码,为程序员减轻工作负担。
程序员是软件开发团队中的最小单位,有什么任务都只能自己一肩扛起而无法再往下分配。但是程序员又是聪明的,他们总是能找到很多美妙的办法来减轻压力,代码生成器就是一个典型的例子。事实上,Visual Studio 2005本身就自带了代码生成的功能,比如您在代码编辑器中输入关键字“for”,然后直接按Tab键,代码生成器便会为您生成好一段模板式的代码:

图2,Visual Studio 2005的代码生成功能

Visual Studio 2005还能自动生成其它更多形式的代码,但终究不如CodeSmith那样强大和丰富,毕竟术业有专攻嘛。CodeSmith是以模板作基础来为程序员生成高质量代码的,模板可大可小,CodeSmith一次能够生成的代码量也就可多可少,这主要靠具体问题具体分析。

CodeSmith的模板是以“.cst”为后缀名的代码文件,其风格非常类似于ASP.NET。模板中除了大量固定的代码以外,还有遍布于各处的元数据(metadata)。固定代码就是会被CodeSmith原封不动地输出的代码,而元数据则可以被看作是模板中的变量。那么现在我们就通过一个简单的模板文件来了解CodeSmith的工作原理:

 1 <% @ Template Language = " C# "  TargetLanguage = " C# "  Description = " Demonstrates the most basic template. "   %>         
 2 <% @ Property Name = " SampleBooleanProperty "  Type = " System.Boolean "  Default = " True "  Category = " Options "  Description = " This is a sample boolean property. "   %>
 3 <% @ Property Name = " SampleStringProperty "  Type = " System.String "  Default = " SampleString "  Category = " Options "  Description = " This is a sample string property. "   %>
 4 //  This class generated by CodeSmith on <%= DateTime.Now.ToLongDateString() %>
 5 public   class  SimpleTemplate
 6 {
 7    public SimpleTemplate() : base()
 8    {
 9    }
10    <% if (SampleBooleanProperty) { %>
11    
12    private void <%= SampleStringProperty %>()
13    {
14        // Do something
15    }
16    <% } %>
17}

如果您了解ASP.NET的语法,那么就很好理解CodeSmith模板文件了。第一条语句:

<% @ Template Language = " C# "  TargetLanguage = " C# "  Description = " Demonstrates the most basic template. "   %>

是模板文件的声明语句,每个模板文件都必须以此作为开头,它包含了必要的声明信息,如模板语言、目标语言以及模板描述。除必需的“Language”属性以外,CodeSmith还提供7个可供模板声明使用的属性:
●    Description:作为模板的描述性信息并可以在该模板的ToolTip中显示;
●    Inherits:尽管默认情况下所有模板都继承自CodeSmith.Engine.CodeTemplate,但仍然可以由您来指定模板继承自其它类(只要该类直接或间接地继承自CodeSmith.Engine.CodeTemplate);
●    Src:该属性使您能够将其它类的功能添加进当前模板,您能够用这个属性来实现“代码隐藏”模型;
●    Debug:当该属性被设置为True时,您就可以使用System.Diagnostics.Debugger.Break方法来为您的模板设置断点;
●    OutputType:该属性用于指定以“Normal”、“Trace”或“None”方式输出模板;
●    LinePragmas:当该属性被设置为True时,模板错误将指向源代码;设置为False时,模板错误将指向编译后的代码;
●    ResponseEncoding:用于设置模板及输出的编码,该属性支持来自于System.Text.Encoding.GetEncoding方法的值,默认情况下为ASCII。

模板中的代码可以分为三个部分:静态、系统生成和动态的。静态代码就是系统将原封不动地输出的代码,例如前面代码示例中的:

public  SimpleTemplate() :  base ()

CodeSmith可以自动生成部分代码,例如示例中的:

//  This class generated by CodeSmith on <%= DateTime.Now.ToLongDateString() %>

CodeSmith将<%= %>标记中间的部分作为计算表达式,在运行时计算该表达式并将结果输出到代码中相应的位置。CodeSmith中的属性用以实现用户自定义的输出内容,例如示例中的:

<% @ Property Name = " SampleStringProperty "  Type = " System.String "  Default = " SampleString "  Category = " Options "  Description = " This is a sample string property. "   %>

属性具有名称和类型,这是必需的内容,另外还可以给属性设置一个默认值,添加一些描述性说明以便于用户在使用该属性时能够迅速地了解其用途和用法。使用属性时仍然会用到<%= %>标签,在该标签中插入需要的属性名即可,例如:

private   void   <%=  SampleStringProperty  %> ()

尽管模板文件的内容似乎要比所需要的源代码复杂得多,但这是一劳久逸的工作,因为您可以用模板生成无数代码,当初编辑模板时花费在编写动态内容及属性上的辛苦付出将在日后使用模板时得到丰厚的汇报!

当前最新版本是于11月8号发布的V4.0。作为一次大的版本升级,CodeSmith理所当然地给我们带来了新的特性,这些新特性一方面使CodeSmith成为更加强大的软件,另一方面也使得程序员们更加青睐这位得力助手。目前CodeSmith V4.0已经很好地集成进Visual Studio 2005,这样一来,程序员就能够更加方便地使用它了。那么,就让我们来看看,CodeSmith还为我们带来了哪些振奋人心的新特性吧:
●    CodeSmith Project:CSP的出现使得您无论在Visual Studio 2005、MSBuild、Windows Explorer、命令行、批处理文件或是CodeSmith自身环境下都可以以轻松、一致的方式自动地生成代码;
●    ActiveSnippets:比Visual Studio 2005的Snippet更加强大,可以通过执行逻辑处理或是访问复杂的原数据来控制代码片段的输出;
●    CodeSmith Maps:创建字典式的映射,例如SQL与C#的数据类型映射;
●    .netTiers 2.0:增强的.netTiers模板;
●    Extended Property Management:可以在CodeSmith Studio中编辑或者添加模式扩展属性;
●    Property Persistence:现在CodeSmith可以记住您最近一次执行模板时的属性值;
●    CodeSmith Studio:改进了智能感应并全面提升性能;

How

怎样使用CodeSmith?不论我说的多么天花乱坠,如果不告诉大家一些基本常用的使用方式,那么本文就起不到广而告之的作用。那么我就以简单的例子来向大家演示如何使用CodeSmith来减轻开发人员的工作负担。

您可以从CodeSmith Tool LLC的官方网站上下载该软件,推荐使用Professional版,安装完毕之后您会看到有两个图标,一个是CodeSmith Explorer,另一个是CodeSmith Studio,前者是利用模板输出代码的,而后者则用于编辑模板。我们先运行CodeSmith Explorer来看看如何通过模板得到我们想要的代码。


图3,CodeSmith Explorer界面

运行CodeSmith Explorer就能看到如图3所示的界面,点击Collections前面的加号就会看到有个ArrayList.cst的节点,如图4所示:

图4,选中ArrayList.cst模板

双击该节点,便会弹出CodeSmith的输出窗口,在窗口的左边是属性输入框,您可以根据自己的需要设定各属性的值,然后只需轻轻点击下面的Generate按钮,CodeSmith就能立刻为您献上一份长长的源代码,如图5所示:

图5,使用CodeSmith生成源代码

该例子所生成的源代码共有2302行,想想如果手工输入这么多代码需要花费多少时间呢?而使用CodeSmith则仅花费了不到1分钟时间,其魅力则就不言而喻了!

如果您对CodeSmith提供的模板感到不太满意,或者您需要根据自己的需求来制作相应的模板,则可以使用CodeSmith Studio来新建或编辑现有代码模板,例如,你对刚才我们使用到的ArrayList.cst模板感到不甚满意,觉得自己有更好的创意,那么你可以运行CodeSmith Studio,然后在右边的文件列表中找到并打开ArrayList.cst,还记得刚才我介绍的那些模板元素以及它们各自的特性和用途吗?好吧,现在就开始动手根据您自己的想法来完善这个模板吧。

图6,编辑代码模板

在这里因为篇幅有限,所以我只是使用了一个最简单的例子来向大家展示使用CodeSmith的好处,其实CodeSmith的强大远不仅仅是输出这样简单的代码文件,记住,CodeSmith是基于模板生成代码的,因此,套用那句“人有多大胆,地有多高产”的话来说就是:“模板有多强大,代码就有多丰富!”

Why

为什么向您推荐CodeSmith?可千万别把我当成了托儿,我可没有收取CodeSmith Tools LLC任何物质上以及精神上的报酬,不过是为了和广大开发着朋友们分享一款优秀的专业软件而已。

其实有很多代码都是不需要我们自己从头到尾亲自写一遍的,尤其是在工作中,为什么不能用更少的时间完成更多的事情呢?程序员从事的是脑力劳动,我们应该充分运用我们的头脑来找到解决问题的更快更好的办法,只有当我们能够很好地解决自己工作中的问题的时候,我们才能够为我们的用户提供能很好解决他们面临的问题的解决方案。

程序员的私人外包专家相关推荐

  1. 程序员可以在外包公司做多久?能做一辈子吗?

    很多人计算机专业的朋友大学毕业之后一头就扎进了外包公司,不是不想去大厂,我们得认识到绝大多数人都是没有竞争力的,只好先去外包公司混着.程序员可以在外包公司做多久?能做一辈子吗?我来简单分享一下. 程序 ...

  2. 开发拍照识花App,程序员秒变“植物专家”

    春暖花开,万物复苏,正是踏青好时候.周末,阿珍组织班级里的小朋友去公园踏青,程序员阿强,作为护花使者也一同前往. 阿强本以为,可以肆意在林间草地自由地奔跑,回忆一下逝去的童真时光,没想到却成了小朋友们 ...

  3. 神操作!美国程序员把工作外包给中国程序员,上班摸鱼吸猫年入 20 万美元

    作者 | 英国那些事儿 来源 | 转自英国那些事儿 话说,今天在 Reddit 上看到一个无比骚的操作... 这事发生在 2012 年,事情是这样的- 主人公是个叫 Bob 的美国程序员. 他 40 ...

  4. 为什么都建议程序员不要做“外包”?看完这些经历,很辛酸

    在程序员圈子里面,外包程序员似乎永远处于一个尴尬的角色,如果你说他们不是程序员吧,他们也是程序员.应该说是外包这个词比较尴尬吧. 其实我们身边也有很多外包程序员,我身边也有从外包进一线互联网企业的例子 ...

  5. 美国程序员把工作外包给中国程序员,啥也不干年入 20 万美元,这操作也是骚...

    公众号关注 "GitHubDaily" 设为 "星标",带你了解技术圈内新鲜事 转自英国那些事儿 话说,今天在 Reddit 上看到一个无比骚的操作... 这事 ...

  6. 程序员怒怼外包公司HR:1万块钱还想招C语言开发,简直石乐志!

    对于外包公司大家应该都不陌生,简而言之就是第三方劳务公司,相当于人力中介,中间贩子的角色,在所有的外包公司中,尤以程序员外包最多最广.随着互联网行业的大热,外包程序员的工资也水涨船高,基本都是上万的月 ...

  7. 广大程序员不要做外包

    本文完全是我自己对软件外包认识,可以说是个"议论文",请大家看的时候可以从自己的角度出发,来感受这篇文章里面所涉及的内容. 我所知道的外包人员的职位: 1. 程序员. 2. 软件测 ...

  8. 真的,程序员别去外包公司|程序员有话说

    作者 | 安晓辉 责编 | 伍杏玲 本文经授权转载自程序视界(ID:programmer_sight) 有程序员问我: 想问下大四毕业,学的软件工程基础不太好,今天去面试了恩梯梯数据(中国)有限技术公 ...

  9. 做了6年php,30岁程序员要去做外包,这个选择靠谱么?网友:别!

    在互联网行业,作为一名技术人员,大部分人都有换工作的经历,不过在职业生涯内,换工作的次数也是非常有限的(个人觉得超过2位数就算是比较频繁了),每一次换工作,都算是人生的重大选择,都有可能决定今后的命运 ...

最新文章

  1. 使用 U 盘制作 Ubuntu 系统启动盘
  2. Spring MVC前后端的数据传输
  3. JavaScript——易班优课YOOC课群在线测试自动答题解决方案(十六)利用PC端和移动端BUG
  4. 计算机微课应用报告书,【计算机专业论文】计算机专业教学中微课的应用(共4253字)...
  5. 数学--数论--莫比乌斯函数
  6. c语言 静态变量 初始化,c – 静态变量初始化两次
  7. 12.2日,第二次团队冲刺开始
  8. json session cookie介绍和使用
  9. URL报错: unknown protocol
  10. Java New IO
  11. 腾讯云一站式物联PaaS平台IOT Suite助力行业加速“物联网+”
  12. linux内存使用率如何查看,linux内存使用率 linux查看内存
  13. laravel 框架使用hdjs 实现多图上传功能
  14. Python函数的定义使用、return返回值、参数传递方式、结合字典列表循环的使用以及将函数存储在模块中
  15. 快速学习-web3.js简介与入门
  16. Vue - 判断终端是否为:IE内核、opera内核、苹果、谷歌内核、火狐内核、是否为移动终端、ios终端、android终端、是否为iPhone或者QQHD浏览器、是否iPad、是否微信、是否QQ
  17. 职业讨债人要失业了?人工智能就是这样让人乖乖还钱的…
  18. 循环的进阶:二重循环
  19. 微信小程序布局 头尾固定中间自适应
  20. 7、Spring AOP使用

热门文章

  1. 急,在线等!!!!!
  2. Linux面试题【常见】
  3. 音视频架构的三部分之推流过程(一)
  4. 命令行——rm命令(删除)详解
  5. 海思PQTool进行CCM调试经验
  6. Unresolved reference ‘sklearn‘问题|scikit-learn包安装
  7. C++ vector中删除元素
  8. 2020年Java程序员的就业前景如何?
  9. 正态总体下的假设检验
  10. 微信小程序js数组中插入“新数据对象”,数据对象中插入“新属性”