结对编程总结
模式复用
根据个人项目所实现的出题逻辑,发现生成的题目计算起来相对困难,了解到Python
中内置函数eval()
可以用来实现题目结果的计算,于是结对项目复用时使用了Python
作为编程语言,根据eval
函数计算时的条件,我们使用了math
库作为初高中复杂计算的补充,计算结果的代码如下:
import math
import random
# 定义可以使用的函数及常量
functions = ('e', 'pi', 'sin', 'cos', 'tan', 'sqrt', 'radians')
def calculate(expression):
expression = expression.lower()
# replace函数返回替换后的字符串
expression = expression.replace('%', '/100.0')
expression = expression.replace('^', '**')
expression = expression.replace('mod', '%')
expression = expression.replace('rad', 'radians')
for i in functions:
if i in expression:
expression = expression.replace(i, 'math.{}'.format(i))
try:
return eval(expression)
except ZeroDivisionError:
print('zero can not be division')
except Exception as e:
print(e)
鉴于在个人项目中已经实现了数据库存储和查重,于是使用数据库中已经存在的众多题目作为题库,便于以后题目的增加,以实现更复杂的系统,并且减少了系统的耦合程度。根据数据库的设计的字段先后差异,对数据生成做了以下处理:
-
更换符号
-
原始(美化后的
UniCode
)// 操作符定义 var ( baseOperator = []string{"+", "-", "×", "÷", "()"} juniorOperator = []string{"√", "²"} highOperator = []string{"tan", "sin", "cos"} finalOperator = "=" )
-
现在(
Python eval()
能识别的原始标志)// 操作符定义 var ( baseOperator = []string{"+", "-", "*", "/", "()"} juniorOperator = []string{"sqrt", "^2"} highOperator = []string{"tan", "sin", "cos"} finalOperator = "=" )
-
-
去除了题目之前的空行
进行答案生成时,我们使用了Python
脚本进行自动处理并批量导入,核心代码如下:
with open(filename, 'r') as f:
line = f.readline()
while line:
line = line[:-1]
newline = line.replace("=", "")
result = calculate(newline)
if result:
print(result)
res = int(float(format(result, ".4f")))
tmp = [res]
for _ in range(3):
temp = random.uniform(0.1, 9.9) - 5
if temp == 0:
temp = 0.1
tmp.append(res + temp)
random.shuffle(tmp)
index = tmp.index(res)
通过这样的方式,我们就获得了一个含有一个题目、三个错误答案、一个正确答案、一个正确答案的位置和年级的题目实体。
综上所述,对于个人项目,我们复用了题目的生成逻辑,新增了计算逻辑,但是为了保证用户良好的体验(避免长时间等待)、项目之间的低耦合以及便于以后的拓展,我们实现了类似题库的功能。
结对编程经验
- 我们确定项目为
Web + Server
模式,了解了前后端的通信方式,解决了跨域(CROS
)问题,了解了http
通信的相关定义; - 项目中使用了全局状态管理,前端使用
React-Context
进行用户信息的多组件共享,后端使用Session
进行用户对象的存储,以此来解决登录之后修改自己密码的需求; - 为了开发的便捷和数据库的及时更新,项目的数据库需要进行共享,于是顺便完成了服务器相关知识的学习和掌握。
教训积累
- 由于互联网安全规范的更新,浏览器对
Cookie - Session
状态组件有了更为严格的规范,由于没有及时的了解和关注,导致测试时使用了不同源Cookie
,使得测试失败,这警醒了我们,一定要注意技术栈的更新迭代一定要及时; - 团队协作中沟通十分重要,由于没有及时的沟通,没能及时的解决问题,导致了项目进度的阻塞,在以后的合作中,我们一定会加强有效的沟通。