目錄
一、輔助編程
(一)代碼生成
二、其他功能
(一)工具手冊(cè)
(二)源碼學(xué)習(xí)
(三)技術(shù)討論
一、AI輔助編程
作為主要以 JAVA 語(yǔ)言為核心的后端開發(fā)者,其實(shí),早些時(shí)間我也用過(guò)比如 Codota、Tabnine、Github 的 Copilot、阿里的 AI Coding Assistant 等 IDEA 插件,但是我并沒(méi)有覺得很驚奇,感覺就是生成一些代碼片段罷了,直到我接觸了 ChatGPT......
(一)代碼生成
去年9月份的時(shí)候,我接到一個(gè)項(xiàng)目,是老項(xiàng)目重構(gòu),具體要求就是給你提供入?yún)⒑统鰠⒌慕Y(jié)構(gòu)文檔,然后你來(lái)寫具體的代碼,將入?yún)?duì)象 XxxxDTO 解析后調(diào)用另外一個(gè)服務(wù),然后他再將處理后的結(jié)果返回給你,你再解析成 java 對(duì)象返回。大概有一百多個(gè)接口要實(shí)現(xiàn),其中不乏有入?yún)⒅杏袔资畟€(gè)字段的類,寫service層真的很累很累。入?yún)⒔Y(jié)構(gòu)和對(duì)應(yīng)的類如下圖:
@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;
}
最開始,我分析了需求,使用了模板方法模式來(lái)實(shí)現(xiàn)這個(gè)service層的功能,然后每個(gè)接口就只需要實(shí)現(xiàn)模板類的抽象方法即可,即實(shí)現(xiàn)遠(yuǎn)程調(diào)用接口的函數(shù)名,入?yún)?duì)象的拼裝,出參對(duì)象的拼裝三個(gè)方法的實(shí)現(xiàn)。
后來(lái)發(fā)現(xiàn),每個(gè)人的代碼都或多或少的會(huì)出現(xiàn)問(wèn)題,比如代碼風(fēng)格,單詞打錯(cuò),漏寫或者錯(cuò)寫等問(wèn)題,而且代碼特別多,不好定位問(wèn)題。于是我就用 java 寫了一個(gè)工具類,用來(lái)生成代碼,這樣,我們就只用關(guān)心入?yún)⒑统鰠⑹欠駥憣?duì)就行了,其他的代碼就按模板來(lái)生成。
其實(shí)生成代碼的方法有很多,比如通過(guò)模板文件生成代碼,但是我為了不引入多余的依賴,我直接使用了最笨且最有效的方式,即反射解析類的詳情,然后在控制臺(tái)打印出具體代碼。
然后我們就順利的減少了90%的代碼編寫,只需要將入?yún)⒊鰠⒌念悇?chuàng)建好即可。至于定位問(wèn)題,只要能保證代碼生成器沒(méi)有問(wèn)題,那我們就可以只通過(guò)判斷類的創(chuàng)建是否正確就可以了。
之所以要說(shuō)這個(gè)案例,就是為了來(lái)引出我是怎么使用 ChatGPT 的。在這個(gè)項(xiàng)目快結(jié)束的時(shí)候,AI火了,我試著使用 ChatGPT 來(lái)實(shí)現(xiàn)這個(gè)代碼的生成,結(jié)局讓我大吃一驚。
我的思路有兩個(gè),一個(gè)是通過(guò)給他模板和出入?yún)?duì)象的方式,讓他直接給我生成代碼,還有一種就是通過(guò)我的調(diào)教,讓他給我寫一個(gè)代碼生成器出來(lái)。
于是我先測(cè)試了方案一,那就是把我已經(jīng)寫好的幾個(gè)接口告訴給他,讓他模仿著來(lái)給我寫出類似的代碼,如果哪里有問(wèn)題,我就會(huì)告訴他確實(shí)是有問(wèn)題的,讓他進(jìn)行調(diào)整,在經(jīng)過(guò)半個(gè)小時(shí)的微調(diào)后,他已經(jīng)能夠很好地通過(guò)我給的類來(lái)生成具體的代碼了。只要我這個(gè)會(huì)話還在,那么我就可以隨時(shí)的回來(lái),讓他生成類似的代碼。而壞處就是,只能我自己用,別人想用的話,就得自己去訓(xùn)練了。
所以才有了方案二,那就是讓他幫我生成一個(gè)類似于我前面寫的那個(gè)工具類,放到項(xiàng)目里,這樣,所有開發(fā)者就能直接使用工具類來(lái)生成代碼了。然后我便開始了實(shí)踐,雖然說(shuō),他一開始回復(fù)我的代碼生成器問(wèn)題很多,但是我們能通過(guò)對(duì)話很好的讓他進(jìn)行微調(diào),最后,我也是成功的讓他幫我實(shí)現(xiàn)了代碼生成器的功能,這比我自己手寫快了一倍。
其實(shí),我們還能使用 PDF 的 AI工具,直接讀取文檔,然后連出入?yún)?duì)象也生成出來(lái)呢~那可能是99%的代碼都已經(jīng)能自動(dòng)生成了。(不過(guò)這個(gè)可能會(huì)出錯(cuò),沒(méi)有代碼生成器穩(wěn)定)
接下來(lái),我直接演示一個(gè)案例,讓大家感受下ChatGPT代碼生成的威力:
總所周知,mybatis plus 等 ORM 框架是自帶代碼生成的,一般就是通過(guò)定義好數(shù)據(jù)庫(kù)的表,然后通過(guò)解析這個(gè)表來(lái)實(shí)現(xiàn)代碼的生成。但是,大多數(shù)人的習(xí)慣一般是先定義實(shí)體類,然后才去數(shù)據(jù)庫(kù)創(chuàng)建對(duì)象,而且如果編碼人員水平不高的話,很有可能會(huì)創(chuàng)建出一些很拉胯的數(shù)據(jù)表定義,從而導(dǎo)致問(wèn)題。因此,我通過(guò)和 ChatGPT 對(duì)話,讓他幫我生成了一個(gè)代碼生成器,來(lái)實(shí)現(xiàn)通過(guò)反射實(shí)體類的方式生成建表SQL。(下面案例只展示最簡(jiǎn)單的實(shí)現(xiàn),關(guān)于繼承子類,涉及comment等高級(jí)操作這里就不演示了,感興趣的話可以后臺(tái)聯(lián)系作者了解演示詳情)
接下來(lái)我們?nèi)dea實(shí)測(cè)一下
可以發(fā)現(xiàn),他生成的SQL不是下劃線形式,且沒(méi)有設(shè)置非空,我們可以讓他修改。
再去idea測(cè)試下
可以看到,基本上已經(jīng)沒(méi)有問(wèn)題了,再自己微調(diào)一下代碼,后面使用的時(shí)候,我們就只需要再根據(jù)實(shí)際情況,修改一下表字段的范圍即可,這樣就能省去一個(gè)一個(gè)復(fù)制粘貼的時(shí)間了,簡(jiǎn)直爽歪歪。(如前面提到的,目前這個(gè)sql生成器還是有很大問(wèn)題的,大家可以自己試著完善一下,讓他能實(shí)現(xiàn)在sql中也生成 comment,繼承子類的 ORM 的對(duì)象的sql生成,固定字符集,設(shè)置默認(rèn)值,設(shè)置數(shù)據(jù)類型的范圍等等,當(dāng)然我已經(jīng)調(diào)教好我自己的sql生成器了)
像這種經(jīng)常用的,當(dāng)然是搞出代碼生成器最好了,還有一些簡(jiǎn)單的,不常用的生成,我們就可以直接讓他生成代碼,而不是搞出代碼生成器了。這里再舉最后一個(gè)例子:
像有些老數(shù)據(jù)庫(kù),他們沒(méi)有使用mybatis plus,需要寫各種各樣的SQL,很麻煩。那么我們就可以解析他的插入方法,生成 ORM 對(duì)象,然后通過(guò)mybatis plus來(lái)快捷使用。
不會(huì)吧?不會(huì)吧?不會(huì)還有人在 AI 時(shí)代下,還一個(gè)個(gè)復(fù)制粘貼吧。不會(huì)吧,不會(huì)吧......(
狗頭保命)
二、其他功能
(一)工具手冊(cè)
關(guān)于工具手冊(cè)這點(diǎn)沒(méi)有太多可說(shuō)的,我們可以把 ChatGPT 當(dāng)成工具書,直接向他提問(wèn),很多時(shí)候,先問(wèn) ChatGPT,可能比百度,Google更快。他不僅能夠給出你答案,你還可以讓他給你演示示例,以下為我自己體驗(yàn)過(guò)的一些方向:
- 根據(jù)你的描述快速生成正則表達(dá)式,而不是自己慢慢調(diào)試。
- 快速生成一些代碼示例,比如問(wèn)他如何合并兩個(gè)list,如何使用stream流來(lái)實(shí)現(xiàn)groupBy,如何在springboot框架中動(dòng)態(tài)增強(qiáng)源碼。
- 生成Ant風(fēng)格的路徑通配符,UEL風(fēng)格的表達(dá)式等,其實(shí)這個(gè)基本上和①是一個(gè)意思(我自己容易記混,用ChatGPT生成確實(shí)比每次查資料再寫快一些)。
(二)源碼學(xué)習(xí)
最近的時(shí)間,我也是一直在研究flowable的源碼,但是源碼確實(shí)有很多地方?jīng)]有注釋,所以,我會(huì)拿出那個(gè)代碼片段去問(wèn)他,讓他作為 flowable 專家來(lái)告訴我每一步是干什么的,他也能很聰明的識(shí)別出那段代碼的作用,甚至知道代碼是寫在什么位置。
我也會(huì)將實(shí)體類都發(fā)給他,他會(huì)幫我把每一個(gè)字段的含義和用法告訴我,確實(shí)比百度要來(lái)的更快,有些東西搜索引擎和官方文檔都查不到,但是他能夠通過(guò)他的智能,判斷出字段的作用,這極大地協(xié)助了我進(jìn)行我們項(xiàng)目流程中心服務(wù)的代碼優(yōu)化。
而且,你可以在不知道是哪段代碼的情況下,直接問(wèn)他 flowable 這塊是怎么實(shí)現(xiàn)的,他也能自己分析出來(lái),然后告訴你答案。
(三)技術(shù)討論
技術(shù)討論這一部分,其實(shí)可以包括代碼review,代碼優(yōu)化等子部分,也可以和他討論當(dāng)下一些技術(shù)的實(shí)現(xiàn)方案,每當(dāng)我有好的想法時(shí),我也會(huì)和他溝通,看看他的意見,下面我做一下展示:
代碼分析的簡(jiǎn)單舉例
其他舉例
很多時(shí)候,我們規(guī)定了工具類庫(kù),但是,有些人不知道有某些工具類,他們就會(huì)這種工具類用一下,那種工具類用一下,就顯得很不協(xié)調(diào),因此,我們可以直接問(wèn)他,XXX工具類庫(kù)有無(wú)這樣的方法。使用該思路,可以讓團(tuán)隊(duì)的代碼更加讓人心曠神怡,在一些代碼規(guī)范要求比較高的地方很好用。
由于篇幅要求,我還是盡量精簡(jiǎn)了一些,主要還是想說(shuō)明一些我自己的思路,希望對(duì)大家有用。
版權(quán)聲明:本文由神州數(shù)碼云基地團(tuán)隊(duì)整理撰寫,若轉(zhuǎn)載請(qǐng)注明出處。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-761460.html
公眾號(hào)搜索神州數(shù)碼云基地,了解更多AI相關(guān)技術(shù)干貨。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-761460.html
到了這里,關(guān)于AIGC|超詳細(xì)教程提升代碼效率,手把手教你如何用AI幫你編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!