关于结对编程队友代码的code review
2021年9月27日,对结对编程队友张同学的个人项目代码进行分析。
首先是很感谢张同学能和我这种蒟蒻组队,自然我也非常期待他个人项目的实现情况。
一、代码功能测试
在拿到张同学的代码之后,按照我自己的个人习惯就会直接先运行一下,发现可以直接在本地运行,然后按照个人项目需求进行比对,也基本上把所有的功能全都实现了。
这份代码均将功能实现在对应的函数中,以小学题目生成为例,其函数实现如下所示:
def lowSchool(user): """ 参数:参数是当前的用户名 返回值:无返回值 功能:为小学用户出题 """ print("当前选择为小学出题") print("如果你要切换模式,请输入1,否则输入0") mode = input() if mode == "1": while True: print("请输入切换为小学,初中或者高中") change_instruction = input() if change_instruction == "切换为小学": lowSchool(user) return elif change_instruction == "切换为初中": midSchool(user) return elif change_instruction == "切换为高中": highSchool(user) return else: print("请输入小学、初中和高中三个选项中的一个") continue elif mode == "0": while True: print("请输入题目数量,数量在10~30之间,若你想退出,输入-1") num = int(input()) if 10 <= num <= 30 or num == -1: break if num == -1: print("已退出,请重新登录") return old_info = [] # old_info存储此文件夹中之前出过的题 cur_path = os.getcwd() + '\\' + user # cur_path存储当前的路径 if not os.path.exists(cur_path): # 如果不存在当前路径的话就创建一个当前路径下的文件夹 os.mkdir(cur_path) files = os.listdir(cur_path) # 获取当前路径下的所有文件名 for x in files: f = open(cur_path + '\\' + x, 'r', encoding='utf-8') lines = f.readlines() for y in lines: if y == '\n': continue else: old_info.append(y[y.find('、') + 1:]) T = 0 my_time = time.strftime("%Y-%m-%d %H-%M-%S", time.localtime()) # 获取当前时间 while T != num: rs = '' op = random.randint(1, 4) # 随机产生操作数 ops1 = [] # 存储操作符 ops2 = [] # 存储操作数 x = random.randint(0, op - 1) # 随机产生左括号下标 y = random.randint(x, op - 1) # 随机产生右括号下标 for i in range(op): ops1.append(operation1[random.randint(0, 3)]) ops2.append(str(random.randint(1, 100))) ops2[x] = '(' + ops2[x] ops2[y] = ops2[y] + ')' for i in range(op): rs += ops2[i] + ops1[i] rs += str(random.randint(1, 100)) path = os.getcwd() + '//' + user if not os.path.exists(path): os.mkdir(path) file = path + '\\' + my_time + '.txt' f = open(file, 'a', encoding='utf-8') tp = rs + '=____' + '\n' if tp not in old_info: f.write(str(T + 1) + '、' + tp + '\n') old_info.append(tp) T += 1 else: continue print("试卷生成完毕......") else: lowSchool(user)
注意到随机题目的生成方式很独特,采取了插入的方法,对于1,2,3,4这种序列,随机选取操作符插入到两个数字之间,对于括号来说,选取一个pair来记录左右括号的位置,然后再将括号插入到式子中,同理,初中高中的题目中包含的平方、开方和三角函数也都使用了这种方法,并且保证了每一道初中题目必有平方或者开方,每一道高中题目一定存在三角函数。
同时可以发现,与命令行之间的交互(切换用户类型等行为)也定义在函数当中,在用登录账号选择切换用户类型时,会对其进行提示,体现了对用户的友好性。对于文件流,读写的路径均为相对路径,同时也囊括了查重的功能,对同一个账户下的所有已生成题目,将它们全部转换成一个大的字符串,再进行判断,整体的功能实现较为完整。
二、代码优缺点分析
接下来为我对于张同学所写代码的优缺点分析:
优点:
- 整个项目代码量不是很大,只有不到300行,给人的第一感觉就是较为简洁明了。
- 每一个定义的函数都有文档字符串,解释性很强,一眼能看出来函数的用途,同时函数的封装性很好,在main()函数中只有一些参数的定义,而且只调用了一个signIn()函数。
- 文件流路径选取为相对路径,而不是绝对路径,可移植性比较好并且可以直接运行。
- 整个程序运行结果对于用户来说比较友好,各种提示都很到位,体验感不错。
缺点:
- 每种类型的函数都存在互相调用的情况,可修改性不是很好,在之后代码扩展的方面可能会存在麻烦。
- 变量命名有一些不能直接看懂,代码可读性不是很好。例如:
tp = rs + '=____' + '\n' if tp not in old_info: f.write(str(T + 1) + '、' + tp + '\n') old_info.append(tp) T += 1当中的T和tp不是很直观。
- 查重功能的耗费太大,不仅需要进行文件读取,还要将读取到的列表全部转换成为一个大的字符串,最后再判断是否存在于这个大字符串当中,每当生成一个随机题目时均需要比较,时间复杂度太高,花销很大。
- 整个项目均使用面向过程的方法来实现,基本没有运用到类与对象的知识。
三、个人总结
分析完整个项目的代码之后,我个人认为到张同学整个的代码风格给人感觉不是在做项目,而像是在做题一样,尽量使代码简洁完整,可读性不是那么强。不过整个代码的逻辑很清晰,结构很合理,包括交互、函数封装等等,这些都是我做的不是很好,需要向他学习的地方。

浙公网安备 33010602011771号