结对编程——同伴个人项目代码分析
摘要
该博客是基于结对编程同伴小度(杜)同学的个人项目所做的代码分析。
正文
一、项目结构分析

项目中共包含两个文件夹:
-
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()比较方法,比较对象位置好评,这样不会出现空指针异常行为。
总结
通过对该项目的分析,总的来说,小度同学的代码能力是很强的,思维逻辑很清晰,值得我学习。如果能将模块拆分的更加合理,减少代码冗余,那就是锦上添花了。

浙公网安备 33010602011771号