个人项目互评——中小学数学卷子自动生成程序(java)

发布时间 2023-09-19 17:39:52作者: uni_早睡小朋友

一、前言

  本次我的结对编程的队友是周之翔同学,在这两天内进行了个人项目的互评。可以感受到同学的代码功底很扎实,用到了比较新的java特性和设计模式,方法不仅简短而且功能完备;思考全面,不仅完美地实现了所有功能,而且还将所有异常情况都考虑在内,并且优化了用户的体验感;逻辑清晰,和我的写的比起来,同学的功能划分更清除,我的框架稍显混乱。

  总的来说,以上的优点也是我有所欠缺的点,通过阅读别人的代码,感受到不同的思考方式和思维模式,让我学到了很多。同时感觉到自己还有很多不足,还需要更加谦虚努力地学习。

 

二、项目功能说明

用户:

  小学、初中和高中数学老师。

功能:

  1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;

  2、登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;

  3、题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复;

  4、在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;

  5、生成的题目将以“年-月-日-时-分-1秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;

 

三、总体分析

整体设计上满足面向对象的设计原则,在功能切换方面还采用了设计模式中的状态模式,总体共16个类:

程序框架大致如图所示:

 

User抽象类,包含用户名、密码、类型,记录了上下文信息;

小学教师PrimarySchoolTeacher、初中教师JuniorSchoolTeacher、高中教师SeniorSchoolTeacher继承User类。

Visit类,包含当前系统状态、当前登录用户、当前卷子类型。

State接口,采用了设计模式中的状态模式,这里的状态可以理解为每个页面模块,共有四个类分别实现该接口,包括初始登录状态InitialState类、在线主页状态OnlineState类、生成题目状态ProducingState类、切换状态TransformState类。每个类分别重写work方法,实现对应的功能,每个状态在进行一些操作后会选择性的跳转为下一状态。

    InitialState类:初始登录状态,用户输入后验证是否正确;

   OnlineState类:登入后的在线主页状态,在该状态下可以选择三种功能;

    * 输入10~30,生成对应数量的类型的题目,跳转到生成题目状态ProducingState;
    * -1,退出登录,跳转到初始登录状态InitialState;
    * 切换为__,切换题型,跳转到切换状态TransformState,
    * 否则不符合上述格式都提示重新输入.

  ProducingState类:生成题目状态,该状态主要生成对应类型的卷子并保存,生成完后跳转到在线主页状态OnlineState。

  TransformState类:切换状态,校验切换的目标值是否属于小学、初中或高中之一, 如果不是就要求重新输入,直到符合为止。反之则切换当前用户的类型,生成完后跳转到在线主页状态OnlineState。

Generator生成器的虚基类, PrimaryGenerator小学试卷生成器、JuniorGenerator初中试卷生成器、SeniorGenerator高中试卷生成器继承Generator,各类生成器都通过执行work函数以实现试卷的生成、查重与保存。

 

四、优缺点分析:

优点:

  1、使用了面向对象的设计原则,包括抽象类和接口,而不直接使用具体类,实现了对象和功能的封装。比如通过不同的生成器类分别实现不同难度试卷的生成,有良好的可拓展性,方便未来添加更多类型的生成器。

  2、设计框架合理,功能清晰。功能设计上借鉴状态模式,实现系统状态的转换和操作有效的分离。每个状态都是一个单独的类,将出题、切换难度、登录等功能作为一个子类,分别实现同一个接口,减少相互依赖,未来想要再添加功能也很方便,有良好的可拓展性。

  3、有很好的封闭性、安全性。能看得出同学有意识的把某些变量或方法设置为对用户不可见的,保障了系统的安全性。

  4、书写规范方面做得很好, 写法都符合谷歌编程规范,可读性好。类与方法的命名也很恰当,都与其功能相关,一目了然。注释简明扼要,包括方法功能说明、参数列表说明,返回类型说明,都非常清楚简洁。函数体短小简洁,最长的也就30行左右,对复杂的功能进行了很好的拆分。

  5、功能完备,文档中的要求都已经实现。不管是用户输入还是执行完功能,都有对应的提示信息,就算用户输入错误也有不同的错误提醒信息,用户体验感很好。

 

缺点:

  状态模式的使用必然会增加系统类和对象的个数,所以类稍微有些多了,数了一下一共16个类,结构与实现都较为复杂,如果使用不当可能导致程序结构和代码的混乱,对于较小的项目可以不必这么复杂。