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、涉及违规行为:如果买家违反了亚马逊的使用政策,如发表虚假评价、滥用退货政策、欺诈或盗窃等…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
2.2.2 ASPICE的需求分析
ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...
P10909 [蓝桥杯 2024 国 B] 立定跳远
# P10909 [蓝桥杯 2024 国 B] 立定跳远 ## 题目描述 在运动会上,小明从数轴的原点开始向正方向立定跳远。项目设置了 $n$ 个检查点 $a_1, a_2, \cdots , a_n$ 且 $a_i \ge a_{i−1} > 0$。小明必须先后跳跃到每个检查点上且只能跳跃到检查点上。同时࿰…...