我們將演示使用ChatGPT或GPT-4來(lái)檢查和重構(gòu)代碼的技術(shù),以及討論一些限制,并為在編程工作流中使用這些LLM提供方便的資源。
我們將從檢查和重構(gòu)的方法開始,對(duì)于每種方法,我們希望嘗試不同的提示和所提供的技術(shù),以釋放AI驅(qū)動(dòng)的代碼改進(jìn)的全部潛力。
用GPT-4重構(gòu)代碼
重構(gòu)代碼之所以重要,有以下幾個(gè)原因:它增強(qiáng)了可讀性和可維護(hù)性,使開發(fā)人員更容易理解和修改代碼。它還有助于防止?jié)撛诘腻e(cuò)誤,并確保您的代碼遵循已建立的最佳實(shí)踐。最終,重構(gòu)可以產(chǎn)生更高效、更可靠、更健壯的軟件。
GPT-4可以顯著促進(jìn)這一過(guò)程。通過(guò)使用GPT-4檢查和評(píng)估代碼,您可以快速識(shí)別需要改進(jìn)的地方,并創(chuàng)建更清晰、更高效的代碼。利用GPT-4的功能可以節(jié)省時(shí)間并減少過(guò)程中的人為錯(cuò)誤,從而更加一致地遵守編碼標(biāo)準(zhǔn)。
使舊代碼現(xiàn)代化
通過(guò)將舊函數(shù)提供給GPT-4,并要求它根據(jù)現(xiàn)代編碼實(shí)踐進(jìn)行重構(gòu),可以快速實(shí)現(xiàn)代碼的現(xiàn)代化,如根據(jù)現(xiàn)代ES6( ECMAScript 6.0)編程標(biāo)準(zhǔn)重構(gòu)以下代碼。
之前:
Before:
After:
在這個(gè)重構(gòu)版本中,GPT4迅速做出了以下改進(jìn):
增加了JSDoc注釋
將tempConvert函數(shù)轉(zhuǎn)換為箭頭函數(shù)。
對(duì)于不可變變量,將var替換為const。
對(duì)字符串比較使用嚴(yán)格的相等性檢查(===)。
引入一個(gè)常數(shù)來(lái)消除神奇的數(shù)字。
使用模板字面量簡(jiǎn)化return語(yǔ)句。
添加編碼最佳實(shí)踐或原則
我們公司或代碼庫(kù)可能會(huì)使用自己希望保留的某些編碼實(shí)踐和風(fēng)格。對(duì)于這種情況,請(qǐng)向GPT4提供希望它關(guān)注的特定編碼實(shí)踐或風(fēng)格的說(shuō)明。
Prompt:檢查以下代碼并對(duì)其進(jìn)行重構(gòu),使其更加DRY并采用SOLID編程原則。
注意,對(duì)于相同的輸入,它采用了SOLID編程原則中的單一責(zé)任(Single Responsibility)原則,將函數(shù)分為3個(gè)。與前面的“現(xiàn)代化”步驟不同,它沒(méi)有將函數(shù)轉(zhuǎn)換為箭頭(arrow)函數(shù)。
“通過(guò)將轉(zhuǎn)換邏輯提取到單獨(dú)的函數(shù)中,我們改進(jìn)了代碼對(duì)單一責(zé)任原則(SOLID的一部分)的遵守,因?yàn)楝F(xiàn)在每個(gè)函數(shù)都有一個(gè)明確的、集中的目的?!?/p>
檢測(cè)和修復(fù)錯(cuò)誤
有時(shí)我們對(duì)代碼可能產(chǎn)生的漏洞或潛在問(wèn)題視而不見。讓GPT-4檢查和解決代碼問(wèn)題可以節(jié)省的不僅僅是時(shí)間。
Prompt:檢查這段代碼的錯(cuò)誤并重構(gòu)以修復(fù)任何問(wèn)題…
故意輸入(有缺陷)的程序:
輸出:
GPT-4所做的更改:
增加了輸入參數(shù)驗(yàn)證,以確保items是一個(gè)數(shù)組,折扣百分比是一個(gè)數(shù)字。
檢查折扣百分比的邊界條件,以確保它在0-100范圍內(nèi)。
增加了項(xiàng)目屬性及其類型的驗(yàn)證,以確保價(jià)格和數(shù)量為數(shù)字。
創(chuàng)建樣板代碼(*我的最愛(ài))
開始新項(xiàng)目可能會(huì)很痛苦。GPT-4不知道業(yè)務(wù)邏輯,但它可以用于第一天要寫的、枯燥的樣板代碼。從技術(shù)上講,這不是重構(gòu),但它很神奇,可以成為編程生命周期中某個(gè)過(guò)程的一部分。
Prompt:為我寫一個(gè)樣板Node.js函數(shù),它將接受一個(gè)User類型的變量,驗(yàn)證用戶具有正確的權(quán)限,從postgres數(shù)據(jù)庫(kù)中獲取一個(gè)項(xiàng)目類型Posts的數(shù)組并返回它們。為業(yè)務(wù)邏輯留下注釋。
代碼轉(zhuǎn)換(遷移)
需要將代碼從一種語(yǔ)言轉(zhuǎn)換為另一種語(yǔ)言的原因有很多。我們發(fā)現(xiàn)一種語(yǔ)言的代碼庫(kù)需要替換為另一種語(yǔ)言的代碼,我們需要進(jìn)行代碼的移植;或者老板讀了一篇關(guān)于最新前端框架的文章,要求我們把老程序移植到 {拆分的新代碼庫(kù)}。 在任何情況下,GPT-4都可以通過(guò)簡(jiǎn)單的提示符提供幫助。
Prompt:在Rust中重寫以下代碼:…
向代碼中添加注釋
如果代碼是自解釋的,但需要注釋,這可以節(jié)省大量時(shí)間。
Prompt:向以下代碼添加注釋…
更好的重構(gòu)技巧
像生活中的許多事情一樣,使用GPT-4,我們投入越多,得到的回報(bào)就越多。在這種情況下,提供更多的背景、說(shuō)明和指導(dǎo)通常會(huì)產(chǎn)生更好的結(jié)果。
以下是改進(jìn)代碼重構(gòu)的技巧和技巧:
拆分提示: 嘗試將提示和預(yù)期結(jié)果拆分為多個(gè)步驟。保持提示有一個(gè)單一的結(jié)果已經(jīng)被證明比組合提示產(chǎn)生更好的結(jié)果。例如,要求評(píng)審,然后要求基于評(píng)審響應(yīng)的重構(gòu)。隨著llm增加他們的令牌限制,這可能會(huì)變得不那么重要。
舉例: 提供預(yù)期的輸入、數(shù)據(jù)和輸出,以提高準(zhǔn)確性和質(zhì)量。
具體一點(diǎn): 不要害怕列出你想要的,你知道的,需要的,不應(yīng)該包括的。
要求它反射: 一種叫做反射的技術(shù)已經(jīng)被證明可以提高GPT4的準(zhǔn)確性?;旧暇褪菃?wèn)它‘你為什么錯(cuò)了?’或者讓它反思和檢討自己的反應(yīng)。
限制
這篇文章中,我們已經(jīng)見識(shí)了很強(qiáng)的AI,但是這些模型并不完美,(目前)還不能準(zhǔn)確地復(fù)制業(yè)務(wù)邏輯。下面是使用GPT-4檢查或重構(gòu)代碼時(shí)需要注意和避免的事情:
它可能是(自信地)錯(cuò)誤的: GPT4被訓(xùn)練得聽起來(lái)令人信服,但這并不意味著它總是正確的。另一篇關(guān)于用ChatGPT重構(gòu)Golang的很棒的文章報(bào)道了“它擺脫了類型檢查,并自信地解釋說(shuō),將非int值斷言為int類型將返回int類型的零值,但這是不正確的,會(huì)引起恐慌”。
從長(zhǎng)遠(yuǎn)來(lái)看,節(jié)省時(shí)間可能并不值得: 當(dāng)然,GPT4可以在一分鐘內(nèi)生成50行代碼,但如果它不適合我們的代碼庫(kù),則可能需要花費(fèi)45分鐘來(lái)調(diào)試和調(diào)整它,這樣還不如自己寫。
它可能會(huì)過(guò)時(shí): 科技世界發(fā)展很快?!癎PT-4通常缺乏對(duì)其絕大部分?jǐn)?shù)據(jù)被切斷后(2021年9月)發(fā)生的事件的了解?!?您可能會(huì)遇到任何新更新的庫(kù)、框架或技術(shù)的問(wèn)題。
結(jié)論
人工智能驅(qū)動(dòng)的編程只是一種新事物,但它會(huì)一直存在下去。如果使用得當(dāng),它可以節(jié)省時(shí)間,并幫助我們編寫更好的代碼。我希望您喜歡本文,并掌握了一些提高編程效率或錯(cuò)誤處理的新技能。
審核編輯 :李倩
-
人工智能
+關(guān)注
關(guān)注
1791文章
46671瀏覽量
237114 -
GPT
+關(guān)注
關(guān)注
0文章
351瀏覽量
15285
原文標(biāo)題:如何借助GPT-4評(píng)審、重構(gòu)代碼?
文章出處:【微信號(hào):軟件質(zhì)量報(bào)道,微信公眾號(hào):軟件質(zhì)量報(bào)道】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論