当前位置: 首页 > news >正文

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更快。他不仅能够给出你答案,你还可以让他给你演示示例,以下为我自己体验过的一些方向:

  1. 根据你的描述快速生成正则表达式,而不是自己慢慢调试。
  2. 快速生成一些代码示例,比如问他如何合并两个list,如何使用stream流来实现groupBy,如何在springboot框架中动态增强源码。
  3. 生成Ant风格的路径通配符,UEL风格的表达式等,其实这个基本上和①是一个意思(我自己容易记混,用ChatGPT生成确实比每次查资料再写快一些)。

(二)源码学习

最近的时间,我也是一直在研究flowable的源码,但是源码确实有很多地方没有注释,所以,我会拿出那个代码片段去问他,让他作为 flowable 专家来告诉我每一步是干什么的,他也能很聪明的识别出那段代码的作用,甚至知道代码是写在什么位置。

我也会将实体类都发给他,他会帮我把每一个字段的含义和用法告诉我,确实比百度要来的更快,有些东西搜索引擎和官方文档都查不到,但是他能够通过他的智能,判断出字段的作用,这极大地协助了我进行我们项目流程中心服务的代码优化。

而且,你可以在不知道是哪段代码的情况下,直接问他 flowable 这块是怎么实现的,他也能自己分析出来,然后告诉你答案。

(三)技术讨论

技术讨论这一部分,其实可以包括代码review,代码优化等子部分,也可以和他讨论当下一些技术的实现方案,每当我有好的想法时,我也会和他沟通,看看他的意见,下面我做一下展示:

代码分析的简单举例

其他举例

很多时候,我们规定了工具类库,但是,有些人不知道有某些工具类,他们就会这种工具类用一下,那种工具类用一下,就显得很不协调,因此,我们可以直接问他,XXX工具类库有无这样的方法。使用该思路,可以让团队的代码更加让人心旷神怡,在一些代码规范要求比较高的地方很好用。

由于篇幅要求,我还是尽量精简了一些,主要还是想说明一些我自己的思路,希望对大家有用。

版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。

公众号搜索神州数码云基地,了解更多AI相关技术干货。

相关文章:

AIGC|当一个程序员学会用AI来辅助编程实践

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

9.14号作业

仿照vector手动实现自己的myVector&#xff0c;最主要实现二倍扩容功能 有些功能&#xff0c;不会 #include <iostream>using namespace std; //创建vector类 class Vector { private:int *data;int size;int capacity; public://无参构造Vector(){}//拷贝构造Vector(c…...

【面试题】C/C++ 中指针和引用的区别

指针是一个独立的对象&#xff0c;它可以指向不同的变量或对象&#xff0c;可以重新赋值给其他变量。而引用是已存在的变量的别名&#xff0c;它必须在定义时初始化&#xff0c;并且不能重新绑定到另一个变量。指针可以是空指针&#xff08;nullptr&#xff09;&#xff0c;它不…...

spring boot 整合多数据源

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

数据集成:数据挖掘的准备工作之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…...

xml配置文件密码特殊字符处理

错误姿势&#xff1a; 正确姿势&#xff1a;采取转义符的方式 常用转义符&#xff1a;...

遥感数据与作物模型同化

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

UI库DHTMLX Suite v8.2发布全新表单组件,让Web表单实现高度可定制!

DHTMLX Suite v8.2日前已正式发布&#xff0c;此版本的核心是DHTMLX Form&#xff0c;这个小部件接收了4个备受期待的新控件&#xff0c;如Fieldset、Avatar、Toggle和ToggleGroup。官方技术团队还为Grid和TreeGrid小部件中的页眉/页脚工具提示提供了一系列新的配置选项等。 在…...

河北省图书馆典藏《乡村振兴振兴战略下传统村落文化旅游设计》许少辉八一新著

河北省图书馆典藏《乡村振兴振兴战略下传统村落文化旅游设计》许少辉八一新著...

什么是卷积002

