程序员的私人外包专家

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

引言

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

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

What

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

CodeSmith Explorer
图3,CodeSmith Explorer界面

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

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

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

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

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

Why

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/63668.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外包员工就活该被区别对待么?

点击上方“何俊林”&#xff0c;马上关注&#xff0c;每天早上8:50准时推送 真爱&#xff0c;请置顶或星标 本文作者可可&#xff0c;转账自公号开发者技术前线 最近爆出多个大公司外包被内部员工秀优越感的事情&#xff0c;到底是什么事呢&#xff0c;就是貌似一个外包吃了公司…

外包能转正吗?外包员工能变正式员工吗?

外包员工能变正式员工吗&#xff1f;这里辟谣一波&#xff0c;许多外包都说有转正机会。实际情况是几乎等于零。其中&#xff0c;三方外包更是可以直接和零划等号。三方外包的转正&#xff0c;往往就是给个内推机会&#xff0c;然后和面试官会熟悉一些。 然而这些都没什么价值…

测试员做外包能转正吗?外包员工能变正式员工吗?

外包员工能变正式员工吗&#xff1f;这里辟谣一波&#xff0c;许多外包都说有转正机会。实际情况是几乎等于零。其中&#xff0c;三方外包更是可以直接和零划等号。三方外包的转正&#xff0c;往往就是给个内推机会&#xff0c;然后和面试官会熟悉一些。 然而这些都没什么价值…

JAVA软件技术人力外派外包费用怎么算?

软件人力外包逐步成为趋势&#xff01; 当越来越多的企业选择JAVA软件人才外派的形式解决灵活用工的诉求&#xff0c;紧接着要面对的就是成本费用问题&#xff0c;很多公司反映JAVA外派公司的报价很不透明&#xff0c;也不知道该如何去做公司驻场开发的成本预算。现在&#xf…

程序员做外包能转正吗?外包员工能变正式员工吗?

外包员工能变正式员工吗&#xff1f;这里辟谣一波&#xff0c;许多外包都说有转正机会。实际情况是几乎等于零。其中&#xff0c;三方外包更是可以直接和零划等号。三方外包的转正&#xff0c;往往就是给个内推机会&#xff0c;然后和面试官会熟悉一些。 然而这些都没什么价值…

外包公司程序员的水平真的很垃圾吗?

在互联网圈存在着这么一条鄙视链&#xff1a;大厂程序员看不起自研小厂程序员&#xff0c;自研小厂程序员看不起外包程序员&#xff0c;很多人觉得自己进了外包以后简历就被污染了&#xff0c;所以哪怕失业都不愿意进外包…… 实际上&#xff0c;何不食肉糜…… 外包可能还把你…

京东API开发系列:item_get京东获得JD商品详情 API 返回值说明

为了进行电商平台京东的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个京东应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载京东API的SDK并掌握基本的API基础知识和调用 4&#xff09;利用S…

对接京东接口之获取订单信息jingdong.las.im.hfs.order.search(Java实现)

对接京东接口流程如下&#xff1a; 京东官网&#xff0c;获取JD待处理安维订单参数文档地址&#xff1a;http://jos.jd.com/api/detail.htm?id1890 对接获取订单信息jingdong.las.im.hfs.order.search代码如下&#xff1a; // 获取订单 public static LasImHfsOrderSear…

京东优惠券查询API接口接入方案,item_search_coupon - 京东优惠券查询接口

item_search_coupon - 京东优惠券查询接口说明&#xff1a; Key注册地址&#xff1a;获取Key和secret便进入到查询接口 得出数据&#xff1a; Request address: https://api-gw.onebound.cn/jd/item_search_coupon/?key& &num_iid10335871600&&langzh-CN&am…

网上下单的手机流量卡,京东快递配送开卡!有猫腻!要注意!

现在大多在网上购买流量卡的小伙们&#xff0c;一般商家发货的有3种快递&#xff0c;顺丰、EMS、京东。 发顺丰、EMS快递的卡&#xff0c;一般都是可以自己激活的。快递里面有激活说明书&#xff01;自己比着操作就可以。 发京东快递的&#xff0c;一般都是需要快递员给小伙伴…

