概述
从开始看源码之前对exe文件的黑盒测试来看,系统的交互界面美观舒适,提示语贴心到位,完成既定的所有功能。
从工程代码来看,功能封装有序,代码整洁美观,注释恰到好处,不多说,赏心悦目!
代码解读
整个工程被分成三个文件,分别为user.py、formula.py、main.py.
-
user.py
User类:用于描述一个用户的信息
UserManager类:用于管理所有存在的用户(包括当前登录用户)以及用户文件夹
-
formula.py
核心算法模块,包含了用于生成试卷的一系列方法
-
main.py
运行的主文件,主要包含一些用户交互界面的方法,如登录界面,登录后界面等,统筹调用user.py、formula.py中的各种接口
功能测试
-
打开main.exe可执行文件进行功能测试,完美实现所有既定功能!
-
查看文件夹下生成的题库,题目质量肉眼可见的高!
优点
-
黑盒测试
-
交互界面简约而不失美观,提示语贴心到位
-
交互界面容错能力强,各种潦草的输入都能检测到并正常运行
-
-
代码风格
偏向管道-过滤器风格与面向对象风格的异构组合:
-
将整个系统的输入、输出特性简单地理解为各个过滤器功能的合成。通过main.py文件来实现各个过滤器之间的连接,支持功能模块的服用,具有较强的可维护性和可扩展性。
-
将方法按功能封装,以接近人类的思维方式看待世界,将现实中的个体看成对象,对象交互完成目标任务。使软件工程公认的模块化、信息隐藏 、抽象、重用性等原则在面向对象风格下得以充分实现,也使得工程具有稳定、易于修改、易扩充、易维护等优质特性。
-
-
代码编写规范
-
代码缩进、空格等符合python编程风格,整洁美观
-
变量、函数等命名严格遵守课程的代码规范,望文知义
-
各个代码块短小精悍,函数设计功能性强,可重用性高
-
注释简洁合理,既不晦涩难懂也不多余臃肿
代码整体具有非常高的可读性
-
-
核心算法部分
巧妙地借用了归并排序的思想来随机添加括号,很轻松地就解决了如何让括号的个数和位置真正随机的问题。不得不说是匠心独运,让人初见大有惊艳的感觉(算法和本人一样心灵手巧)。
"""用归并的方法添加括号,并且随机生成操作符将式子连接""" def Merge(self, left:list, right:list) -> list: op = self.CreateOP(0) result = str(left[0]) + op + str(right[0]) # 每个表达式随机选择加或不加括号 if random.choice([True, False]): result = '(' + result + ')' return [result] def MergeFml(self, nums:list) -> list: if len(nums) <= 1: return nums mid = len(nums) // 2 left = self.MergeFml(nums[:mid]) right = self.MergeFml(nums[mid:]) return self.Merge(left, right) # 合并
其中[True, False, False]方式的随机处理还可以控制高级操作符出现的概率,使得不会出现多题全是由高级操作符连接而成的高复杂度算式,在随机生成试题的基础上实现试卷难度的可控性。
-
细节部分处理
以最终提交的项目文件为例,代码中体现出来的也就不再详细赘述(总不能贴整个工程代码吧!)
- 提供了用户使用文档readme.txt,用户非常简单就可以了解该工程的使用
- 将项目打包为main.exe可执行文件,方便用户直接使用系统
- code文件夹下存放工程的源码,paper文件夹下存放用户生成的题目
整体上条理非常清晰,和本人一样贴心.
缺点
-
UI交互界面的一些小bug
-
用户登录输入密码时,若在正确密码后添加若干个空格,系统还是可以成功登录
-
在用户登录之后,系统有一个功能是输入“切换为XX”,搭档在此部分的实现逻辑是,如果检测到“切换”两字,就会进入到如下图所示的交互块
用户必须要输入初中、高中、大学其中之一才能切换到原来的交互逻辑而不能自由选择重新登录直接生成题库等操作,可能就用户体验来说有些些不友好。
-
-
对于用户数据的保存
程序是断电不保存的,用户的数据不是保存在文件或者数据库中而是保存在源文件里面,这样程序一关闭之前对账户所进行的操作将不会保留,而是每次都初始化固定的账户数据;我们下一步结对编程中想要改进的地方,就是把用户信息存于数据库中(划重点!!)。
感想
搭档先是花了很长的时间来架构这个系统,撰写需求分析和设计文档,包括需要创建哪些类,封装哪些功能,需要用到的函数及变量名等等,让系统具有了优质的框架。之后只要解决了核心算法(随机生成算式)的问题,一切都是信手拈来。所以我的搭档也就能做到前一天晚上,我问她做了多少她说还没开始写(因为在构思),然后第二天下午我再看就已经基本完成(还没有写查重功能)整个项目的神仙操作。(那是看向神的目光)
无论是代码的编写风格,核心算法的逻辑,还是恰如其分的注释都做到了几近完美的地步,而缺点中提出的UI交互界面的小bug我觉得也已经是吹毛求疵了。
很高兴能够和我的大佬搭档结识并结对编程,如此缜密的规划和高效的执行力着实值得我去慢慢学习,接下来的结对编程和团队编程加油!