文章目录 前言1.卷积网络和传统网络区别2.卷积神经网络整体架构1.输入层2. 卷积层3.池化层4.全连接层 5.神经网络6.经典网络1.Alexnet2. Vgg3.Resnet 残差网络-特征提取 7.感受野 前言 大纲目录 首先链接图像颜色通道 1.卷积网络和传统网络区别 右边的就是CNN&#xff0c;卷…...

黑马JVM总结(八)

&#xff08;1&#xff09;StringTable面试题 1.8 1.6时 &#xff08;2&#xff09;StringTable的位置 jvm1.6时StringTable是常量池的一部分&#xff0c;它随着常量池存储在永久代当中&#xff0c;在1.7、1.8中从永久代变成了堆中&#xff0c;为什么做这个更改呢&#xff1f…...

开源网安入选广东省网络空间安全标准化技术委员会新技术及应用安全技术工作组成员单位

近日&#xff0c;第二届广东省网络空间安全标准化技术委员会&#xff08;GD/TC 124&#xff09;&#xff08;以下简称省网安标委&#xff09;正式成立。为进一步发挥省网安标委在支撑网络强国建设、推进网络安全产业高质量发展过程中&#xff0c;示范引领核心技术攻关、创新产品…...

Nginx配置指南:如何定位、解读与优化Linux上的Nginx设置

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…...

辉瑞与吉利德科学:制药巨头的新冠病毒之战

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;猛兽财经认为&#xff0c;华尔街低估了辉瑞&#xff08;PFE&#xff09;和吉利德科学&#xff08;GILD&#xff09;的前景&#xff0c;因为它们在开发新冠病毒疫苗和药物方面都…...

x86架构基础汇编知识

​ 通用寄存器 EAX 32位 函数返回值 AX 低16位 AH 高八位 AL 低八位 EBX 32位 ECX 32位 循环次数&#xff0c;this指针 EDX 32位 EBP 32位 栈底寄存器 ESP 32位 栈顶寄存器 ESI 源索引寄存器 EDI 目标索引寄存器 EIP 无法直接通过汇编操作 例子 mov al&#xff0c;0xff …...

ThreadLocal的原理

ThreadLocal是Java中的一个类&#xff0c;它提供了线程本地变量的功能。每个线程都可以独立地访问自己的ThreadLocal变量&#xff0c;并且不会受到其他线程的干扰。 public class ThreadLocal<T> { ThreadLocal的原理是通过使用一个ThreadLocalMap来存储每个线程的变量副…...

Chrome 108版(64-bit 108.0.5359.125)网盘下载

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

Mars3d插件参考开发教程并在相关页面引入

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

Windows 性能突然打鸡血,靠 Bug 修复了多年顽疾

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

亚马逊封买家账号的原因有哪些

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

1.0零基础尝试DCM通讯(c-store)

前言 本项目是对医院放疗及相关设备的互通互联。对dcm文件及数据协议是本项目的基础。 今天在项目组成员支持下,对dcm通讯进行了初步的尝试,有人之路,这个过程可以说是非常愉快,于是乎准备将这个愉快的过程记录,方便自己查阅和后来人。 c-store 本次的安装和测试使用的…...

vue之封装tab类组件

vue之封装tab类组件 vue之封装tab类组件CSS样式方面JS方面 vue之封装tab类组件 需求&#xff1a;点击【上一步】、【下一步】按钮&#xff0c;切换tab&#xff0c;且有淡入浅出的动画。 CSS样式方面 <div class"parent"><div class"childDiv" id…...

固定资产管理中净值怎么算

在资产管理的领域中&#xff0c;我们经常听到“净值”这个词。然而&#xff0c;对于许多人来说&#xff0c;净值的概念仍然模糊不清。本文将试图揭示固定资产管理的净值计算方法&#xff0c;并提供一些创新的观点。  我们需要明确什么是净值。在财务术语中&#xff0c;净值是…...

SQlite操作后如何正确退出

在 C 语言中&#xff0c;使用 SQLite 库进行数据库操作后&#xff0c;可以通过以下步骤来正常退出和关闭 SQLite 连接&#xff1a; 关闭数据库连接&#xff1a;在完成数据库操作后&#xff0c;使用 sqlite3_close() 函数来关闭 SQLite 连接。该函数接受一个指向 sqlite3 数据库…...

