使用GitHub Copilot聊天模式重构代码

已完成

GitHub Copilot可用于重构代码库中的代码。 可以使用聊天视图代理来分析、计划和实现代码重构任务。 聊天视图代理提供一个用户友好的界面,用于管理聊天对话和访问GitHub Copilot的功能。 聊天视图包括以下内置代理:

  • :使用 Ask 询问有关代码库或技术概念的问题。 可以使用 Ask 解释代码、建议修订或修复,或者提供与代码库相关的信息。
  • 计划:在编写任何代码之前,使用计划代理创建结构化的分步实施计划。 当计划看起来正确时,请将其交给实现代理以执行它。
  • 代理:使用代理启动代理编码工作流。 可以使用代理在工作区中运行命令、执行代码或执行其他任务。

重要

使用代理时,GitHub Copilot可能会发出多个高级请求来完成单个任务。 高级请求可用于用户发起的提示词以及 GitHub Copilot 代表你执行的后续操作。 所使用的高级请求总数取决于任务的复杂性、所涉及的步骤数和所选模型。

使用 Ask 重构代码

可以使用 Ask 获取有关编码任务的帮助、了解棘手的概念和改进代码。 Ask 专为使用 GitHub Copilot Chat 进行交互式对话而设计。 可以实时提问、获取解释或请求建议。

  1. 打开“聊天”视图,然后选择“询问”。

  2. 向聊天添加上下文。

    Ask 支持聊天参与者、斜杠命令和聊天变量。 您可以将@workspace聊天参与者添加到聊天中,或将#codebase添加到聊天中,以提供上下文以及附带的文件或文件夹。

  3. 提出可帮助你了解要重构的代码以及要进行的更改的问题。

    例如,你可能要求GitHub Copilot帮助你了解现有身份验证代码如何使用 OAuth 更新当前方法。

  4. 构造一个提示,以描述您想要实施的更新。

    提示应包含要实现的代码功能的说明。 例如:

    @workspace I need to refactor the `EnumHelper` class and remove any code that uses reflection. Use static dictionaries to supply enum description attributes. Use a separate dictionary for each enum. The dictionaries should use values from the `LoanExtensionStatus.cs`, `LoanReturnStatus.cs`, and `MembershipRenewalStatus.cs` files. Explain how to update the EnumHelper class using dictionaries and show me the updated code.
    
  5. 在聊天视图中查看建议的代码。

    聊天视图中显示的响应将包含可用于实现该功能的代码片段。 可以输入更新的提示来优化代码或询问更多详细信息。

  6. 若要实现建议的代码,可以将鼠标指针悬停在代码片段上,然后在 “应用”、“ 插入”和 “复制 ”选项之间进行选择。

    • 应用:将代码建议应用于编辑器中的当前文件。
    • 插入:在编辑器中的当前光标位置插入代码建议。
    • 复制:将代码建议复制到剪贴板。
  7. 测试重构的代码,以确保它运行时没有错误并生成预期结果。

使用Plan模块重构代码

若要在进行更改之前创建结构化的分步实施计划,可以使用计划代理。 计划代理分析代码库,提出澄清问题,并生成详细的计划。 当计划看起来正确时,你可以将其交给实现代理来执行它。

小窍门

使用 Ask 评估想要重构的代码,并在开始进行更改之前评估选项。 可以使用计划创建结构化计划,然后将其移交给实现代理。

  1. 打开“聊天”视图,然后选择“计划”。

  2. 向聊天添加上下文。

    使用#codebase和通过向聊天添加文件来指定工作区上下文。

  3. 构造描述要实现的代码功能的提示。

    提示应包含要实现的代码功能的说明。 例如:

    
    #codebase I need to refactor the `EnumHelper` class and remove any code that uses reflection. Use static dictionaries to supply enum description attributes. Use a separate dictionary for each enum. The dictionaries should use values from the `LoanExtensionStatus.cs`, `LoanReturnStatus.cs`, and `MembershipRenewalStatus.cs` files.
    
    
  4. 查看GitHub Copilot生成的结构化实施计划。

    计划代理会创建一个分步计划,可以在进行任何代码更改之前查看该计划。

  5. 当计划看起来正确时,请将其交给实现代理以执行它。

    可以将计划移交给代理,以将更改应用到代码库。

  6. 在代码编辑器中查看建议修改。

  7. 接受或拒绝建议修改。

    可以使用向上和向下箭头浏览编辑。 可以通过对每个编辑显示的弹出菜单分别选择保留(接受)或撤销(放弃)建议的修改。 还可以使用编辑器选项卡底部的 “保留撤消 ”按钮(或聊天视图)一次性接受或拒绝所有编辑。

  8. 测试重构的代码,以确保它运行时没有错误并生成预期结果。

