Java教程

结对编程代码互评

本文主要是介绍结对编程代码互评,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

结对编程代码互评

简介

本篇文章对刘其同学的个人项目代码进行分析评价。
刘其同学使用 Java 作为项目语言,数据存储在 sqlite3 数据库中。
很好地完成了需求文档中的要求,功能完整,输入提示叙述清晰。

架构分析

.
├── GenPaper.iml
├── data
│   ├── userInfo.txt
│   └── 张三1
│       ├── 2022-09-10-09-56-10.txt
│       └── 2022-09-10-10-00-07.txt
├── database
│   └── paperManageSystem.sqlite
├── lib
│   ├── mysql-connector-java-8.0.29.jar
│   └── sqlite-jdbc-3.7.2.jar
├── out
│   └── production
│       └── GenPaper
│           ├── LoginUIListener.class
│           ├── Main.class
│           ├── TestCode
│           │   ├── TestConnectDatabase.class
│           │   ├── TestCurrentDirectory.class
│           │   ├── TestFileOperate.class
│           │   ├── TestSetDuplicate.class
│           │   └── TestStringSplit.class
│           ├── TestGUI$1.class
│           ├── TestGUI.class
│           └── User.class
└── src
    ├── LoginUIListener.java
    ├── Main.java
    ├── TestCode
    │   ├── TestConnectDatabase.java
    │   ├── TestCurrentDirectory.java
    │   ├── TestFileOperate.java
    │   ├── TestSetDuplicate.java
    │   └── TestStringSplit.java
    ├── TestGUI.java
    └── User.java

该项目中使用的文件夹功能如下:

  • data:用于存储项目运行过程中生成的题目文件,每个用户单独生成一个文件夹。
  • database:用于保存项目运行需要的 sqlite 数据库文件。
  • lib:程序连接数据库需要的驱动包。
  • out:项目创建时自动生成的 out 文件夹。
  • src:存放项目运行需要的 Java 文件。

本项目架构清晰,文件内容完整。

代码结构

主要发挥功能的代码有两个,功能如下:

  • Main.java:实现了整个程序的绝大部分功能。
  • User.java:存储用户相关信息,用于所有信息的处理。

Main.java 中主要的几个函数调用过程如下图所示

Screen Shot 2022-09-14 at 00.13.29

实现的具体功能如下:

  • main:实现打开数据库,登陆,接收命令等功能。
  • generatePro:生成题目的入口,根据 User 的身份调用不同的生成题目函数。
  • generatePriMath:生成小学题目,并调用 ServePro 存储。
  • generateJuMath:生成初中题目,并调用 ServePro 存储。
  • generateSeMath:生成初中题目,并调用 ServePro 存储。
  • ServePro:将题目记录到数据库中,并生成对应的 txt 文件。

核心代码

以小学代码为例,分析出题逻辑,其余两个与之类似。

ArrayList<String> pros = new ArrayList<>();
  Random random = new Random();
  int countNum = 0;
  while (true) {
    if (countNum == num) {
      break;
    }
  int opCount = random.nextInt() % 5 + 1; // 随机操作数数量
  ArrayList<Integer> opNums = new ArrayList<>(); // 随机操作数数值
  for (int i = 0; i < opCount; i++) {
  opNums.add(random.nextInt(100) + 1);
}

生成随机数与操作数的代码如上,首先在程序的开始就将其初始化,程序中直接使用即可。

if (bracketNumber > 0 && random.nextInt(2) == 0) {
  bracketNumber--;
  leftBracketNum++;
  problem.append("(");
  distance = 0;
}
/*...*/
distance++;
if (leftBracketNum > 0 && distance >= 2 && random.nextInt(2) == 0) {
  leftBracketNum--;
  problem.append(")");
}
/*...*/

if (leftBracketNum != 0) {
  for (int i = 0; i < leftBracketNum; i++) {
  problem.append(")");
}

括号的生成逻辑如上部分代码所示,引入 distance 来规范括号的长度,避免括号中只有一个操作数或一个一元表达式的情况出现。

String write = problem.toString();
if (!duplicateCheck(write) && write.length() >= 7) {
  pros.add(write);
  currentUserAllProblems.add(write);
  countNum++;
}
savePro(pros, accN);

题目生成后的处理逻辑如上,将其转为 string 后存储。
在另外两个年级还设计了题目难度的相关代码,这里不再赘述。

运行截图

  • 程序运行
    B09C03B04FC4C163741520751B702218
  • 题目生成
    3426CDEBC5F514AD7D9B1E64927DE322
  • 用户数据库
    473A46F24A76B4ED05F4F51838AE5242
  • 题目数据库
    2B4F336841173135276A3CFE4D641EC6

优点

  1. 使用数据库存储账号以及题目信息,非常高效;同时使用了 sqlite 作为数据库存放在项目文件中,可以很好地实现代码的移植,不收到本地环境的限制。
  2. 在程序开始之前先清空数据库,根据文件中的内容重新加载数据库中的题目数据,这可以避免因为手动删除生成的题目文件而造成数据库与文件中的题目不一致。
  3. 绝大多数变量命名规范,代码格式正确,注释内容恰到好处,并使用英文编写。
  4. 考虑了错误抛出的异常情况,编程习惯良好。

缺点

  1. 文件路径使用了相对传统的相对路径,而非诸如 go 等新兴语言的调用方式。这导致由于 Windows 独有的问题导致文件路径中的 “\\” 在 Linux 等平台上运行的能力存在一定的,可能会发生部分路径冲突,但并不影响在 Windows 平台的整体使用。
  2. 将所有的代码放在同一个类中并设为 static,可读性较差,建议分为多个文件分别实现不同的功能模块,以贴合面向对象的编程思想。
  3. 与上面的优点相关,虽然每次都清空数据库是最可靠的保证数据一致性的方法,但这也不可避免地造成了一定程度上的空间与时间浪费,暂时不清楚是否存在更好的解决办法。
这篇关于结对编程代码互评的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!