AIGC|当一个程序员学会用AI来辅助编程实践
一、辅助编程
作为主要以 JAVA 语言为核心的后端开发者,其实,早些时间我也用过比如 Codota、Tabnine、Github 的 Copilot、阿里的 AI Coding Assistant 等 IDEA 插件,但是我并没有觉得很惊奇,感觉就是生成一些代码片段罢了,直到我接触了 ChatGPT......
(一)代码生成
去年9月份的时候,我接到一个项目,是老项目重构,具体要求就是给你提供入参和出参的结构文档,然后你来写具体的代码,将入参对象 XxxxDTO 解析后调用另外一个服务,然后他再将处理后的结果返回给你,你再解析成 java 对象返回。大概有一百多个接口要实现,其中不乏有入参中有几十个字段的类,写service层真的很累很累。入参结构和对应的类如下图:
@Data
publicclassXxxxDTO {privateStringfiled1;
privateStringfiled2;
privateStringfiled3;
privateStringfiled4;privateList<XxxxItemDTO> list1;privateStruct1 struct1;
}@Data
classXxxxItemDTO {
privateStringlist1_filed1;
privateStringlist1_filed2;
privateStringlist1_filed3;
}@Data
classStruct1 {
privateStringstruct1_filed1;
privateStringstruct1_filed2;
privateStringstruct1_filed3;
}
最开始,我分析了需求,使用了模板方法模式来实现这个service层的功能,然后每个接口就只需要实现模板类的抽象方法即可,即实现远程调用接口的函数名,入参对象的拼装,出参对象的拼装三个方法的实现。
后来发现,每个人的代码都或多或少的会出现问题,比如代码风格,单词打错,漏写或者错写等问题,而且代码特别多,不好定位问题。于是我就用 java 写了一个工具类,用来生成代码,这样,我们就只用关心入参和出参是否写对就行了,其他的代码就按模板来生成。
其实生成代码的方法有很多,比如通过模板文件生成代码,但是我为了不引入多余的依赖,我直接使用了最笨且最有效的方式,即反射解析类的详情,然后在控制台打印出具体代码。
然后我们就顺利的减少了90%的代码编写,只需要将入参出参的类创建好即可。至于定位问题,只要能保证代码生成器没有问题,那我们就可以只通过判断类的创建是否正确就可以了。
之所以要说这个案例,就是为了来引出我是怎么使用 ChatGPT 的。在这个项目快结束的时候,AI火了,我试着使用 ChatGPT 来实现这个代码的生成,结局让我大吃一惊。
我的思路有两个,一个是通过给他模板和出入参对象的方式,让他直接给我生成代码,还有一种就是通过我的调教,让他给我写一个代码生成器出来。
于是我先测试了方案一,那就是把我已经写好的几个接口告诉给他,让他模仿着来给我写出类似的代码,如果哪里有问题,我就会告诉他确实是有问题的,让他进行调整,在经过半个小时的微调后,他已经能够很好地通过我给的类来生成具体的代码了。只要我这个会话还在,那么我就可以随时的回来,让他生成类似的代码。而坏处就是,只能我自己用,别人想用的话,就得自己去训练了。
所以才有了方案二,那就是让他帮我生成一个类似于我前面写的那个工具类,放到项目里,这样,所有开发者就能直接使用工具类来生成代码了。然后我便开始了实践,虽然说,他一开始回复我的代码生成器问题很多,但是我们能通过对话很好的让他进行微调,最后,我也是成功的让他帮我实现了代码生成器的功能,这比我自己手写快了一倍。
其实,我们还能使用 PDF 的 AI工具,直接读取文档,然后连出入参对象也生成出来呢~那可能是99%的代码都已经能自动生成了。(不过这个可能会出错,没有代码生成器稳定)
接下来,我直接演示一个案例,让大家感受下ChatGPT代码生成的威力:
总所周知,mybatis plus 等 ORM 框架是自带代码生成的,一般就是通过定义好数据库的表,然后通过解析这个表来实现代码的生成。但是,大多数人的习惯一般是先定义实体类,然后才去数据库创建对象,而且如果编码人员水平不高的话,很有可能会创建出一些很拉胯的数据表定义,从而导致问题。因此,我通过和 ChatGPT 对话,让他帮我生成了一个代码生成器,来实现通过反射实体类的方式生成建表SQL。(下面案例只展示最简单的实现,关于继承子类,涉及comment等高级操作这里就不演示了,感兴趣的话可以后台联系作者了解演示详情)
接下来我们去idea实测一下
可以发现,他生成的SQL不是下划线形式,且没有设置非空,我们可以让他修改。
再去idea测试下
可以看到,基本上已经没有问题了,再自己微调一下代码,后面使用的时候,我们就只需要再根据实际情况,修改一下表字段的范围即可,这样就能省去一个一个复制粘贴的时间了,简直爽歪歪。(如前面提到的,目前这个sql生成器还是有很大问题的,大家可以自己试着完善一下,让他能实现在sql中也生成 comment,继承子类的 ORM 的对象的sql生成,固定字符集,设置默认值,设置数据类型的范围等等,当然我已经调教好我自己的sql生成器了)
像这种经常用的,当然是搞出代码生成器最好了,还有一些简单的,不常用的生成,我们就可以直接让他生成代码,而不是搞出代码生成器了。这里再举最后一个例子:
像有些老数据库,他们没有使用mybatis plus,需要写各种各样的SQL,很麻烦。那么我们就可以解析他的插入方法,生成 ORM 对象,然后通过mybatis plus来快捷使用。
不会吧?不会吧?不会还有人在 AI 时代下,还一个个复制粘贴吧。不会吧,不会吧......(
狗头保命)
二、其他功能
(一)工具手册
关于工具手册这点没有太多可说的,我们可以把 ChatGPT 当成工具书,直接向他提问,很多时候,先问 ChatGPT,可能比百度,Google更快。他不仅能够给出你答案,你还可以让他给你演示示例,以下为我自己体验过的一些方向:
- 根据你的描述快速生成正则表达式,而不是自己慢慢调试。
- 快速生成一些代码示例,比如问他如何合并两个list,如何使用stream流来实现groupBy,如何在springboot框架中动态增强源码。
- 生成Ant风格的路径通配符,UEL风格的表达式等,其实这个基本上和①是一个意思(我自己容易记混,用ChatGPT生成确实比每次查资料再写快一些)。
(二)源码学习
最近的时间,我也是一直在研究flowable的源码,但是源码确实有很多地方没有注释,所以,我会拿出那个代码片段去问他,让他作为 flowable 专家来告诉我每一步是干什么的,他也能很聪明的识别出那段代码的作用,甚至知道代码是写在什么位置。
我也会将实体类都发给他,他会帮我把每一个字段的含义和用法告诉我,确实比百度要来的更快,有些东西搜索引擎和官方文档都查不到,但是他能够通过他的智能,判断出字段的作用,这极大地协助了我进行我们项目流程中心服务的代码优化。
而且,你可以在不知道是哪段代码的情况下,直接问他 flowable 这块是怎么实现的,他也能自己分析出来,然后告诉你答案。
(三)技术讨论
技术讨论这一部分,其实可以包括代码review,代码优化等子部分,也可以和他讨论当下一些技术的实现方案,每当我有好的想法时,我也会和他沟通,看看他的意见,下面我做一下展示:
代码分析的简单举例
其他举例
很多时候,我们规定了工具类库,但是,有些人不知道有某些工具类,他们就会这种工具类用一下,那种工具类用一下,就显得很不协调,因此,我们可以直接问他,XXX工具类库有无这样的方法。使用该思路,可以让团队的代码更加让人心旷神怡,在一些代码规范要求比较高的地方很好用。
由于篇幅要求,我还是尽量精简了一些,主要还是想说明一些我自己的思路,希望对大家有用。
版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。
公众号搜索神州数码云基地,了解更多AI相关技术干货。
相关文章:

AIGC|当一个程序员学会用AI来辅助编程实践
一、辅助编程 作为主要以 JAVA 语言为核心的后端开发者,其实,早些时间我也用过比如 Codota、Tabnine、Github 的 Copilot、阿里的 AI Coding Assistant 等 IDEA 插件,但是我并没有觉得很惊奇,感觉就是生成一些代码片段罢了&#x…...

9.14号作业
仿照vector手动实现自己的myVector,最主要实现二倍扩容功能 有些功能,不会 #include <iostream>using namespace std; //创建vector类 class Vector { private:int *data;int size;int capacity; public://无参构造Vector(){}//拷贝构造Vector(c…...
【面试题】C/C++ 中指针和引用的区别
指针是一个独立的对象,它可以指向不同的变量或对象,可以重新赋值给其他变量。而引用是已存在的变量的别名,它必须在定义时初始化,并且不能重新绑定到另一个变量。指针可以是空指针(nullptr),它不…...

spring boot 整合多数据源
多数据源产生的场景 一般情况下,不会有多数据源这样的场景出现,但老项目或者特殊需求的项目,可能会有这样的场景 同一个应用需要访问两个数据库不用数据库中间件的读写分离 注入数据源选择的时机 声明两个数据源实例,在getConnect…...

数据集成:数据挖掘的准备工作之一
⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…...

xml配置文件密码特殊字符处理
错误姿势: 正确姿势:采取转义符的方式 常用转义符:...

