用GPT帮你完成50%代码开发!重塑代码开发方式!

"我正在参加「掘金·启航计划」"

1. 背景

以GPT为首的技术,让代码生成成为可能。 如何更好使用它,帮助我们进行编码,是本期文章的主题。

2. 介绍

2.1. 一个简单示例

当我们有一些简单的需求时,我们可以直接告诉GPT,让它帮我们生成一些代码,例如:

scss 复制代码
用户:
帮我写一个快速排序的Java代码

ChatGPT:
当然,下面是快速排序的Java实现代码:

public class QuickSort {

    public static void main(String[] args) {
        int[] arr = {9, 5, 7, 2, 3, 6, 8, 4, 1};
        quickSort(arr, 0, arr.length - 1);
        System.out.print("Sorted Array: ");
        printArray(arr);
    }

    public static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            int partitionIndex = partition(arr, low, high);
            quickSort(arr, low, partitionIndex - 1);
            quickSort(arr, partitionIndex + 1, high);
        }
    }

    public static int partition(int[] arr, int low, int high) {
        int pivot = arr[high];
        int i = low - 1;

        for (int j = low; j < high; j++) {
            if (arr[j] < pivot) {
                i++;
                swap(arr, i, j);
            }
        }

        swap(arr, i + 1, high);
        return i + 1;
    }

    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
}
请注意,快速排序是一种常用的高效排序算法,它的平均时间复杂度为O(n log n)。在这个实现中,我们使用递归来分割数组并排序子数组,直到最终得到有序的数组。运行代码后,将输出排序后的数组。

2.2. 在实际项目中应用

但是,在实际项目中,我们可能发现,不知道什么时候该用它,怎么用。 这里我提供一种我的编程方式的思路,你可以看看。

通过这种编程方式,我可以更容易写出比较清晰的代码,代码也更少出错。

思想是:"先定大局逻辑,再把细节各个击破",读了下面的例子,你应该就能理解了

以下是我杜撰的一个示例。

客户需求:

有一个学生成绩的文本文件,例如:student_grade.txt.【包括:姓名、成绩】
需要对文件做处理,输出2个文件

1. 平均分文件
2. 得分前10名同学 + 成绩的文件

好的,我的做法如下:

  1. 思考整体流程是怎样的?【以下是一种可能的思考方式,你可以有不同的思考】

    1. 读取文件
    2. 计算平均分
    3. 排序之后取前10名
  2. 写出整个大的调用流程,把复杂的部分用函数表示,写下函数的简单注释,像伪代码那样: 【这部分我一般会用流程图/时序图来表示自己的设计,不过有了设计之后还是要像写代码写出主流程】

java 复制代码
originalFileName="/tmp/student_grade.txt"
// 第一步:读文件
List<String> studentStrList = readLinesFromFile(originalFileName)

// 第二步:将列表转换为对象,方便后续处理
List<Student> studentList = strListToStudentList(studentStrList)

// 第三步:计算平均分,保存到一个txt文件里
avgFileName="/tmp/avg.txt"
calculateAvgGrade(studentList, avgFileName);

// 第四步:排序后取前10名,保存到一个文件里
top10GradeFileName="/tmp/top10Grade.txt"
top10AvgGrade(studentList, avgFileName);
  1. 定义和实现每个函数,例如:
java 复制代码
/**
 * 把指定文件的内容,按行读取出来。
 * @throws java.io.FileNotFoundException 当不存在该文件时,抛出该异常
*/
public static List<String> readLinesFromFile(String fileName) {
}