phpcmsV9.6.0sql注入漏洞分析

目录 前言 环境准备 漏洞点 看一看parse_str函数 看一看sys_auth函数 看一看get_one函数 全局搜索sys_auth($a_k, ENCODE) 查看哪里调用了 set_cookie 查看safe_replace函数 判断登录绕过 index的业务 加载modules/wap/index.php 加载modules/attachment/attachme…...

深入理解正则表达式:高效处理文本数据的利器

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 引言 正则表达式是一种…...

张雪峰说网络空间安全专业

网络空间安全专业是一个涵盖了计算机科学、信息安全、法律等多个领域的学科&#xff0c;旨在研究保护网络空间的信息系统和数据不被非法侵入、破坏、篡改、泄露的技术和管理手段。 网络安全专业的重要性 随着网络技术的发展&#xff0c;网络安全问题也日益凸显&#xff0c;黑客…...

day11-ArrayList学生管理系统

1.ArrayList 集合和数组的优势对比&#xff1a; 长度可变添加数据的时候不需要考虑索引&#xff0c;默认将数据添加到末尾 1.1 ArrayList类概述 什么是集合 ​ 提供一种存储空间可变的存储模型&#xff0c;存储的数据容量可以发生改变 ArrayList集合的特点 ​ 长度可以变化…...

java springboot 如何实现小程序支付

今天给大家分享java小程序支付 首先我们学习任何东西要先看官网 下面是支付业务流程 我们具体用代码去实现上面的业务流程 功能截图 代码截图 pay(){//调用后台生成订单var orderNumber "20210101123456";var amount 0.01;WxPay.wxpay(app, amount, orderNumber…...

题目:2839.判断通过操作能否让字符串相等 I

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;2839. 判断通过操作能否让字符串相等 I - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 两字符串奇数位字符计数相等并且偶数位字符计数相等是可通过操作让字符串相等。 解题代码&#xff…...

花生壳做局域网站/重庆网站seo教程

关键字&#xff1a; KingbaseES&#xff0c;linux&#xff0c;启动 内容正文&#xff1a; 在linux平台下&#xff0c;KingbaseES数据库服务启动失败&#xff0c;可以按如下步骤查找原因并解决&#xff1a; 使用 systemctl status kingbase8d 命令查看该实例是否已经启动使…...

亳州做企业网站/市场营销方案范文

为什么80%的码农都做不了架构师&#xff1f;>>> 1. vector<int>* 就是声明一个指向vector<int>的指针vector<int>* pV new vector<int>();pV->push_back(1);vector<int>::iterator it pV->begin();cout << *it &l…...

sae建wordpress/陕西网页设计

脚手架配置代理&#xff08;React ajax&#xff09;一、理解二、常用的ajax请求库三、配置代理的第一种方法四、配置代理的第二种方法五、总结方法一方法二一、理解 React本身只关注于界面, 并不包含发送ajax请求的代码前端应用需要通过ajax请求与后台进行交互(json数据)react…...

网站服务器配置要求/2023年10月爆发新冠

设计一个系统&#xff0c;能够计算用户输入的代数表达式&#xff08;混合四则运算&#xff09;&#xff0c;并能接收用户自己输入的运算结果同时给出用户计算正确与否的判断&#xff0c;具体要求如下&#xff1a;1.用户循环输入不通的算术表达式&#xff08;每个表达式以“#”结…...

赤壁网站建设/如何去推广一个app

前言 今天是2022年12月31日&#xff0c;今年的最后一天&#xff0c;年关已至。 又到了&#xff1a;回头看路&#xff0c;低头赶路&#xff0c;抬头望路的时候。 回顾2022 疫情中的2022 今年应该算是疫情的高峰期吧&#xff0c;各种新冠变异株横行&#xff0c;从严控到一夜…...

安徽池州网站制作/推广工具有哪些

1.将后台返回的JSON数据存入浏览器sessionStorage: sessionStorage.setItem(‘key’,JSON.stringify(value)); 2.从sessionStorage中取出数据 var data JSON.parse(sessionStorage.getItem(‘key’)); 如果直接存&#xff0c;后台console.log(json)出来的会变成[object&am…...