用 ChatGPT 写代码,效率杠杠的!

来源:https://www.cnblogs.com/scy251147/p/17242557.html

ChatGPT出来好久了,vscode上面由于集成了相关的插件,所以用起来很简单,经过本人深度使用后,发觉其能力的强大之处,在书写单元测试,书写可视化小工具,代码纠错,代码规范,编程辅助方面,极其可靠,而且能识别一些坑并绕过,下面来看看他能干的一些事情吧。

注意:由于英文的表述可以让ChatGPT的反馈更准确,所以这里的问题我均以英文来描述。

1、单测用例生成

待生成单测的测试类,此类就是一个静态工厂类,可以根据传入的数据类型和语言类型,创建出几个语言数据服务,包括ducc,mysql,配置,空语言数据服务:

public class SepI18nDataFactory {/*** 配置文件数据服务*/public static ISepI18nDataService dataService;/*** 构建数据服务** @param dataType* @return*/public static ISepI18nDataService buildDataService(SepI18nDataType dataType, SepI18nLanguageType languageType) {//按照数据类型判断switch (dataType) {//从ducc中构建多语言服务case DUCC:return getInstance(languageType, x -> new SepI18nDuccDataService(x));//从mysql中构建多语言服务case MYSQL:return getInstance(languageType, x -> new SepI18nMysqlDataService(x));//从本地配置中构建多语言服务case CONFIG:return getInstance(languageType, x -> new SepI18nConfigDataService(x));//空数据服务,兜底逻辑default:return getInstance(languageType, x -> new SepI18nEmptyDataService(x));}}/*** 高并发下实例创建管控** @param languageType* @param callback* @return*/private static ISepI18nDataService getInstance(SepI18nLanguageType languageType, Function<SepI18nLanguageType, ISepI18nDataService> callback) {if (dataService == null) {synchronized (SepI18nDataFactory.class) {if (dataService == null) {dataService = callback.apply(languageType);}}}return dataService;}
}

ChatGPT问题如下(要求:为类中的所有方法创建单测并包含所有的场景):

program unit tests for all methods for below class , you need test all scenarios, show me the code by using java language:public class SepI18nDataFactory {/** * 配置文件数据服务 */public static SepI18nConfigDataService configDataService;/** * 数据库数据服务 */public static SepI18nMysqlDataService mysqlDataService;/** * ducc数据服务 */public static SepI18nDuccDataService duccDataService;/** * 空数据服务 - 兜底服务 */public static SepI18nEmptyDataService emptyDataService;/** * 构建数据服务* @param dataType* @return*/public static ISepI18nDataService buildDataService(SepI18nDataType dataType, SepI18nLanguageType languageType) {//区域设定 Locale locale = null;//按照数据类型判断switch (dataType) {//从ducc中构建多语言服务case DUCC:if (duccDataService == null) {duccDataService = new SepI18nDuccDataService(languageType);}return duccDataService;//从mysql中构建多语言服务case MYSQL:if (mysqlDataService == null) {mysqlDataService = new SepI18nMysqlDataService(languageType);}return mysqlDataService;//从本地配置中构建多语言服务case CONFIG:if (configDataService == null) {configDataService = new SepI18nConfigDataService(languageType);} return configDataService;//空数据服务,兜底逻辑default:if (emptyDataService == null) {emptyDataService = new SepI18nEmptyDataService(languageType);}return emptyDataService;}}
}

ChatGPT回答如下:

import static org.junit.Assert.assertEquals; import org.junit.Test;public class SepI18nDataFactoryTest {@Testpublic void testBuildDataService_DUCC() {SepI18nDataType dataType = SepI18nDataType.DUCC;SepI18nLanguageType languageType = SepI18nLanguageType.EN;ISepI18nDataService dataService = SepI18nDataFactory.buildDataService(dataType, languageType);assertEquals(SepI18nDuccDataService.class, dataService.getClass());}@Testpublic void testBuildDataService_MYSQL() {SepI18nDataType dataType = SepI18nDataType.MYSQL;SepI18nLanguageType languageType = SepI18nLanguageType.EN;ISepI18nDataService dataService = SepI18nDataFactory.buildDataService(dataType, languageType);assertEquals(SepI18nMysqlDataService.class, dataService.getClass());}@Testpublic void testBuildDataService_CONFIG() {SepI18nDataType dataType = SepI18nDataType.CONFIG;SepI18nLanguageType languageType = SepI18nLanguageType.EN;ISepI18nDataService dataService = SepI18nDataFactory.buildDataService(dataType, languageType);assertEquals(SepI18nConfigDataService.class, dataService.getClass());}@Testpublic void testBuildDataService_Default() {SepI18nDataType dataType = SepI18nDataType.OTHER;SepI18nLanguageType languageType = SepI18nLanguageType.EN;ISepI18nDataService dataService = SepI18nDataFactory.buildDataService(dataType, languageType);assertEquals(SepI18nEmptyDataService.class, dataService.getClass());}}

生成的单测可以完美运行且包含所有的场景,完美。

2、编写小工具

由于在工作中,我们免不了需要写一些小工具来辅助业务,所以看看是否可以把这种活儿交给ChatGPT来干一下。 这里我们准备让其编写基于javafx框架的form界面工具,然后实际运行这个小工具来检验其编写小工具的可行性。

ChatGPT问题如下(界面上,两个文本框,两个按钮,点击第一个按钮,会选择文件夹,然后点击第二个按钮会将文件夹下的enum类名显示到另一个文本框中):

a form with two textfields, two buttons, click one button to locate the directory path and fill it into a textfield, and click another button to start to find the enum .class file from the directory path and show the enum class name into textfield, using javafx structure and show me the java code

ChatGPT回答如下:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;public class EnumFinder extends Application {private TextField directoryPathTextField;private TextField enumClassNameTextField;public static void main(String[] args) {launch(args);
}@Override
public void start(Stage primaryStage) {directoryPathTextField = new TextField();Button directoryPathButton = new Button("Select Directory");directoryPathButton.setOnAction(e -> {DirectoryChooser directoryChooser = new DirectoryChooser();File selectedDirectory = directoryChooser.showDialog(primaryStage);if (selectedDirectory != null) {directoryPathTextField.setText(selectedDirectory.getAbsolutePath());}});Button findEnumButton = new Button("Find Enum");findEnumButton.setOnAction(e -> {String directoryPath = directoryPathTextField.getText();try (Stream<Path> paths =Files.walk(Paths.get(directoryPath))){paths.filter(Files::isRegularFile).filter(p -> p.toString().endsWith(".class")).filter(p ->isEnumClass(p)).forEach(p -> enumClassNameTextField.setText(p.getFileName().toString().replace(".class","")));}catch(IOException ex){ex.printStackTrace();}});enumClassNameTextField =newTextField();enumClassNameTextField.setEditable(false);HBox hBox =newHBox(directoryPathTextField, directoryPathButton, findEnumButton, enumClassNameTextField);Scene scene =newScene(hBox);primaryStage.setScene(scene);primaryStage.show();}privatebooleanisEnumClass(Path path){try{Class clazz =Class.forName(path.toString().replace(".class",""));return clazz.isEnum();}catch(ClassNotFoundException e){e.printStackTrace();returnfalse;}}}

有点呆住了,居然完全正确的生成了我要的工具且能正常运行(稍微调整下界面布局)。

3. 修复代码bug

Sample1:高并发bug

还是之前的代码,改了改,让其在高并发压力下,工作的不那么ok:

public class SepI18nDataFactory {/*** 配置文件数据服务*/public static ISepI18nDataService dataService;/*** 构建数据服务** @param dataType* @return*/public static ISepI18nDataService buildDataService(SepI18nDataType dataType, SepI18nLanguageType languageType) {//按照数据类型判断switch (dataType) {//从ducc中构建多语言服务case DUCC:return getInstance(languageType, x -> new SepI18nDuccDataService(x));//从mysql中构建多语言服务case MYSQL:return getInstance(languageType, x -> new SepI18nMysqlDataService(x));//从本地配置中构建多语言服务case CONFIG:return getInstance(languageType, x -> new SepI18nConfigDataService(x));//空数据服务,兜底逻辑default:return getInstance(languageType, x -> new SepI18nEmptyDataService(x));}}/*** 高并发下实例创建管控** @param languageType* @param callback* @return*/private static ISepI18nDataService getInstance(SepI18nLanguageType languageType, Function<SepI18nLanguageType, ISepI18nDataService> callback) {if (dataService == null) {dataService = callback.apply(languageType);}return dataService;}
}

ChatGPT训练如下(指出代码在高并发下工作不太正常,让其修复):

below class is worked not ok under high flow pressure, please find the bug and fix for me :public class SepI18nDataFactory {/** 配置文件数据服务 */public static ISepI18nDataService dataService;/** 构建数据服务* @param dataType* @return*/public static ISepI18nDataService buildDataService(SepI18nDataType dataType, SepI18nLanguageType languageType) {//按照数据类型判断switch (dataType) {//从ducc中构建多语言服务 case DUCC: return getInstance(languageType, x -> new SepI18nDuccDataService(x));//从mysql中构建多语言服务 case MYSQL: return getInstance(languageType, x -> new SepI18nMysqlDataService(x));//从本地配置中构建多语言服务 case CONFIG: return getInstance(languageType, x -> new SepI18nConfigDataService(x));//空数据服务,兜底逻辑 default: return getInstance(languageType, x -> new SepI18nEmptyDataService(x));}}/** 高并发下实例创建管控* @param languageType* @param callback* @return*/private static ISepI18nDataService getInstance(SepI18nLanguageType languageType, Function callback) {if (dataService == null) {synchronized (SepI18nDataFactory.class) {if (dataService == null) {dataService = callback.apply(languageType);}}}return dataService;}
}

ChatGPT回答如下:

It looks like the bug is in the getInstance() method. The dataService variable is not being synchronized, which can cause issues with concurrent access. To fix this, you can add a synchronized block around the code that checks and sets the dataService variable. This will ensure that only one thread can access the variable at a time.

很明显,一针见血的指出了高并发下存在的问题。

Sample2: 自定义锁bug

随便写了个基于AQS锁框架的自定义锁,代码如下:

class SepSync extends AbstractQueuedSynchronizer {@Overrideprotected boolean tryAcquire(int arg) {if (compareAndSetState(0, 1)) {setExclusiveOwnerThread(Thread.currentThread());return true;}return false;}@Overrideprotected boolean tryRelease(int arg) {if (getState() == 0) {throw new IllegalMonitorStateException();}setExclusiveOwnerThread(null);setState(0);return true;}public void lock() {acquire(1);}public void unlock() {release(1);}
}

ChatGPT问题如下(大意是帮忙看下锁写的有没有问题):

below is the lock class, please find the bug and fix it for me :class SepSync extends AbstractQueuedSynchronizer {@Override protected boolean tryAcquire(int arg) {if (compareAndSetState(0, 1)) {setExclusiveOwnerThread(Thread.currentThread());return true;}return false;}@Overrideprotected boolean tryRelease(int arg) {if (getState() == 0) {throw new IllegalMonitorStateException();}setExclusiveOwnerThread(null);setState(0);return true;}public void lock() {acquire(1);}public void unlock() {release(1);}
}

ChatGPT回答如下:

The bug in the above code is that the tryRelease() method does not check if the current thread is the exclusive owner thread before releasing the lock. This can lead to a situation where the lock is released by a thread that does not own it.To fix this bug, the tryRelease() method should be modified to check if the current thread is the exclusive owner thread before releasing the lock. The modified code should look like this:@Override protected boolean tryRelease(int arg){if(Thread.currentThread() != getExclusiveOwnerThread()){throw new IllegalMonitorStateException();}setExclusiveOwnerThread(null);setState(0);return true;
}

大意就是,我的锁写的有点问题,其他线程可以释放不属于它的锁。(幸好偷偷去看了ReetrentLock实现,确实如此),到这里有些折服了。

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/1578.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【关于ChatGPT的30个问题】16、ChatGPT在语言理解方面的能力如何?/ By 禅与计算机程序设计艺术

16、ChatGPT在语言理解方面的能力如何? 目录 16、ChatGPT在语言理解方面的能力如何? ChatGPT在语言理解方面的能力

【关于ChatGPT的30个问题】10、ChatGPT与其他自然语言处理技术的区别是什么?/ By 禅与计算机程序设计艺术

10、ChatGPT与其他自然语言处理技术的区别是什么? 目录 10、ChatGPT与其他自然语言处理技术的区别是什么?

【关于ChatGPT的30个问题】5、ChatGPT的语言支持范围是什么?/ By 禅与计算机程序设计艺术

5、ChatGPT的语言支持范围是什么? ChatGPT的语言支持范围是什么?写一篇文章,分2级目录,要10个目录,不少于10000字。markdown格式。 目录 5、ChatGPT的语言支持范围是什么? ChatGPT的语言支持范围

midjourney ai与ChatGPT结合使用,大大提升返回结果准确率

最近在试用midjourney ai绘图&#xff0c;结合ChatGPT给到更多的特征来说明 如果只是单纯的提问&#xff0c;可能返回杂乱的图片. 提问时要把相关特征&#xff0c;风格&#xff0c;物件都要说清楚&#xff0c;ai才能识别得到&#xff0c;放几张体验照: 生成结束后将会出现两…

万字追溯ChatGPT各项能力的起源

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年1月份热门报告合集 ChatGPT团队背景研究报告 ChatGPT的发展历程、原理、技术架构及未来方向 ChatGPT使用总结&#xff1a;150个ChatGPT提示此模板 ChatGPT数据集之谜 …

最新版chatgpt4人工智能系统源码 支持电脑手机+小程序

分享一款最新的chatgpt4人工智能系统源码&#xff0c;完美运营版&#xff0c;系统支持电脑版手机版小程序端三合一&#xff0c;含完整代码包和详细的安装部署教程。 系统主要功能一览&#xff1a; 1、可以在电脑端、手机端上使用&#xff0c;还可以通过小程序进行在线交互和对…

【ChatGPT实战案例】ChatGPT快速生成短视频

目录 使用工具 实现方法&#xff08;任选一种&#xff09; 使用步骤 方法1示例&#xff1a;ChatGPT百度AIGC 方法2示例&#xff1a;ChatGPT剪映 使用工具 - ChatGPT - 剪映&#xff1a;手机or电脑应用商场下载app - 百度AIGC&#xff1a;度加创作工具-百度官方出品-人人…

【chatgpt】学习开源项目chatgpt-web,搭建自己的chatgpt服务,功能非常丰富有打字效果

目录 前言1&#xff0c;开源的chatgpt项目2&#xff0c;项目可以直接使用docker-compose跑起来3&#xff0c;关于打字模式SSE&#xff0c; octet-stream &#xff08;打字特效&#xff09;4&#xff0c;关于内容存储5&#xff0c;总结 前言 本文的原文连接是: https://blog.csd…

ChatGPT Plus 插件最全解读

前言&#xff1a; OpenAI放出大招&#xff0c;向所有ChatGPT Plus用户开放联网功能和众多插件&#xff0c;允许ChatGPT访问互联网并使用70个第三方插件。 本批第三方插件能够全方位覆盖衣食住行、社交、工作以及学习等日常所需&#xff0c;基本上能够扮演24小时私人助理的角色…

chatgpt赋能python:Python手机怎么下载:简易教程

Python手机怎么下载&#xff1a;简易教程 随着移动互联网和智能手机的普及&#xff0c;越来越多的人开始使用手机进行日常工作和娱乐&#xff0c;而Python语言作为一种广泛应用于科学计算、数据分析、Web开发等领域的编程语言&#xff0c;也逐渐受到手机用户的青睐。那么&…

独家 | CodeGPT:具有类ChatGPT功能的VSCode扩展

作者&#xff1a;The PyCoach‍翻译&#xff1a;陈之炎 校对&#xff1a;赵鉴开本文约1300字&#xff0c;建议阅读7分钟 本文为你介绍在VSCode中使用GPT-3的官方OpenAI API。 用Canva制作图片 我并非VSCode的忠实粉丝&#xff0c;但不得不承认&#xff0c;它比我每天使用的代码…

ChatGPT专业应用:生成演讲稿

正文共 1138 字&#xff0c;阅读大约需要 7 分钟 教育工作者、企业家等必备技巧&#xff0c;您将在7分钟后获得以下超能力&#xff1a; 生成演讲稿 Beezy评级 &#xff1a;A级 *经过寻找和一段时间的学习&#xff0c;一部分人能掌握。主要提升效率并增强自身技能。 推荐人 | …

5个 ChatGPT 功能,帮助你提升日常编码效率

ChatGPT 作为最快完成亿活用户的应用&#xff0c;最近真的是火出天际了。今天分享5个 ChatGPT 功能&#xff0c;来提升我们的日常工作以及如何使用它提高代码质量。 ChatGPT 的出现&#xff0c;彻底改变了开发代码的方式。但是目前为止&#xff0c;大多数软件开发人员和数据专业…

一款和chatgpt功能相似的产品 Perplexity ai

场景&#xff1a; 比起传统的列表式搜索&#xff0c;Perplexity AI把艳惊四座的ChatGPT和必应搜索结合起来&#xff0c;既有ChatGPT式的问答&#xff0c;又有像普通搜索引擎那样列出的链接&#xff0c;就连马斯克也亲自称赞&#xff1a;它不仅总结出了推文的由来&#xff0c;还…

SpringBoot调取OpenAi接口实现ChatGpt功能

很高兴和大家分享我实现的一个小项目&#xff0c;利用 Spring Boot 实现了一个 ChatGpt 对话系统。在本文中&#xff0c;我将详细介绍这个项目的实现步骤&#xff0c;以及代码实现。 什么是 ChatGpt ChatGpt 是一种基于 GPT 技术的对话系统&#xff0c;能够生成连贯、流畅、…

ChatGPT是什么?Chatgpt有什么用处?

ChatGPT是什么&#xff1f;Chatgpt有什么用处&#xff1f;ChatGPT是基于GPT语言模型源码进行修改和优化后开发而来的聊天机器人。它可以通过学习很多人类对话的方式与人类进行沟通&#xff0c;不断地提高自己的对话能力。ChatGPT是一种强人工智能技术&#xff0c;可应用于智能客…

测试真的会被ChatGPT代替一文告诉你

送走最后一车货&#xff0c;最后三个工人&#xff0c;老王吃力的关上大铁门。左手从口袋摸出一盒烟&#xff0c;轻轻一颠&#xff0c;滑落一根&#xff0c;右手娴熟的夹住。掏出打火机&#xff0c;点燃&#xff0c;一丝青烟腾起&#xff0c;萦绕在指头。 夕阳穿过玻璃&#xf…

ChatGPT开通后测试 来看看效果如何

我的ChatGPT开通后测试 来看看效果如何开通了&#xff0c;简单测试测试它吧。 先让它写首诗吧&#xff0c;读起来还不错&#xff1a; 再让写个简单小代码 问了它不会什么&#xff0c;它也不谦虚 问他怎么在抖音上赚钱&#xff0c;它回答的头头是道。 问它几个弱弱的问题&#x…

ChatGPT给测试工程师带来的机会和威胁

一、什么是ChatGPT ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;美国OpenAI [1] 研发的聊天机器人程序 [12] &#xff0c;于2022年11月30日发布 [2-3] 。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c…

测试人员如何巧妙使用ChatGPT

《庄子天地》篇中描述了一个“抱瓮灌园”的寓言故事&#xff0c;一位“为圃者”不辞辛苦“凿隧而入井&#xff0c;抱瓮而出灌”&#xff0c;当子贡告诉他有一种先进的取水装置“桔槔”时&#xff0c;他却以“无非不知&#xff0c;羞而不为也”的理由加以拒绝。在不少人眼中&…