做后端开发这些年,我发现自己最烦的从来不是复杂的业务逻辑,而是无穷无尽的模板代码。接口要写、字段要映射、异常要处理、算法模板更是几百行起步,这些东西结构固定、内容重复,但每写一次都要小心翼翼,漏改一个字段名,线上就给你颜色看。为了彻底解决这个问题,我折腾了一个可自定义规则的模板代码生成工具,用规则文件加模板文件的方式批量生成代码,简单、高效,而且完全不烧 token,也不依赖任何外部服务。
这个工具能做的事情一句话说清楚:你定义好规则和模板,它根据规则把模板里变化的部分替换成实际值,一次性生成完整的代码文件。适合几类人——经常写 CRUD 接口的后端开发、维护多套项目骨架的工程效率选手、比赛前需要反复手写大模板的算法竞赛党,以及所有被重复代码折磨又不想为此引入重型框架的人。如果你也有同样的困扰,这篇文章可以给你一整套可以直接落地的方案。
1. 模板代码为什么会成为负担:先从问题本身说起
1.1 模板代码的三种常见形态
很多人听到“模板代码”第一反应是代码生成器生成的那堆东西,但实际操作中,模板代码远比你想象的普遍。我自己的经验把它分成三类,每一类的痛法都不太一样。
第一类是项目骨架代码。新项目要建 Maven/Gradle 目录、要配 Swagger、要搭统一返回结构、要写分页工具类,这些代码在 A 项目和 B 项目里几乎一模一样,唯一的区别可能就是包名、项目名、几个核心类名不一样。过去我都是把上一个项目的配置文件直接复制过来,然后全局替换包名,替换完了还要担心有没有漏掉某个 yml 里的隐藏引用。
第二类是业务增删改查代码。后端写 Restful 接口,一个标准的服务模块要包含 Controller、Service、Mapper、DTO、VO、实体类这一整条链,单表 CRUD 五个接口就是十五六个方法。如果系统里有三十张表,这个数量就非常可观了。最崩溃的是数据结构调整之后,这三十个模块的公共字段都要跟着改一遍,纯手工维护基本是灾难。
第三类是算法竞赛里的固定模板。比如线段树套线段树、树链剖分、平衡树、网络流 Dinic,这些模板短则一百行、长则四五百行,而且核心结构非常固定,每次比赛前或者做新题时都要重新敲一遍。手打容易出错,用旧的又怕忘记改数据范围,这其实也是模板代码的一种,而且是最折磨人的那种。
这三类问题的共同点是:结构完全可预期,变化点就那么几个。真正花时间的地方不在“怎么写”,而在“怎么改对”。这正是模板代码生成工具能发力的地方。
1.2 为什么复制粘贴和 AI 生成都治标不治本
先说复制粘贴。它的问题不是不能用,而是不可维护。你从一个老项目里复制一份代码过来,全局替换关键字,当时可能没问题,但过两天发现漏掉了一个字段没改、一个路径没替换,排查成本比重新写一遍还高。而且全局替换这种操作本质上没有脱离“人肉”的范畴,它只是把错误从“写错”变成了“漏改”。
再来说说现在很多团队在用的 AI 生成。大模型确实能理解你的需求,给你产出一段结构完整的代码,但有几个现实问题。第一是接口调用要花钱,频繁生成代码的团队一个月 token 费用不低,很多人没意识到这块隐性成本。第二是生成结果不可控,同一个需求让模型生成三次,三次的代码风格、命名方式、结构层次都可能不一样,这给后续维护带来了很大麻烦。第三是算力消耗大,生成一个接口可能几十秒,并联交互占用的时间并不比手写短太多。
所以我在做工具的时候,理念是反过来的:能用规则描述清楚的东西,就不要让模型去“猜”,也不要在每次生成时重新“想”。模板代码的本质是确定性输出,不需要智能,需要的是稳定和一致。
1.3 工具的核心思路:用规则把“变”与“不变”拆开
写模板代码生成工具,核心思维只有一句话:把“变”和“不变”拆开。不变的是代码骨架——控制器怎么接收请求、服务层怎么定义接口、持久层怎么写 SQL,这些固定结构可以沉淀成一个模板文件;变化的是变量——类名、字段名、表名、注释、参数类型、返回类型,这些提炼成规则文件里的若干字段。
工具运行的时候,读入模板文件,读入规则文件,把模板中的占位符替换成规则中定义的值,最后输出一个完整可用的代码文件。听起来很简单,但正是这种“简单”保证了它的稳定。你不用每次让 AI 替你重新发明一遍 Controller 该长什么样,也不用担心人肉复制粘贴漏掉某个引用,因为模板定了,规则定了,输出一定是确定的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模板代码生成工具的核心设计拆解
2.1 变量定义与占位符解析:模板的“填空题”
模板文件里最基础也最核心的机制是占位符。通俗理解,模板就是一张考试试卷,试卷的题目都印好了,只有括号里的内容需要你填,占位符就是这些括号。
我推荐用双花括号的形式,例如 {{ className }}、{{ packageName }}、{{ tableName }},这种做法的好处是视觉上非常显眼,