/** 
 * 计算studentList的平均分,保存到文件中,文件命名为avgFileName。
*/
public static void calculateAvgGrade(List<Student> studentList, String avgFileName) {

}
  1. 针对每个部分,进行思考 或者调用GPT
    1. 是否有现成的工具类可以使用,如果你不知道,可以问问GPT
    2. 这部分是否逻辑简单且独立,可以交给GPT来生成
    3. 如果上述两种方式你都思考过,觉得不行,逻辑还是复杂,那么要么:
      1. 按照你的想法实现代码,毕竟不是所有逻辑都能交给GPT来生成的。

      2. 在开发某个函数过程中,继续把功能拆分为独立单元。例如:在开发上面的 calculateAvgGradetop10AvgGrade 时,你发现,这个函数可以拆分为如下:

        java 复制代码
        /** 
         * 计算studentList的平均分,保存到文件中,文件命名为avgFileName。
        */
        public static void calculateAvgGrade(List<Student> studentList, String avgFileName) {
            // 计算平均分
        	List<String> avgGrade = getAvgGrade(studentList)
        	// 保存到文件里
        	saveToFile(avgGrade, avgFileName);
        }

        可以发现,saveToFile这部分功能比较简单独立,可以交给GPT来生成。方法同样是,给定函数定义,写下注释,让GPT生成。

以下是我在开发过程中,可能的询问GPT的一种方式:

java 复制代码
用户: 
我有个Java函数,请帮我实现该函数:
/**
 * 把指定文件的内容,按行读取出来。
 * @throws java.io.FileNotFoundException 当不存在该文件时,抛出该异常
*/
public static List<String> readLinesFromFile(String fileName) {
}

GPT的回复:
当然可以!以下是实现给定函数的代码示例:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class FileUtil {

   /**
    * 把指定文件的内容,按行读取出来。
    * @param fileName 文件名
    * @return 包含文件每行内容的列表
    * @throws java.io.FileNotFoundException 当不存在该文件时,抛出该异常
    */
   public static List<String> readLinesFromFile(String fileName) throws IOException {
      List<String> lines = new ArrayList<>();

      try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
         String line;
         while ((line = reader.readLine()) != null) {
            lines.add(line);
         }
      }

      return lines;
   }
}

注:其实,这个已经有现成的工具类可以使用,不需要重新写一个了,这部分就留给你自己做吧,修改提示词即可,我相信你可以做到的,加油。

其他的函数也可以按照这种方式生成。

总结

总的来说,核心就是:"先从大局出发,搞清楚整个流程,再逐个击破。"

由外到内,搞明白整体流程是什么,从大局层面先定下来,细节的部分,可以交给GPT做或者你自己实现。

如果你写代码是:从上到下,也就是在写到readLinesFromFile(originalFileName)时,就急于去实现该方法,往往容易因小失大,忘记全局的情况

当然,本文给的例子的解决方法不是唯一的,实际思考伪代码时,你可以用各种不同的方式来实现,这都是可以的。并且如果你仔细查看,就会发现我的处理方法不一定高效,甚至有可能是错的。

不过,思想最重要,你要是有更好的想法,欢迎留言或者私信和我交流。

扩展说明

我个人平时会用到的 "生成代码/单元测试" 的 prompt提示词,我也搞了一个文档,各位有需要的可以查看我的这篇文章:

代码开发Prompt提示词合集

相关推荐
2401_882727573 小时前
低代码配置式组态软件-BY组态
前端·后端·物联网·低代码·前端框架
追逐时光者4 小时前
.NET 在 Visual Studio 中的高效编程技巧集
后端·.net·visual studio
大梦百万秋4 小时前
Spring Boot实战:构建一个简单的RESTful API
spring boot·后端·restful
斌斌_____5 小时前
Spring Boot 配置文件的加载顺序
java·spring boot·后端
路在脚下@5 小时前
Spring如何处理循环依赖
java·后端·spring
逸_5 小时前
dify工作流+github actions实现翻译并创建PR
gpt·github·dify
海绵波波1076 小时前
flask后端开发(1):第一个Flask项目
后端·python·flask
小奏技术7 小时前
RocketMQ结合源码告诉你消息量大为啥不需要手动压缩消息
后端·消息队列
AI人H哥会Java8 小时前
【Spring】控制反转(IoC)与依赖注入(DI)—IoC容器在系统中的位置
java·开发语言·spring boot·后端·spring
凡人的AI工具箱8 小时前
每天40分玩转Django:Django表单集
开发语言·数据库·后端·python·缓存·django