Github Copilot 在IntelliJ IDEA中的实践

2,769 阅读4分钟

前言

Github Copilot 官方指南中基于 VScode(vscode 和 github都是微软产品)展示了一些使用示例,根据这份指南进行了一些在IntelliJ IDEA 中的使用实践。
关于Copilot如何安装使用、账号申请这块比较简单这里就没有列出。

初识Copilot

Github 对于 Copilot (基于chatGPT 3.5实现)的官方解释为:结对程序员。也就是你可以把copilot 当做你结对编程的伙伴。

为什么要专门提这个角色呢?
因为很多程序员可能已经使用过chatGPT,很容易把copilot当做类似的生产工具。

只能说这两个工具很相似,但是有差异的。跟chatgpt交流时,只需要描述需求,chatgpt会给你一段代码;但copilot 不一样,它更像一个结对伙伴或者代码补全工具 ,如果你有复杂的需求,那么你需要慢慢引导或者很详细的描述自己的需求,它才能慢慢给你提供代码。
比如你跟chatgpt说,请提供一个基于java的分布式锁,chatgpt就会给你完整的一对代码。你如果也这样跟copilot说,实际上得不到你想要的结果。

那如何说呢才能得到自己想要的结果呢?这就是这篇文章要帮你认识的,相信看完后你会理解copilot的角色和如何描述自己的需求。

示例

copilot 使用时,用户代码写完后,按 enter 键即可等待copilot生成代码,按 tab键即可接受代码建议,按 alter + [ 或 alter +] 可以切换生成的代码(有时候会生成好几套代码)

根据注释补全代码

  • 输入注释 使用 LocalDate 生成两个日期变量
Snipaste_2023-08-02_11-08-55.png

Snipaste_2023-08-02_11-09-27.png

Snipaste_2023-08-02_11-09-56.png

可以很明显地看到,按 Enter键之后 copilot就生成了相应的代码(白色背景部分)

手动格式化代码之后,就可以得到如下的效果。

Snipaste_2023-08-02_11-10-34.png

根据注释生成方法

  • 输入注释 比较两个日期区间是否有交集

Snipaste_2023-08-02_11-11-58.png

根据方法名自动补全

  • 输入 public static getDays 将自动生成如下内容

Snipaste_2023-08-02_11-17-02.png

在上述示例中,我们根据注释或者方法名生成了方法体。
可细看之下,我们会发现有些方法是正确的,有些是有问题的
比如 isOverlap 是没问题的, getDays 其实是错误的。
我觉得更准确地说应该描述的需求有歧义吧。

Snipaste_2023-08-02_11-19-59.png

Snipaste_2023-08-02_11-20-06.png

可以看到 2021-07-01 到 2023-07-02 的日期相差也是1 天,这很明显不是我们想要的。
我们调整如下

Snipaste_2023-08-02_11-22-05.png

Snipaste_2023-08-02_11-24-47.png

改动之后的结果如下

Snipaste_2023-08-02_11-25-06.png

可以看到,此时才符合我们的需求。
通过这个示例,不知道你是否才感受到什么叫做结对编程。按步骤解释自己的需求才能更好地得到自己想要的代码。

生成测试用例

  • 未得到想要的结果

Snipaste_2023-08-02_11-28-13.png

  • 成功得到测试用例

Snipaste_2023-08-02_11-28-59.png

Snipaste_2023-08-02_11-31-34.png

Snipaste_2023-08-02_11-33-35.png

Snipaste_2023-08-02_11-35-05.png
Snipaste_2023-08-02_11-36-00.png

为什么第一次没有得到想要的结果呢?
我的理解是第一次方法名写的不规范 testGetDaysWithFiveExample 这个方法名其实有问题的,如果我们再最后加个 s应该第一次就可以成功testGetDaysWithFiveExample

为什么后面写的方法名没有带 s也可以成功呢?

这是copilot它会根据 IDEA 中已打开的文件进行上下文关联,具体会根据多少个文件进行关联目前官方没有明确支持,但有明确说到会根据当前编辑的文件上下文进行创作。(官方解释是相邻选项卡关联技术),而且官方目前在研究将整个项目进行上下文关联。

根据注释/方法名生成 SQL

Snipaste_2023-08-02_11-38-35.png

Snipaste_2023-08-02_11-40-47.png

Snipaste_2023-08-02_11-41-13.png

Snipaste_2023-08-02_11-41-30.png

Snipaste_2023-08-02_11-41-45.png

实践感受

要想更高效地让copilot帮助到自己,建议保持以下几个习惯。

  • 按步骤喂提示,让自己的需求能更容易被工具理解
  • 要明白copilot会根据当前文件内容做上下文来生成代码
  • 保持良好的命名规范和代码风格,将使copilot更好地理解我们的需求

目前 copilot 在 vscode上线了一个试用版的copilot chat (基于chatGPT 4.0)类似于chatgpt一样可以进行聊天的方式沟通,有兴趣的朋友可以一试(我才刚申请试用)

其他使用指南

Github Copilot 官方使用指南

掘金翻译版部分官方使用指南