遥感数据与作物模型同化
基于过程的作物生长模拟模型DSSAT是现代农业系统研究的有力工具,可以定量描述作物生长发育和产量形成过程及其与气候因子、土壤环境、品种类型和技术措施之间的关系,为不同条件下作物生长发育及产量预测、栽培管理、环境评价以及未来气候变化评估等提供了…...

UI库DHTMLX Suite v8.2发布全新表单组件,让Web表单实现高度可定制!
DHTMLX Suite v8.2日前已正式发布,此版本的核心是DHTMLX Form,这个小部件接收了4个备受期待的新控件,如Fieldset、Avatar、Toggle和ToggleGroup。官方技术团队还为Grid和TreeGrid小部件中的页眉/页脚工具提示提供了一系列新的配置选项等。 在…...

河北省图书馆典藏《乡村振兴振兴战略下传统村落文化旅游设计》许少辉八一新著
河北省图书馆典藏《乡村振兴振兴战略下传统村落文化旅游设计》许少辉八一新著...
什么是卷积002
文章目录 前言1.卷积网络和传统网络区别2.卷积神经网络整体架构1.输入层2. 卷积层3.池化层4.全连接层 5.神经网络6.经典网络1.Alexnet2. Vgg3.Resnet 残差网络-特征提取 7.感受野 前言 大纲目录 首先链接图像颜色通道 1.卷积网络和传统网络区别 右边的就是CNN,卷…...

黑马JVM总结(八)
(1)StringTable面试题 1.8 1.6时 (2)StringTable的位置 jvm1.6时StringTable是常量池的一部分,它随着常量池存储在永久代当中,在1.7、1.8中从永久代变成了堆中,为什么做这个更改呢?…...

开源网安入选广东省网络空间安全标准化技术委员会新技术及应用安全技术工作组成员单位
近日,第二届广东省网络空间安全标准化技术委员会(GD/TC 124)(以下简称省网安标委)正式成立。为进一步发挥省网安标委在支撑网络强国建设、推进网络安全产业高质量发展过程中,示范引领核心技术攻关、创新产品…...

Nginx配置指南:如何定位、解读与优化Linux上的Nginx设置
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🛠️ 全栈技术 Full Stack: 📚…...

辉瑞与吉利德科学:制药巨头的新冠病毒之战
来源:猛兽财经 作者:猛兽财经 总结: (1)猛兽财经认为,华尔街低估了辉瑞(PFE)和吉利德科学(GILD)的前景,因为它们在开发新冠病毒疫苗和药物方面都…...

x86架构基础汇编知识
通用寄存器 EAX 32位 函数返回值 AX 低16位 AH 高八位 AL 低八位 EBX 32位 ECX 32位 循环次数,this指针 EDX 32位 EBP 32位 栈底寄存器 ESP 32位 栈顶寄存器 ESI 源索引寄存器 EDI 目标索引寄存器 EIP 无法直接通过汇编操作 例子 mov al,0xff …...
ThreadLocal的原理
ThreadLocal是Java中的一个类,它提供了线程本地变量的功能。每个线程都可以独立地访问自己的ThreadLocal变量,并且不会受到其他线程的干扰。 public class ThreadLocal<T> { ThreadLocal的原理是通过使用一个ThreadLocalMap来存储每个线程的变量副…...

Chrome 108版(64-bit 108.0.5359.125)网盘下载
还在用Selenium的朋友们注意了,目前Chrome的最新版是116,而官方的Chromedriver只支持到115版。 可惜Google不提供旧版Chrome的下载方式,需要旧版的很难回去了。如果真的想要旧版的Chrome,只能民间自救。 我在2022年12月备份了C盘…...

Mars3d插件参考开发教程并在相关页面引入
问题场景: 1.在使用Mars3d热力图功能时,提示mars3d.layer.HeatLayer is not a constructor 问题原因: 1.mars3d的热力图插件mars3d-heatmap没有安装引用。 解决方案: 1.参考开发教程,找到相关的插件库:Mars3D 三维…...

Windows 性能突然打鸡血,靠 Bug 修复了多年顽疾
要说 的 Bug 集中地,当属资源管理器。 速度缓慢、卡顿、崩溃,不同设备、不同版本的用户都有不同的感受。 严格来说,这其实是 Windows 的传统艺能,要完美修复可不容易。 而作为小老弟的文件资源管理器,时不时来个无响…...

亚马逊封买家账号的原因有哪些
亚马逊可能封锁买家账号的原因有多种,主要是出于保护市场和维护平台秩序的考虑。以下是一些可能导致亚马逊封锁买家账号的常见原因: 1、涉及违规行为:如果买家违反了亚马逊的使用政策,如发表虚假评价、滥用退货政策、欺诈或盗窃等…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...