概述
有个玩笑说:“程序员的键盘只要CTL+C和CTL+V就够了”。
可见程序员工作中大部分的是重复的工作,对于重复且有规律的工作任务,我们应该想办法让代码去代替我们做。
一个合格的程序员,应该具备简化自己工作任务的能力,程序员的大部分时间应该是在研究技术提升技术,而不是整天做复制粘贴的码农工作。
今天以Java语言为例手把手教你开发一款属于自己的代码生成工具,实现以代码写代码。
需求分析
- 能满足各种需求场景
- 添加新需求尽可能操作简单
- 不依赖第三方jar包
设计
我们知道一般的代码生成工具都是会定义模版,然后通过模版引擎及上下文变量来生成最终的代码。所以我们的代码生成工具也将采用模版的方式生成代码。
-
模版设计
为了能满足多种需求场景的代码生成,及添加新需求尽可能操作简单,模版采用最简单的文本格式即常用的txt格式,通过添加不同的模版文件来实现增加新的需求 -
模版引擎设计
通过Java中String类的replace和replaceAll方法,实现对模版文件中变量的填充。
代码编写
以复制如下代码用于Role为例,可以看出该业务是对用户表进行分页查询的操作。当业务需求需要增加新的表时,对于新的表也需要分页查询,传统的做法是自己实现这段逻辑,这样使得代码实现样式不统一,同时每次都重新实现增加了更多的人的操作,也是的代码的错误几率增加。更好的方法是复制成熟经过产线验证的代码过来替换其中的参数为新的表即可。而这样的工作交给程序来做非常合适。
/**
* 列表页面数据
* @return 数据 JSON
* @author tech-farmer 2021-11-10 14:51:12
*/
@RequestMapping(value = "/list",method = RequestMethod.POST)
@ResponseBody
public String list(PageDTO pageDTO,@FormModel("condition") User user){
userService.listForPage(pageDTO,user);
return JSON.toJSONString(pageDTO);
}
- 将成熟的代码片段制成模版文件
在项目templates目录下添加模本文件testTemplate.txt,将上面的成熟代码片段拷贝到模版文件中,使用变量(形如“${var}”)替换代码片段中的参数值即可,文件内容如下:
/**
* 列表页面数据
* @return 数据 JSON
* @author ${author} ${createTime}
*/
@RequestMapping(value = "/list",method = RequestMethod.POST)
@ResponseBody
public String list(PageDTO pageDTO,@FormModel("condition") ${bigEntityName} ${littleEntityName}){
${littleEntityName}Service.lis