GitHub Copilot用了一段时间,发现很多人只用到了基础功能。
本文分享一些进阶技巧,包括更好的提示词、上下文管理、多文件协作、测试生成、代码重构,以及一些隐藏功能。
一、基础回顾
1. 什么是GitHub Copilot
GitHub Copilot是一个AI编程助手。
- 由GitHub和OpenAI合作开发
- 基于大语言模型
- 集成在IDE中
- 根据上下文自动补全代码
支持的IDE:
- VS Code
- Visual Studio
- JetBrains系列
- Neovim
2. 基础用法
基础用法很简单:
- 写注释,Copilot生成代码
- 写函数名,Copilot补全函数体
- 写一半代码,Copilot继续写
- 按Tab接受建议
但这些只是基础,Copilot还有很多进阶用法。
二、进阶技巧一:写更好的提示词
1. 注释要详细
注释越详细,生成的代码越好。
不好的注释:
// 排序数组
function sortArray(arr) {
// Copilot可能生成简单的冒泡排序
}好的注释:
// 对数字数组进行快速排序,升序排列,原地修改
// 时间复杂度O(n log n),空间复杂度O(log n)
// 参数:arr - 数字数组
// 返回:排序后的数组(原数组也会被修改)
function quickSort(arr) {
// Copilot会生成更符合要求的快速排序
}2. 给出输入输出示例
给出输入输出示例,Copilot理解更准确。
// 函数:格式化日期
// 输入:new Date(2023, 0, 15)
// 输出:"2023-01-15"
// 输入:new Date(2023, 11, 5)
// 输出:"2023-12-05"
function formatDate(date) {
// Copilot会根据示例生成正确的格式化逻辑
}3. 指定约束条件
在注释中指定约束条件。
// 函数:验证邮箱格式
// 约束:
// 1. 使用正则表达式
// 2. 不使用任何外部库
// 3. 性能要高,避免灾难性回溯
// 4. 返回布尔值
function validateEmail(email) {
// ...
}4. 用自然语言描述复杂逻辑
复杂逻辑,用自然语言描述清楚。
// 函数:计算两个时间段的重叠时长
// 逻辑:
// 1. 计算两个时间段的重叠开始时间(取较大的开始时间)
// 2. 计算重叠结束时间(取较小的结束时间)
// 3. 如果结束时间 <= 开始时间,返回0
// 4. 否则返回重叠的毫秒数
// 参数都是Date对象
function getOverlapDuration(start1, end1, start2, end2) {
// ...
}三、进阶技巧二:上下文管理
1. 打开相关文件
Copilot会参考当前打开的文件。
- 如果你在写一个使用React组件的代码
- 打开那个组件的定义文件
- Copilot会参考组件的props和方法
- 生成更准确的代码
2. 用注释引用其他文件
可以在注释中引用其他文件。
// 参考:./utils/helpers.js 中的 formatDate 函数
// 参考:./types/user.ts 中的 User 接口
function createUserCard(user) {
// Copilot会参考这些文件
}3. 利用代码库的模式
Copilot会学习你的代码库的模式。
- 如果你的代码库用了特定的命名规范
- 特定的代码结构
- 特定的设计模式
- Copilot会模仿这些模式
所以,代码库越规范,Copilot生成的代码越好。
四、进阶技巧三:多文件协作
1. 生成配套文件
写一个文件后,可以让Copilot生成配套文件。
比如写了一个React组件:
// Button.jsx
export function Button({ text, onClick }) {
return <button onClick={onClick}>{text}</button>;
}然后新建Button.test.js,Copilot会自动生成测试:
import { render, screen, fireEvent } from '@testing-library/react';
import { Button } from './Button';
test('renders button with text', () => {
render(<Button text="Click me" onClick={() => {}} />);
expect(screen.getByText('Click me')).toBeInTheDocument();
});2. 生成类型定义
写了JavaScript代码后,可以让Copilot生成TypeScript类型定义。
// user.js
export function createUser(name, age) {
return { id: Date.now(), name, age, createdAt: new Date() };
}新建user.d.ts:
export interface User {
id: number;
name: string;
age: number;
createdAt: Date;
}
export function createUser(name: string, age: number): User;3. 生成文档
写了代码后,可以让Copilot生成文档。
在函数上方写:
/**
* 计算斐波那契数列的第n项
*
* @param {number} n - 第几项(从0开始)
* @returns {number} 第n项的值
* @example
* fibonacci(0) // 0
* fibonacci(1) // 1
* fibonacci(10) // 55
*/
function fibonacci(n) {
// ...
}Copilot会帮你补全JSDoc注释。
五、进阶技巧四:测试生成
1. 生成单元测试
选中函数,让Copilot生成测试。
// 选中这个函数
function calculateDiscount(price, discountPercent) {
if (discountPercent < 0 || discountPercent > 100) {
throw new Error('折扣比例必须在0-100之间');
}
return price * (1 - discountPercent / 100);
}Copilot生成的测试:
describe('calculateDiscount', () => {
test('正常折扣计算', () => {
expect(calculateDiscount(100, 20)).toBe(80);
});
test('零折扣', () => {
expect(calculateDiscount(100, 0)).toBe(100);
});
test('全额折扣', () => {
expect(calculateDiscount(100, 100)).toBe(0);
});
test('折扣小于0抛出错误', () => {
expect(() => calculateDiscount(100, -10)).toThrow('折扣比例必须在0-100之间');
});
test('折扣大于100抛出错误', () => {
expect(() => calculateDiscount(100, 110)).toThrow('折扣比例必须在0-100之间');
});
});2. 生成边界测试
在注释中要求生成边界测试。
// 为下面的函数生成单元测试
// 要求覆盖:正常情况、边界情况、错误情况
function parseAge(ageStr) {
const age = parseInt(ageStr);
if (isNaN(age) || age < 0 || age > 150) {
return null;
}
return age;
}3. 生成集成测试
Copilot也能生成集成测试。
// 为用户注册流程生成集成测试
// 测试:注册成功、邮箱已存在、密码太弱、参数缺失六、进阶技巧五:代码重构
1. 选中代码让Copilot优化
选中一段代码,让Copilot优化。
比如选中:
function getTotal(prices) {
let total = 0;
for (let i = 0; i < prices.length; i++) {
total = total + prices[i];
}
return total;
}然后写注释:
// 优化上面的函数,使用数组方法,更简洁Copilot会生成:
function getTotal(prices) {
return prices.reduce((sum, price) => sum + price, 0);
}2. 代码转换
可以让Copilot转换代码。
JavaScript转TypeScript:
// 将下面的JavaScript代码转换为TypeScript
function add(a, b) {
return a + b;
}生成:
function add(a: number, b: number): number {
return a + b;
}Promise转async/await:
// 将下面的Promise链转换为async/await
function getData() {
return fetch('/api/user')
.then(res => res.json())
.then(user => fetch(`/api/posts?userId=${user.id}`))
.then(res => res.json());
}生成:
async function getData() {
const userRes = await fetch('/api/user');
const user = await userRes.json();
const postsRes = await fetch(`/api/posts?userId=${user.id}`);
return postsRes.json();
}3. 代码解释
看不懂的代码,让Copilot解释。
// 解释下面的代码在做什么
const debounce = (fn, delay) => {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => fn(...args), delay);
};
};Copilot会生成详细的解释。
七、进阶技巧六:隐藏功能
1. Copilot Chat
Copilot Chat是一个聊天界面,可以直接问问题。
- 解释代码
- 生成代码
- 调试错误
- 代码重构
- 写测试
在VS Code中,打开Copilot Chat面板,直接输入问题。
2. 内联聊天
在代码中选中,按Ctrl+I,可以打开内联聊天。
- 直接在代码旁边对话
- 生成的代码直接替换选中部分
- 更方便
3. 语音输入
Copilot支持语音输入。
- 按住Ctrl+Alt+V
- 用语音描述你想要的代码
- Copilot会生成代码
适合不想打字的时候。
4. 命令面板
VS Code的命令面板里,有很多Copilot命令。
- Copilot: Open Chat
- Copilot: Generate Tests
- Copilot: Explain This
- Copilot: Fix This
- Copilot: Make Better
可以快速调用各种功能。
八、最佳实践
1. 不要盲目接受
Copilot生成的代码,一定要审查。
- 可能有bug
- 可能有安全问题
- 可能不符合你的代码规范
- 可能不是最优解
AI是助手,不是替代。
2. 保持代码库规范
代码库越规范,Copilot生成的代码越好。
- 统一的命名规范
- 统一的代码结构
- 清晰的注释
- 好的类型定义
3. 小步生成
不要让Copilot一次生成太多代码。
- 一个函数一个函数地生成
- 每生成一个,就审查和测试
- 小步迭代
- 质量更高
4. 结合自己的思考
Copilot是工具,思考还是要靠自己。
- 先想清楚要做什么
- 再让Copilot生成
- 审查和修改
- 不要完全依赖
5. 保护敏感信息
不要把敏感信息发给Copilot。
- API密钥
- 密码
- 客户数据
- 公司机密
Copilot可能会学习这些信息。
九、常见问题
1. Copilot生成的代码有bug怎么办?
- 审查代码
- 修改bug
- 用更详细的提示词重新生成
- 自己写关键部分
2. Copilot生成的代码不符合规范怎么办?
- 在提示词中说明规范
- 打开相关文件作为参考
- 手动调整
- 用ESLint/Prettier统一格式
3. Copilot太慢怎么办?
- 检查网络
- 减少打开的文件
- 简化提示词
- 升级Copilot计划
4. Copilot收费吗?
- 个人用户:每月10美元
- 企业用户:每月19美元
- 学生可以免费申请
- 有30天免费试用
十、写在最后
GitHub Copilot是一个强大的AI编程助手,但很多人只用到了基础功能。
通过更好的提示词、上下文管理、多文件协作、测试生成、代码重构,以及隐藏功能,可以大大提高编程效率。
但记住:Copilot是助手,不是替代。审查代码、保持思考、保护敏感信息,这些都是必须的。
2023年了,AI编程越来越普及。掌握Copilot的进阶技巧,能让你在AI时代更有竞争力。
最后,用一句话总结:"Copilot的价值,不在于它能写多少代码,而在于你能多好地引导它。好的提示词 + 审查 + 迭代,才能发挥Copilot的最大价值。"
愿你用好AI编程工具,写出更好的代码。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录