结对编程——同伴个人项目代码分析

摘要

该博客是基于结对编程同伴小度(杜)同学的个人项目所做的代码分析。

正文

一、项目结构分析


项目中共包含两个文件夹:

  • Data:用来放置默认用户信息以及试卷生成结果

    • accounts.txt 放置用户信息
    • 结果文件夹 用来存放试卷
  • generatorframe:用来存放项目代码文件

    • Client.java 客户端程序主类
    • Generator.java 题目生成类
    • Grade.java 枚举类,用来放置用户类型 但个人觉得没有必要😅
    • Teacher.java 教师类

项目结构清晰明了,拆分逻辑合理,但拆分并不完美,导致代码复用性并不是很高。

二、代码规范分析

public class Client {
  private HashMap<String, Teacher> accounts;
  private Teacher currentUser;
  private Grade currentGrade;
  private Generator generator;
  private Scanner in;

代码规范遵从Google代码规范,类命名遵从大驼峰法,变量命名遵从小驼峰法,且均以语义化命名,更直观,易理解。

	  /** 初始化输入、初始化题目生成器 打开 工程文件夹/Data/accounts.txt 读取已存在账户,存入以用户名为索引的 HashMap 中 */
  public void init() throws IOException {
      /** 登录指定用户,登录后自动设置当前用户和当前年级 */
  public void login() throws IOException {
      /** 登录指定用户,登录后自动设置当前用户和当前年级 */
  public void login() throws IOException {
     /**
      * 获取加减乘除以外运算符号的位置
      *
      * @param problemLength 问题的长度,即操作数个数
      * @return 符号的位置列表
      */
  private ArrayList<Integer> signPositions(int problemLength) {

注释简洁到位,对方法及其参数解释明了直观。可见,小度同学平时的代码习惯很好。

三、类分析

public class Teacher {
  private final String name;
  private final Grade grade;
  private final String password;

类中属性默认为private,利用Get和Set方法进行获取和设置,使得代码的灵活性和安全性大大提高。

  private String primaryProblem() {
    StringBuilder problemBuffer = new StringBuilder();
    int length = random.nextInt(4) + 2; // 小学问题操作数个数大于1
    // 确定括号位置,目前最多有一对括号
    int[] brackets = bracketPositions(length);

    // 生成问题,放置操作数及其前后的符号
    for (int i = 0; i < length - 1; i++) {
      if (i == brackets[0]) {
        problemBuffer.append("(");
      }
      problemBuffer.append(random.nextInt(100) + 1);
      if (i == brackets[1]) {
        problemBuffer.append(")");
      }
      problemBuffer.append(signs[random.nextInt(4)]);
    }

对代码重复部分提取方法,通过调用方法实现相同功能的实现,提高了代码的复用性。

      if ("小学".equals(userInfo[2])) {
        grade = Grade.小学;
      } else if ("初中".equals(userInfo[2])) {
        grade = Grade.初中;
      } else if ("高中".equals(userInfo[2])) {
        grade = Grade.高中;
      }

equals()比较方法,比较对象位置好评,这样不会出现空指针异常行为。

总结

通过对该项目的分析,总的来说,小度同学的代码能力是很强的,思维逻辑很清晰,值得我学习。如果能将模块拆分的更加合理,减少代码冗余,那就是锦上添花了。

posted @ 2021-09-28 21:43  半张宣纸画余生  阅读(82)  评论(0)    收藏  举报