谈谈代码生成

代码生成

作为程序员,我的理想之一是使用代码去生成代码。

代码生成可以用于很多场景,其中应用最广泛的,应该是ORM

ORM

ORM - Object Relational Mapping,即把程序语言中的对象,映射到关系型数据库的结构上。

对象属性、表结构都是有清晰的定义;相互之间的映射是可以有固定的规则;如果手动逐个对象、属性写这些映射规则的话,会相当繁琐。

一般可以使用反射,在程序运行时去判断对象以及属性,然后对映射做不同的处理;但也可以使用代码生成来实现。

相对于使用反射,我会更喜欢代码生成的方式,因为:

  • 更加容易debug
  • 编译器提供更多的检查
  • 运行性能更好

IDL

生成代码的时候,一般也会需要引入一个IDL,即Interface Definition Language,对需要处理的对象结构进行严格的定义描述,然后编译器读取这样的IDL后,再进行输出。

json、yaml等格式也可以作为IDL使用,但我一般会使用其它更加严格的语言,比方说thriftprotobuf;因为:

  • 不用自己再去发明一套语法
  • 有更多的周边工具可以使用

使用了很多年thrift做为DSL,我并不使用thrift本身的序列化、远程调用功能,仅仅是借用thrift作为IDL的语法,然后使用现成的thrift parser去生成我需要的代码。

thrift的开源parser有:python的ptsd,跟go的go-thrift等。

近两年则慢慢切换为protobuf,主要是因为我发现使用protobuf作为IDL的话,连parser都不需要。

protobuf的编译器protoc解析protobuf定义文件之后,会把解析结果,以protobuf消息的形式,传递给相应的语言插件,然后由插件再去完成具体的代码生成任务。

因为protobuf本身支持的语言已经足够丰富,所有protobuf支持的语言都可以用来开发protoc插件;在这里,protoc就相当于一个跨语言支持的parser,它会把解析结果,通过标准输入、输出传递给插件。

这就带来很大的一个便利性,之前我使用thrift作为IDL的时候,很可能需要go、前端工程师再去掌握python,然后写代码生成的代码。

使用protobuf的话,go / typescript都可以用来实现插件,分别实现自己熟悉语言的代码生成即可。

代码生成

代码生成,需要工程师提高一个抽象层次去考虑自己的代码;以web开发作为比较的话,原本是直接写html就好了,可以直接从html的角度去思考;但引入jsp、PHP甚至是react这样的等“模板”后,就需要隔开一个层次去思考。

这样“隔开一层”,对于web开发者可能会比较习惯;但对于后端等工程师,则往往会需要有一个适应的过程。

在源代码内,使用字符串拼接可以做代码生成;但也可以使用模板。

如果使用go语言开发,使用go内置的text/template库便相当顺手,go 1.6版就专门对此做了增强

Java的话,则可以考虑stringtemplatefreemaker等 .Net则可以考虑T4等。

注意,很多模板是针对html做了优化,它们可能特别适合html代码的生成,但用来生成源代码,则就非常不合适,比方说jaderazor等。

DSL

严格的说,thrift / protobuf等最多只适合对相对简单的结构、接口定义;而且,它们是对数据序列化做了考量,即需要给每个字段增加一个独立的序号。

我们若只是用它们来做IDL,不需要考虑版本兼容等问题时,额外写这么个序号其实是不必要的,虽然也不算特别麻烦。

(对于很多场景,其实使用yaml作为描述语言也是不错;几乎所有的语言也都会带有yaml的parser。)

thrift / protobuf本身都有一定的可扩展能力,但再怎么扩展,也很难将其扩展成为用来描述领域业务的语言。

groovy等脚本语言会是DSL更合适的选择。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容