企業代碼補全增強使用實踐
通義靈碼提供了企業代碼補全增強的能力,在開發者使用通義靈碼 IDE 插件的行間代碼生成時,可以結合企業上傳的代碼庫作為上下文進行行間代碼補全,使代碼補全更加貼合企業代碼規范、業務特點。本文將分享如何構建高質量的企業代碼庫,以及開發者在前端和后端開發場景的使用實踐。
適用版本與支持語言
適用版本 | 支持后端 | 支持前端 |
企業標準版(Beta) | Java、C#、Go、Python | JavaScript、TypeScript、Vue、React |
企業專屬版 |
管理員如何準備高質量企業代碼庫
為確保代碼數據的有效處理,我們建議您遵循以下指導原則來準備代碼庫。這將有助于提升檢索的效率與準確性。
代碼庫的選擇和準備指導
下文將介紹在兩類不同場景下您應該如何進行代碼庫的準備:
場景一 日常工程開發,提升研發效率
在企業開發中,為了提高代碼復用和開發效率,可以利用多種代碼倉庫來支持檢索增強功能。以下是幾種主要的代碼倉庫選擇方式:
后端場景的代碼庫準備
【推薦】挑選高頻代碼片段或文件:選擇在當前開發工程中頻繁出現或被多次使用的代碼片段。這些代碼片段通常具有高度引用性和重復使用的特點,適合作為知識庫的內容。將滿足上述條件的某個工程內的代碼片段或代碼文件整理成一個獨立的代碼庫,并上傳到一個獨立的知識庫中,以便于管理和調用。
當前項目的工程代碼:也可以將整個當前項目工程放入知識庫,可以實現跨整個代碼庫的全面檢索,從而提高代碼復用和開發效率。但如果工程中存在干擾性代碼或大量質量不高的代碼,則會影響代碼補全增強的效果。
前端場景的代碼庫準備
重要上傳使用組件庫的代碼倉庫,而不是組件源代碼倉庫。并且覆蓋的使用場景越全越好。
【推薦】前端模板頁面代碼庫:通過拼裝企業自定義組件,將那些通用性強且與具體業務緊密相關的前端頁面封裝成模板。這類模板頁面代表了最高質量的實踐案例,例如登錄頁、注冊頁、賬戶展示、轉賬等。如果您的企業已經建立了這樣的模板庫,建議優先將其上傳到企業代碼知識中。
當前項目的工程代碼庫:當前項目的代碼庫是包含了與當前開發任務最相關的代碼,對于那些編寫得當、結構清晰且具有良好實踐的工程代碼,將其上傳到企業的代碼知識庫,可以實現跨整個代碼庫的全面檢索,從而提高代碼復用和開發效率。但請注意,如果當前項目代碼庫中存在干擾性代碼或大量質量不高的代碼,則會影響代碼補全增強的效果。
場景二 特定業務場景下,確保代碼一致性,減少重復開發
在企業級應用開發中,某些業務邏輯需要保持一致性以確保系統的穩定性和可維護性。在缺乏統一標準的情況下,不同開發者可能會采用不同的實現方式,導致業務邏輯不一致,增加代碼維護的復雜性,并可能引發系統穩定性問題。
場景案例一:企業框架和中間件實現的邏輯復用
某企業在其商品售賣系統中,庫存管理需要采用統一的分布式鎖機制。通過將企業自研的業務框架整合到代碼知識庫中,開發者在IDE端編寫相關業務邏輯時,能夠方便地召回并復用這些標準化的代碼片段,從而提升開發效率,減少重復開發,提高代碼質量,并保證業務邏輯的一致性。
代碼庫的選擇和準備:
明確目標業務模式和具體實現機制:
識別關鍵業務模塊:確定系統中需要統一實現的關鍵業務邏輯模塊,例如庫存管理、訂單處理、支付系統等。
細化具體業務的實現機制:例如,在庫存管理中,可能涉及到庫存扣減、庫存查詢、庫存鎖定等不同場景,每個場景可能需要不同的實現機制。
選擇相關業務框架內的代碼文件并放入企業代碼知識庫:
從業務框架中篩選出實現關鍵業務邏輯的核心代碼,整理并放入到獨立的代碼知識庫中。例如,庫存扣減需要使用分布式鎖機制確保并發安全,那么選擇實現分布式鎖的核心代碼模塊。
/** * 使用企業自研的分布式鎖框架進行并發控制 */ @Service public class InventoryService { @Autowired private DistributedLockFramework lockFramework; @Autowired private InventoryRepository inventoryRepository; /** * 扣減庫存,使用分布式鎖確保并發安全 * @param productId 產品ID * @param quantity 扣減數量 * @return 是否扣減成功 */ public boolean deductInventory(Long productId, int quantity) { String lockKey = "inventory:" + productId; return lockFramework.withLock(lockKey, 30, TimeUnit.SECONDS, () -> { Inventory inventory = inventoryRepository.findByProductId(productId); if (inventory == null || inventory.getQuantity() < quantity) { return false; } inventory.setQuantity(inventory.getQuantity() - quantity); inventoryRepository.save(inventory); return true; }); } }
場景案例二:企業核心業務邏輯復用
某企業希望建立一種統一的個性化推薦策略應用于其商品推薦系統。通過將自主研發的業務架構融入代碼知識庫,當開發人員在集成開發環境(IDE)中編寫相關功能時,能夠輕松訪問并重復利用這些已標準化的代碼模塊。這樣做不僅能夠加速軟件開發過程,避免不必要的重復工作,還能提升代碼的整體質量,同時確保整個系統內業務邏輯的一致性和穩定性。
代碼庫的選擇和準備:
明確目標業務模塊和具體行為:
識別關鍵業務模塊:首先需要確定系統中哪些關鍵業務邏輯模塊需要統一實現,例如商品推薦系統。
細化具體的行為:其次,需要具體的業務行為和核心操作步驟:例如,在個性化推薦策略中,可能包括獲取用戶行為數據、提取用戶興趣特征、獲取候選商品池、計算商品得分并進行排序、以及返回得分最高的商品等幾個核心步驟。這些步驟的實現通過固定的代碼組合來完成。
選擇相關業務框架內的代碼文件并放入企業代碼知識庫:
從業務框架中挑選出實現關鍵業務邏輯的核心代碼,整理后存放到獨立的代碼知識庫中。以推薦系統的個性化推薦機制為例,以下是一個代碼示例:
/** * 推薦引擎服務 * 實現了基于用戶行為和商品特征的個性化推薦機制 */ @Service public class RecommendationService { @Autowired private UserBehaviorRepository userBehaviorRepo; @Autowired private ProductRepository productRepo; /** * 為指定用戶生成個性化推薦列表 * @param userId 用戶ID * @param limit 推薦數量 * @return 推薦的商品ID列表 */ public List<Long> generateRecommendations(Long userId, int limit) { // 獲取用戶行為數據 List<UserBehavior> behaviors = userBehaviorRepo.findRecentByUserId(userId, 100); // 提取用戶興趣特征 Map<String, Double> userInterests = extractUserInterests(behaviors); // 獲取候選商品池 List<Product> candidateProducts = productRepo.findRecentlyActive(1000); // 計算商品得分并排序 List<ScoredProduct> scoredProducts = candidateProducts.stream() .map(product -> new ScoredProduct(product, calculateScore(product, userInterests))) .sorted(Comparator.comparing(ScoredProduct::getScore).reversed()) .collect(Collectors.toList()); // 返回得分最高的商品 return scoredProducts.stream() .limit(limit) .map(sp -> sp.getProduct().getId()) .collect(Collectors.toList()); } // 其他輔助方法... }
重要對提取出的目標業務模塊的代碼進行適當的注釋說明,以便開發者后續在IDE端可以通過行間注釋方便召回代碼片段。
場景案例三:參考舊項目,以提升新項目研發效率
企業在進行新項目研發時,通過復用舊項目中的核心相似模塊代碼,提高了開發效率,減少從零開始編寫所有代碼所需的時間和成本,確保新項目的質量更加可靠。
代碼庫的選擇和準備:
明確目標業務和場景識別關鍵業務模塊:
確定相似功能:首先明確舊項目和新項目之間的相似功能和實現部分。例如,如果舊項目和新項目都涉及用戶管理、商品展示和訂單處理等功能,這些模塊可以作為重點。
評估代碼質量:確保舊項目的代碼已經經過充分測試,并且是穩定可靠的。清理不必要的文件和配置,確保代碼庫中的內容是干凈和可復用的。
細化具體業務行為及核心動作:
提取核心功能:在舊項目中,針對已明確可復用的模塊,提取出關鍵的核心功能模塊代碼。例如:
用戶管理:用戶注冊、登錄、信息修改等。
商品展示:商品列表、詳情頁、搜索功能等。
訂單處理:創建訂單、支付處理、訂單狀態更新等。
重要對提取出核心功能模塊的代碼進行適當的注釋說明,以便開發者后續在IDE端可以通過行間注釋方便召回代碼片段。
選擇相關業務框架內的代碼文件并放入企業代碼知識庫。將舊項目的代碼按照模塊化結構重新整理,根據新項目各模塊負責團隊的分工實現代碼隔離,并建立獨立的模塊代碼庫:
代碼知識庫隔離:根據項目的功能模塊,將準備好的舊項目代碼上傳到相應的代碼知識庫中。例如,將用戶管理模塊、商品展示模塊、訂單處理模塊等分別存放在不同的獨立知識庫下。
權限管理:設置合適的訪問權限,確保只有相關開發團隊對該模塊的知識庫可見,避免在IDE端進行代碼補全時造成不必要的干擾。
代碼文件的規范
支持語言及框架:
后端:JAVA、Python、Go、C#、C/C++
前端:Typescript、JavaScript、React、Vue
上傳限制:僅適用于源代碼文件,代碼庫中應僅上傳實際編寫的源代碼文件。例如,對于Java應上傳
.java
文件,對于C#應上傳.cs
文件,對于JavaScript應上傳.js
或.jsx
文件等。請避免上傳以下內容:
測試數據與代碼:請勿上傳測試腳本、測試用例或任何不包含業務邏輯的測試相關代碼。
Mock方法:排除所有由模擬方法和工具生成的代碼,除非這些代碼包含對業務邏輯的具體實現。
構建產物:
前端:排除通過構建工具(如Webpack、Gulp等)生成的文件,這些文件通常位于
dist
或build
目錄下。后端:排除編譯生成的DLL文件及其他所有編譯輸出。
注釋要求如下。
對希望被檢索到的函數,在函數頭部應添加詳盡的注釋。
注釋應提供充分的信息以區分不同的函數,建議參考注釋模板或根據企業規范進行相應調整。
/** * 更新指定訂單狀態。 * * @param orderId 訂單的唯一標識符。 * @param newStatus 新的訂單狀態。 * @return boolean 表示更新是否成功。 */
函數名稱規范要求。
如果函數注釋較為簡單,則函數名稱必須能夠準確描述其功能。
使用清晰且具描述性的命名方式,例如:
exportOrdersToPDF
、updateOrderStatus
而不是func1
。
上傳指南
打包壓縮文件:將代碼文件打包為
.zip
、.gz
或.tar.gz
格式。代碼包大小限制:每個代碼包的大小不得超過100 MB。
開發者如何使用企業代碼生成增強
插件版本要求
僅適用于 VS Code 1.3.9 及以上版本,以及 JetBrains IDEs 1.3.10 及以上版本。
后端場景使用實踐
通過自然語言注釋生成代碼。
企業代碼庫代碼上傳:上傳包含所需功能代碼的壓縮包至企業代碼庫,例如雪花算法的代碼,并確保目標函數遵循注釋規范,注釋位于函數頭部。更詳細代碼庫準備指南請參見上述管理員如何準備高質量企業代碼庫。
/** * 使用雪花算法生成唯一序列號 * @param workerId * @return */ public synchronized Long getSnowFlowerId(long workerId){ long id = -1L; if (workerId < 0 || workerId > snowFlowerProperties.getMaxWorkerId()) { throw new IllegalArgumentException( String.valueOf("workerID must gte 0 and lte " + snowFlowerProperties.getMaxWorkerId())); } // ... 算法實現代碼 ... return id; }
輸入注釋:在集成開發環境(IDE)中定位到某Java類內,輸入與期望召回的函數相匹配的注釋。注釋格式可以靈活,但應確保含義的準確性和一致性。
第一種方式
//請通過雪花算法生成唯一編號的代碼,返回生成的id
第二種方式
/** * 使用雪花算法生成唯一序列號 * @param wId * @return */
注釋說明。
注釋長度要求:在編寫代碼時,注釋應盡量避免過于簡短,建議長度至少15個字符,過短的注釋將無法觸發召回。
注釋語義要求:確保注釋的語義準確且有意義,最好包含關鍵詞與返回值說明,以便通義靈碼準確地理解和匹配相應的代碼。
多語言支持:支持中英文注釋,代碼庫中的注釋和實際編碼時的注釋可以使用不同的語言。
參數名稱靈活性:參數名稱可以靈活處理,通義靈碼會根據提供的參數自動調整以匹配召回的代碼。如下反例。
//雪花算法
問題:沒有提供足夠的信息,注釋長度過短。//生成唯一序列號
問題:沒有使用具體關鍵詞,可能會影響理解和匹配效果。
代碼生成:首次回車后,靈碼將提供基于注釋生成補全建議;再次回車后,靈碼將根據企業代碼庫中的代碼進行補全。
說明如果您的注釋中包含參數,靈碼將自動調整生成代碼中的參數,確保命名一致性。
如果需要刷新緩存獲取新的補全建議,macOS可以使用
?(option)
P
手動觸發行間補全,Windows可以使用Alt
P
手動觸發。
通過函數簽名生成代碼。
代碼庫代碼上傳:上傳包含所需功能代碼的壓縮包至企業代碼庫,并確保這些函數具有清晰且獨特的標識,以便于檢索和識別。更詳細代碼庫準備指南請參見上述管理員如何準備高質量企業代碼庫。
輸入函數簽名:在集成開發環境(IDE)中定位到某Java類內,鍵入目標函數的簽名部分。參數名稱可以靈活處理,通義靈碼會根據提供的參數自動調整以匹配召回的代碼。
public List<Object> nextList(String name, int size)
函數簽名說明。
函數名稱:使用較為清晰的函數名稱,需要具備一定語義作為相似性依據。
參數和返回值:類型和順序需要與目標函數保持一致,但參數名稱可以靈活處理,通義靈碼會根據提供的參數自動調整以匹配召回的代碼。如下反例。
public List<Object> func1(String name, int size)// 問題:函數名語義不清晰,無法準確反映函數功能
public List<String> nextList(int orderId)// 問題:參數類型和返回值類型,與目標函數不匹配
代碼補全:首次回車后,靈碼將提供代碼補全建議;再次回車后,靈碼將根據企業代碼庫中的代碼進行自動補全。
說明靈碼將根據您提供的參數名,自動調整生成代碼中的參數名,確保命名一致性。
如果需要刷新緩存獲取新的補全建議,macOS可以使用
?(option)
P
手動觸發行間補全,Windows可以使用Alt
P
手動觸發。
前端場景使用實踐
通過標簽補全前端自研組件代碼。
代碼庫代碼上傳:在開始之前,您需要確保所有必要的前端組件代碼已經上傳到企業代碼庫中。如下是React框架示例。
<LTable isReady={isReady} formInitialValues={formInitialValues} rowKey="key" tableRef={tableRef} toolbarLeft={ <Button type="primary">新增</Button> } formItems={formItems} formRef={formRef} columns={columns} request={async (params, requestType) => { const res: Record<string, any> = await apiGetUserList(params); return { data: res.data, total: res.total, }; }} />
編寫組件代碼: 在您的IDE中打開相應的.jsx文件,并開始編寫代碼。輸入基礎HTML標簽或自定義組件標簽,例如
<LTable />
。代碼自動補全: 當您輸入的代碼達到一定長度,并且能夠與企業組件庫中的代碼匹配時,IDE將自動觸發代碼補全功能,為您生成完整的組件代碼。您也可以通過回車,主動觸發代碼補全。
重要請在完整的組件標簽內觸發您的補全。
通過自然語言注釋生成代碼。
代碼庫代碼上傳:上傳包含所需功能代碼的壓縮包至企業代碼庫,并確保每個函數都遵循注釋規范,注釋位于函數頭部。 更詳細代碼庫準備指南見管理員如何準備高質量企業代碼庫章節。如下是JavaScript示例。
/** * 根據報錯信息生成,以id為鍵值的對象 * @param {Array<validator,Result>} results * @return {Record<string,string>} */ function getErrObj(results) { // ... 函數實現代碼 ... }
輸入注釋:在IDE中,在JavaScript文件內輸入特定的注釋內容,如下示例。
//根據報錯信息生成以 id 為鍵值的對象
注釋說明。
注釋長度要求:在編寫代碼時,注釋應盡量避免過于簡短,建議長度至少15個字符,過短的注釋將無法觸發召回。
注釋語義要求:確保注釋的語義準確且有意義,最好包含關鍵詞與返回值說明,以便通義靈碼準確地理解和匹配相應的代碼。
多語言支持:支持中英文注釋,代碼庫中的注釋和實際編碼時的注釋可以使用不同的語言。
參數名稱靈活性:參數名稱可以靈活處理,通義靈碼會根據提供的參數自動調整以匹配召回的代碼。
代碼生成:首次回車后,靈碼將提供基于注釋生成補全建議;再次回車后,靈碼將根據企業代碼庫中的代碼進行補全。
如果您的注釋中包含參數,靈碼將自動調整生成代碼中的參數名,確保命名一致性。
如果需要刷新緩存獲取新的補全建議,macOS可以使用
?(option)
P
手動觸發行間補全,Windows可以使用Alt
P
手動觸發。
常見問題:在重新安裝插件后,即便重啟IDE或重新登錄,仍無法成功召回知識庫中的代碼。
解決方案:
在macOS系統中,請執行以下命令以重啟進程并清除緩存。
ps -ef|grep lingma|grep start|awk '{print $2}'|xargs -I {} kill -9 {}
如果是Windows系統,請在進程管理器中結束Lingma進程。