关于结对编程队友代码的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)
View Code

注意到随机题目的生成方式很独特,采取了插入的方法,对于1,2,3,4这种序列,随机选取操作符插入到两个数字之间,对于括号来说,选取一个pair来记录左右括号的位置,然后再将括号插入到式子中,同理,初中高中的题目中包含的平方、开方和三角函数也都使用了这种方法,并且保证了每一道初中题目必有平方或者开方,每一道高中题目一定存在三角函数。

同时可以发现,与命令行之间的交互(切换用户类型等行为)也定义在函数当中,在用登录账号选择切换用户类型时,会对其进行提示,体现了对用户的友好性。对于文件流,读写的路径均为相对路径,同时也囊括了查重的功能,对同一个账户下的所有已生成题目,将它们全部转换成一个大的字符串,再进行判断,整体的功能实现较为完整。

 二、代码优缺点分析

接下来为我对于张同学所写代码的优缺点分析:

  优点:

  1.  整个项目代码量不是很大,只有不到300行,给人的第一感觉就是较为简洁明了。
  2.  每一个定义的函数都有文档字符串,解释性很强,一眼能看出来函数的用途,同时函数的封装性很好,在main()函数中只有一些参数的定义,而且只调用了一个signIn()函数。
  3. 文件流路径选取为相对路径,而不是绝对路径,可移植性比较好并且可以直接运行。
  4. 整个程序运行结果对于用户来说比较友好,各种提示都很到位,体验感不错。

  缺点:

  1. 每种类型的函数都存在互相调用的情况,可修改性不是很好,在之后代码扩展的方面可能会存在麻烦。
  2. 变量命名有一些不能直接看懂,代码可读性不是很好。例如:
    tp = rs + '=____' + '\n'
         if tp not in old_info:
               f.write(str(T + 1) + '、' + tp + '\n')
               old_info.append(tp)
               T += 1

     当中的T和tp不是很直观。

  3. 查重功能的耗费太大,不仅需要进行文件读取,还要将读取到的列表全部转换成为一个大的字符串,最后再判断是否存在于这个大字符串当中,每当生成一个随机题目时均需要比较,时间复杂度太高,花销很大。
  4. 整个项目均使用面向过程的方法来实现,基本没有运用到类与对象的知识。

 三、个人总结

 分析完整个项目的代码之后,我个人认为到张同学整个的代码风格给人感觉不是在做项目,而像是在做题一样,尽量使代码简洁完整,可读性不是那么强。不过整个代码的逻辑很清晰,结构很合理,包括交互、函数封装等等,这些都是我做的不是很好,需要向他学习的地方。

posted @ 2021-09-27 23:42  Allision  阅读(61)  评论(0)    收藏  举报