chatgpt写的代码没法用 我教 chatGPT 写代码
内容目录
前言
我大概在今年 3 月份开始关注 ,也尝试过让它帮我写代码,当时是想写个动态更换数据源的功能, 刷刷刷给了我一段代码,实际一跑不是那么回事,它的代码大部分是对的,但是其中有那么一个两个方法是不存在的
我的结论是,复杂问题还不行
调教
今天我在做一个 api 接入的工作,接口参数比较多,我需要写一个类来封装这些参数。
我先用阿里的通意灵码尝试了下,不尽如人意,就想着让 来试下吧,还别说,只要你耐心调教,它确实能很好的完成工作
我跟它对话了不到 10 轮,最后的结果很完美,下面给大家分享下调教 的过程
第一轮 要完整
我本意是在这句话之后,把接口方文档贴给 ,然后它才给我吐出代码,但它已经根据 这个关键字生成了代码
看到代码里 我就知道它会错意了
第二轮 基本可用,能更好吗?
可以看到 能识别出接口文档的字段名、数据类型,并且还能对非原始类型数据生成一个对应的类
第三轮 尝试生成注释,理解错误
上面的代码有个问题,没有给字段添加注释,所以我尝试让它添加
这里 没有理解我的意思,他给增加了一个 字段,而我的意思是:文档的最后一栏是注释
当然,也许我的 不太明确
第四轮 更明确的提示
这一次他确实 get 到了,正确的添加了注释,而且他不是照抄注释,他甚至做了一点点调整
第五轮 尝试修改注释格式
我想要的注释格式是 /** 这是注释 */ 这种格式,所以我尝试让它调整下
不能说他错,但是我想要的是修改字段的注释格式,而他则是给构造方法、/ 方法添加了注释,不太完美
第六轮 基于 json 生成代码
由于字段太多,生成的代码比较长, 会生成一部分代码,并询问是否要继续生成代码,我点击继续后,跳出来一个提示:出错了
第七轮 精简代码
我让它忽略 / 方法后继续
第八轮 继续精简代码
这一次我让它去掉 @ 注解,把字段修改为 ,并且给字段带上注释
可以看到这一次生成的代码已经很合我的心意了,关键还是 的区别,之前我的 是 "filed ",这次是 "field with "
第九轮 及时的正向反馈,完美的结果
我先夸奖了 一把,然后让它重新完整的输出结果,可以说非常完美了,就是我要的
最终代码鉴赏
public class CertificateRequest {
/**
* 订单编号,唯一,一个订单对应一个证书,长度不大于32个字符,具体规则由调用方自定义。
*/
public String orderId;
/**
* 调用方安全码,系统中查看
*/
public String securityId;
/**
* 请求证书信息,JSON对象
*/
public CertificateData data;
/**
* 签名算法,当前支持HmacSHA256
*/
public String signAlg;
/**
* 签名值,签名原文为certInfo的值,签名keyId,系统中查看
*/
public String signValue;
/**
* 构造函数
*/
public CertificateRequest() {
// Default constructor
}
/**
* 构造函数
*
* @param orderId 订单编号,唯一,一个订单对应一个证书,长度不大于32个字符,具体规则由调用方自定义。
* @param securityId 调用方安全码,系统中查看
* @param data 请求证书信息,JSON对象
* @param signAlg 签名算法,当前支持HmacSHA256
* @param signValue 签名值,签名原文为certInfo的值,签名keyId,系统中查看
*/
public CertificateRequest(String orderId, String securityId, CertificateData data, String signAlg, String signValue) {
this.orderId = orderId;
this.securityId = securityId;
this.data = data;
this.signAlg = signAlg;
this.signValue = signValue;
}
/**
* 请求证书信息
*/
public static class CertificateData {
/**
* 用户信息
*/
public UserInfo userInfo;
/**
* 证书模板编号,如果不传则使用默认模板
*/
public int tempId;
/**
* 证书有效期
*/
public int certDate;
/**
* 证书有效期单位: month、minute
*/
public String dateType;
/**
* 证书请求数据(pkcs10)
*/
public String csr;
/**
* 证书主体信息
*/
public SubjectInfo subjectInfo;
/**
* 证书主题备用名称,多个用“,”分隔
*/
public String altCN;
/**
* 随机码,可以是当前时间
*/
public String nonce;
/**
* 构造函数
*/
public CertificateData() {
// Default constructor
}
/**
* 构造函数
*
* @param userInfo 申请证书的用户信息
* @param tempId 证书模板编号,如果不传则使用默认模板
* @param certDate 证书有效期
* @param dateType 证书有效期单位: month、minute
* @param csr 证书请求数据(pkcs10)
* @param subjectInfo 证书主体信息
* @param altCN 证书主题备用名称,多个用“,”分隔
* @param nonce 随机码,可以是当前时间
*/
public CertificateData(UserInfo userInfo, int tempId, int certDate, String dateType, String csr, SubjectInfo subjectInfo, String altCN, String nonce) {
this.userInfo = userInfo;
this.tempId = tempId;
this.certDate = certDate;
this.dateType = dateType;
this.csr = csr;
this.subjectInfo = subjectInfo;
this.altCN = altCN;
this.nonce = nonce;
}
/**
* 用户信息
*/
public static class UserInfo {
/**
* 用户类型:"person"=个人;"unit"=单位
*/
public String type;
/**
* 用户姓名,如果用户类型为个人,必填
*/
public String userName;
/**
* 身份证号,如果用户类型为个人,必填
*/
public String idCard;
/**
* 单位名称,如果用户类型为单位,必填
*/
public String unitName;
/**
* 营业执照号,如果用户类型为单位,必填
*/
public String idNumber;
/**
* 验证信息
*/
public String verificationInfo;
/**
* 构造函数
*/
public UserInfo() {
// Default constructor
}
/**
* 构造函数
*
* @param type 用户类型:"person"=个人;"unit"=单位
* @param userName 用户姓名,如果用户类型为个人,必填
* @param idCard 身份证号,如果用户类型为个人,必填
* @param unitName 单位名称,如果用户类型为单位,必填
* @param idNumber 营业执照号,如果用户类型为单位,必填
* @param verificationInfo 验证信息
*/
public UserInfo(String type, String userName, String idCard, String unitName, String idNumber, String verificationInfo) {
this.type = type;
this.userName = userName;
this.idCard = idCard;
this.unitName = unitName;
this.idNumber = idNumber;
this.verificationInfo = verificationInfo;
}
}
/**
* 证书主体信息
*/
public static class SubjectInfo {
/**
* 证书主体项:通用名
*/
public String sub_CN;
/**
* 证书主体项:邮箱
*/
public String sub_email;
/**
* 证书主体项:国家代码,2位
*/
public String sub_C;
/**
* 证书主体项:省份
*/
public String sub_ST;
/**
* 证书主体项:城市
*/
public String sub_L;
/**
* 证书主体项:单位
*/
public String sub_O;
/**
* 证书主体项:部门
*/
public String sub_OU;
/**
* 证书主体项:描述
*/
public String sub_D;
/**
* 构造函数
*/
public SubjectInfo() {
// Default constructor
}
/**
* 构造函数
*
* @param sub_CN 证书主体项:通用名
* @param sub_email 证书主体项:邮箱
* @param sub_C 证书主体项:国家代码,2位
* @param sub_ST 证书主体项:省份
* @param sub_L 证书主体项:城市
* @param sub_O 证书主体项:单位
* @param sub_OU 证书主体项:部门
* @param sub_D 证书主体项:描述
*/
public SubjectInfo(String sub_CN, String sub_email, String sub_C, String sub_ST, String sub_L, String sub_O, String sub_OU, String sub_D) {
this.sub_CN = sub_CN;
this.sub_email = sub_email;
this.sub_C = sub_C;
this.sub_ST = sub_ST;
this.sub_L = sub_L;
this.sub_O = sub_O;
this.sub_OU = sub_OU;
this.sub_D = sub_D;
}
}
}
}
结论
的确有很强的理解力,但也需要我们好好调教
我教 写代码