获取京东CK

获取京东cookie 注意&#xff1a;用浏览器请使用隐身窗口&#xff0c;如果多个账号&#xff0c;一定不要点退出登录。直接关闭网页&#xff0c;清除浏览器cookie数据&#xff08;隐身窗口无需这一步&#xff09;&#xff0c;重新进入网页登录下一个账号。退出会导致刚刚获取的c…

京东API系列: item_get - 获得JD商品详情

京东API 商品详情 item_get - 获得JD商品详情 返回值&#xff1a; 返回参数: Result Object: { “item”: { “num_iid”: “29186819959”, “title”: “MOCO2018夏季新品时尚V领条纹连衣裙 摩安珂 蓝白条色 S”, “desc_short”: “”, “price”: “719.00”, “total…

京东联盟/好京客API与京东默认PID申请教程

第一节&#xff1a;京东/好京客API申请教程&#xff1a; 京东API注册测试账号 京东API测试链接和开发文档说明 1.首先打开京东联盟官方地址&#xff1a;https://media.jd.com/有账号可直接登录&#xff0c;没有注册后再登录&#xff0c;如图所示&#xff1a; 2.跳转后点击我…

获取京东CK教程

第1步&#xff1a;手机打开应用商店搜索 Alook 下载 第2步&#xff1a;打开 Alook 浏览器&#xff0c;复制下方链接登录京东 https://plogin.m.jd.com/login/login?appid445&returnurlhttps%3A%2F%2Fm.healthjd.com%2Fs%2Fmy%3Fyyjdfromflag%3Dlogin 第3步&#xff1a;登…

京东API—获取京东商品详情

返回值说明&#xff1a;申请接口地址 返回数据如下&#xff1a; { “item”: { “num_iid”: “10335871600”, “title”: “安踏男鞋休闲运动鞋男士2020夏季网面透气轻便板鞋慢跑步鞋子户外训练旅游 -18黑&#xff08;皮面&#xff09; 42”, “desc_short”: “”, “pri…

获取京东JDCookie

获取京东JDCookie 如需转载请标明出处&#xff1a;http://blog.csdn.net/itas109 技术交流&#xff1a;129518033 文章目录 获取京东JDCookie1. PC端1.1 切换到JD触屏版界面1.2 移动端登录1.3 获取cookie 2. 移动端 1. PC端 1.1 切换到JD触屏版界面 使用Chrome浏览器&#x…

京东商品获取优惠券API接口-京东优惠券如何获取-京东联盟API接口

京东单品优惠券获取教程 一.应用场景 二.环境 三.详细操作 只有一个单品应该怎么获取优惠券接口&#xff1f; 一.应用场景 API接口说明&#xff1a; 通过商品链接或SKU&#xff0c;获取京东最优券&#xff0c;方便用户领券&#xff0c;提升用户体验 应用场景&#xff1a;…

知识图谱从入门到应用——知识图谱的应用

分类目录&#xff1a;《知识图谱从入门到应用》总目录 相关文章&#xff1a; 知识图谱的基础知识 知识图谱的发展 知识图谱的应用 知识图谱的技术结构 知识图谱支持语义搜索 知识图谱源于互联网&#xff0c;所以第一个落地的应用当然也是互联网搜索引擎。前面已经介绍过&a…

知识图谱从入门到应用——知识图谱的发展

分类目录&#xff1a;《知识图谱从入门到应用》总目录 相关文章&#xff1a; 知识图谱的基础知识 知识图谱的发展 知识图谱的应用 知识图谱的技术结构 1945年&#xff0c;美国首任总统科学顾问Vannevar Bush曾提出了一个称为MEMEX的“记忆机器”的设想。他认为人的记忆偏重…

【回答问题】ChatGPT上线了!推荐30个以上比较好的构建知识图谱源码

在此列出30个比较好的构建知识图谱的源码: Neo4j AgensGraph JanusGraph AnzoGraph Cayley GraphDB ArangoDB FlockDB OrientDB Redis Graph Virtuoso TigerGraph HyperGraphDB Titan Stardog GraphQL GRAKN.AI AllegroGraph Blazegraph Google Cloud Bigtable Apache HBase …