使用代理重构代码

如果要自动执行重构代码的过程,可以使用代理。 智能体充当可代表你执行操作的自主智能体。 可以要求GitHub Copilot执行特定任务,并根据请求生成代码。

使用代理,可以使用自然语言来指定高级任务,并让GitHub Copilot对请求进行自主推理、规划所需的工作,并将更改应用到代码库。 代理使用代码编辑和工具调用的组合来完成指定的任务。 处理请求时,它会监控编辑和工具的结果,并不断调整以解决任何出现的问题。

重要

使用代理时,GitHub Copilot可能会发出多个高级请求来完成单个任务。 高级请求可用于用户发起的提示词以及 GitHub Copilot 代表你执行的后续操作。 所使用的高级请求总数取决于任务的复杂性、所涉及的步骤数和所选模型。

  1. 打开聊天视图并选择“代理”。

  2. 构造一个提示,描述您希望GitHub Copilot执行的任务。

    假设你有一个代码项目,该项目使用两个或多个进程/技术来完成相同的任务。 可以要求GitHub Copilot使用单个方法来重构代码,以提高一致性、可维护性和性能。

    例如:

    
    Review the LINQ code used in the JsonData and JsonLoanRepository classes. Refactor the methods in the JsonPatronRepository class using LINQ queries. Ensure that existing code functionality is maintained.
    
    
  3. 代理可能会调用多个工具来完成不同的任务。 (可选)选择“工具”图标以配置可用于响应请求的工具。

  4. 确认工具调用和终端命令。

    在GitHub Copilot运行终端命令或未内置工具之前,它会请求确认以继续。 确认是必需的,因为工具可能在计算机上本地运行,并执行修改文件或数据的作。

  5. GitHub Copilot检测代码编辑和终端命令中的问题和故障,并迭代执行操作以解决问题。

    重要

    虽然GitHub Copilot能够自我修复,但它可能并不总是能够自行解决问题。 可以暂停该过程并提供更多上下文来帮助GitHub Copilot了解问题。 还可以取消该过程,并通过新的提示重新开始。

  6. 查看这些建议的修改,并选择接受或拒绝。

  7. 测试重构的代码,以确保它生成预期结果。

    代理应自行解决问题,但仍应测试代码以确保其按预期工作。

    可以使用聊天视图中的 “撤消 ”按钮还原代理所做的编辑。 还可以在编辑器中使用 “还原 ”选项来还原代理所做的更改。

何时选择代理而非计划

请考虑以下条件,在计划与代理之间进行选择:

  • 规划:在编写任何代码之前,计划创建结构化的分步实施计划。 代理自主确定要编辑的相关上下文和文件,并开始直接进行更改。
  • 任务复杂性:代理更适用于需要代码编辑和调用工具或终端命令的复杂任务。
  • 持续时间:代理使用多个步骤来处理请求,因此生成响应可能需要更长的时间。 例如,为了确定需要编辑的相关上下文和文件、制订行动计划等,您可以执行以下步骤。
  • 自我修复:代理会评估生成的编辑结果,并可能多次反复处理以解决中间问题。
  • 请求配额:使用代理模式时,根据任务的复杂性,一个提示可能会导致对后端发出许多请求。

概要

GitHub Copilot可用于重构代码库中的代码。 可以使用聊天视图代理来分析、计划和实现代码重构任务。 聊天视图包括三个内置代理:Ask、Plan 和 Agent。 可以使用 Ask 询问有关基本代码或技术概念的问题。 在编写代码之前,可以使用计划创建结构化实现计划。 可以使用代理启动代理编码工作流。