实用程序员提倡使用代码生成器.您是否在项目中创建代码生成器?如果是的话,你用它们做什么?
在"实用程序员"中,Hunt和Thomas区分被动和主动代码生成器.
被动发生器只运行一次,然后编辑结果.
活动生成器根据需要经常运行,您永远不应该编辑结果,因为它将被替换.
IMO,后者更有价值,因为他们接近DRY(不重复自己)原则.
如果程序的输入信息可以分为两部分,那么很少改变的部分(A)(如元数据或DSL),以及每次运行程序时不同的部分(B)(实时输入) ,你可以编写一个只接受A作为输入的生成器程序,并写出一个只接受B作为输入的ad-hoc程序.(另一个名称是部分评估.)
生成器程序更简单,因为它只需要通过输入A,而不是A和B.但是,它不必非常快,因为它不经常运行,并且它不必关心内存泄漏.
ad-hoc程序更快,因为它不必涉及几乎总是相同的输入(A).它更简单,因为它只需要对输入B做出决定,而不是A和B.
生成的ad-hoc程序非常易读,这是一个好主意,因此您可以更轻松地找到其中的任何错误.一旦你从发生器中删除了错误,它们就会永远消失.
在我工作的一个项目中,一个团队设计了一个复杂的数据库应用程序,其设计规格为2英寸厚,实施时间很长,充满了对性能的担忧.通过编写代码生成器,两个人在三个月内完成了这项工作,源代码列表(在C中)厚度约为半英寸,生成的代码速度非常快,不会成为问题.临时计划每周重新生成,费用很低.
因此,当您可以使用它时,活动代码生成是双赢的.并且,我认为这正是编译器所做的事情并非偶然.
在硬件设计中,在"堆栈"的多个级别执行此操作是相当普遍的做法.例如,我编写了一个代码生成器,用于发出各种宽度,拓扑结构以及DMA引擎和交叉开关结构的Verilog,因为表达此参数化所需的结构在合成和仿真工具流程中尚未成熟.
将逻辑模型一直发布到布局数据也是常规的,可以通过算法表达和生成非常规则的事物,如SRAM,缓存和寄存器文件结构.
我还花了相当多的时间编写一个代码生成器,它将对片上系统中的所有寄存器进行XML描述,并发出HTML(是的,是的,我知道XSLT,我刚刚发现了它以编程方式提高了时间效率),Verilog,SystemVerilog,C,汇编等对不同团队(前端和后端ASIC设计,固件,文档等)使用的数据"视图"(以及通过这个单一的XML"代码库"保持它们的一致性.这算数了吗?
人们还喜欢编写代码生成器,例如对非常常见的事物(如有限状态机)进行简洁描述,并机械输出更详细的命令式语言代码以有效地实现它们(例如转换表和遍历代码).
代码生成器如果在没有正确论证的情况下广泛使用,则会使代码不易理解并降低可维护性(顺便说一下,动态SQL也是如此).就个人而言,我正在将它与一些ORM工具一起使用,因为它们在这里的使用大多是显而易见的,有时用于搜索器 - 解析器算法和语法分析器之类的东西,这些算法最近并不是为了"手工"而设计的.干杯.
我们使用代码生成器来生成数据实体类,数据库对象(如触发器,存储过程),服务代理等.无论您看到许多重复代码遵循模式和涉及的大量手动工作,代码生成器都可以提供帮助.但是,你不应该过多地使用它,因为可维护性是一种痛苦.如果要重新生成它们,也会出现一些问题.
像Visual Studio,Codesmith这样的工具为大多数常见任务都有自己的模板,使这个过程更容易.但是,很容易自己推出.
创建一个从规范生成代码的代码生成器通常很有用 - 通常是具有常规表格规则的代码.它通过拼写错误或遗漏减少了引入错误的机会.