Java教程

结对编程总结

本文主要是介绍结对编程总结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

结对编程总结

模式复用

根据个人项目所实现的出题逻辑,发现生成的题目计算起来相对困难,了解到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)

鉴于在个人项目中已经实现了数据库存储和查重,于是使用数据库中已经存在的众多题目作为题库,便于以后题目的增加,以实现更复杂的系统,并且减少了系统的耦合程度。根据数据库的设计的字段先后差异,对数据生成做了以下处理:

  1. 更换符号

    • 原始(美化后的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  = "="
      )
      
  2. 去除了题目之前的空行

进行答案生成时,我们使用了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)

通过这样的方式,我们就获得了一个含有一个题目、三个错误答案、一个正确答案、一个正确答案的位置和年级的题目实体。

综上所述,对于个人项目,我们复用了题目的生成逻辑,新增了计算逻辑,但是为了保证用户良好的体验(避免长时间等待)、项目之间的低耦合以及便于以后的拓展,我们实现了类似题库的功能。

结对编程经验

  1. 我们确定项目为Web + Server模式,了解了前后端的通信方式,解决了跨域(CROS)问题,了解了http通信的相关定义;
  2. 项目中使用了全局状态管理,前端使用React-Context进行用户信息的多组件共享,后端使用Session进行用户对象的存储,以此来解决登录之后修改自己密码的需求;
  3. 为了开发的便捷和数据库的及时更新,项目的数据库需要进行共享,于是顺便完成了服务器相关知识的学习和掌握。

教训积累

  1. 由于互联网安全规范的更新,浏览器对Cookie - Session状态组件有了更为严格的规范,由于没有及时的了解和关注,导致测试时使用了不同源Cookie,使得测试失败,这警醒了我们,一定要注意技术栈的更新迭代一定要及时;
  2. 团队协作中沟通十分重要,由于没有及时的沟通,没能及时的解决问题,导致了项目进度的阻塞,在以后的合作中,我们一定会加强有效的沟通。
这篇关于结对编程总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!