结对编程-如何用精简的java代码写出这个系统
【写在前面】这篇博客是软件工程这门课中要求结对编程。规则是这样的:结对的两个人,分别看对方个人项目代码,2天时间内,分析对方代码优点和缺点。我是来分析凌嘉文同学的代码。
先写一下个人项目中的项目需求,这样大家好理解:
一、项目需求
- 命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;
- 登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;
题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);
在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;
- 生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;
附表-1:账户、密码
|
账户类型 |
账户 |
密码 |
备注 |
|
小学 |
张三1 |
123 |
|
|
张三2 |
123 |
||
|
张三3 |
123 |
||
|
初中 |
李四1 |
123 |
|
|
李四2 |
123 |
||
|
李四3 |
123 |
||
|
高中 |
王五1 |
123 |
|
|
王五2 |
123 |
||
|
王五3 |
123 |
附表-2:小学、初中、高中题目难度要求
|
小学 |
初中 |
高中 |
||
|
难度要求 |
+,-,*./ |
平方,开根号 |
sin,cos,tan |
|
|
备注 |
只能有+,-,*./和() |
题目中至少有一个平方或开根号的运算符 |
题目中至少有一个sin,cos或tan的运算符 |
需求说明:这里可能有些点大家会有歧义,这里做出解释:用户在输入账号、密码后(例如张三1 123,则默认出小学题),先按默认出题。出完题后如果用户切换类型,则还是在该账号下出题。例如我输入张三1 123,则默认出小学题,然后切换为高中,则出高中题,但是最后的txt文档是保存在张三1这个文件夹下的。至于怎么区分高中、初中、小学题,老师后来说,要在用户文件夹下再创建文件夹,他们分别保存高中、初中、小学的题。
二、整体评价:
优点:
1.总体代码量270行(竖大拇指)。
2.思路简洁明了,实现了各个方法之间松耦合,但是方法内部紧耦合的基本要求。
3.变量命名简单易懂,注释写的恰到好处。
缺点:
1.大佬对于加括号的理解有些问题,代码中只有小学能加括号,而且只有一个操作数才加括号,正确的理解是这样的(这个理解已经求证老师了,是正确的):高中式子里可以有括号、根号、平方、+ - * ÷,但是必须要有三角函数,初中里可以有括号、+ - * ÷,但是必须要有根号和平方。
2.在保存文档和读写文档的时候用到的是绝对路径而不是相对路径,这增加了用户找生成文件的难度。
3.考虑到可能会有IO异常的抛出,但是只有throws,并没有相应的处理。
三、具体分析
接下来开始具体分析大佬的代码,以及他的各个功能模块之间的连接方式,由于是别人的代码,所以这里并不放上源代码了。之后我会更新自己的个人项目代码以及详细思路,敬请期待。
首先,他用了这四个方法来具体描述这个项目,它们如下图所示:

方法的作用分别是:
main方法:用户登录,密码验证,调用其他功能方法;
Selectpaper方法:选择题目难度、数量;
PaperOutput方法:试卷生成以及输出至txt文档中;
DuplicateCheck方法:查重功能。
1.main方法实现原理:
1)利用while循环来实现登录功能,如果用户输入的用户名不在username数组中,并且密码不正确,那么就一直执行while循环。
2)当登录成功后,从main方法中调用Selectpaper方法,开始生成试卷。
2.Selectpaper方法实现原理:
1)通过判断用户输入的字符长度,来判断用户是切换为XX,还是继续输入(这点写的很好)。
2)通过while循环,来判断用户输入题目数量是否满足在区间[10,30]中的要求。
3.PaperOutput方法实现原理:
先按常理来判断是否有文件存在,如果没有就新建文件夹,这里用的是绝对路径建的,需要后续迭代改进。然后输出流他是这样写的:

我认为这是一个很好的写法,值得我借鉴学习(因为自己文件输出这块掌握的不是很好)。
有关生成题目,他的思路和我的思路很像,但是更为抽象和简单。大致总结一下:每一个式子都是由连接项和数字构成,其中数字可以带根号、开平方、或者前面加个三角函数,连接项的话就是+ - * ÷ ,所以,只需要根据用户选择的难度,将连接项和数字组合起来就可以了。是不是思路既简单又清晰!为大佬鼓掌!
4.DuplicateCheck方法实现原理:
这个方法就是用来查重的,所以主要就实现一下读取文件和查找就ok了。大佬这里还用了筛选文档类型,这让我眼前一亮:

虽然说因为保存的文档都是txt类型的文档,不存在有其他类型的文档,但是我觉得这种习惯很好,值得学习,让代码健壮性更好。
在查找的时候是用到了indexof方法,这个方法不知道的同学可以去自行百度学习。
四、总结反思
这次看大佬的代码,虽然有功能有些缺陷,但是对我也有了提升。首先传参这块我觉得我就有缺陷,我虽然是声明了成员变量,但是在后面调用方法的时候,我还是选择了传参,所以就显得我的成员变量并没有发挥极致的作用。而且我的思路也有点混乱,代码很冗长,我将三种难度的试卷生成分开写了,这样就不如大佬整合在一起写要好。总的来讲还是自己的抽象和总结能力有待提升。这次编程让我受益匪浅呀。
结对编程-如何用精简的java代码写出这个系统的更多相关文章
- 如何用70行Java代码实现深度神经网络算法
http://www.tuicool.com/articles/MfYjQfV 如何用70行Java代码实现深度神经网络算法 时间 2016-02-18 10:46:17 ITeye 原文 htt ...
- "如何用70行Java代码实现深度神经网络算法" 的delphi版本
http://blog.csdn.net/hustjoyboy/article/details/50721535 "如何用70行Java代码实现深度神经网络算法" 的delphi ...
- [置顶]
如何用PYTHON代码写出音乐
如何用PYTHON代码写出音乐 什么是MIDI 博主本人虽然五音不全,而且唱歌还很难听,但是还是非常喜欢听歌的.我一直在做这样的尝试,就是通过人工智能算法实现机器自动的作词和编曲(在这里预告下,通过深 ...
- JS函数 编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数。
编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数. 任务 第一步: 编写代码完成一个函数的定义吧. 第二步: 我们来补充函数体中的控制语句,完成函数功能吧. 提示: ...
- CSS代码写出的各种形状图形
做网页设计时经常要用到各种形状的图形,对于规则的图形很简单,但是对于不规则的图形,一般我们都是用图片,今天就在这里教大家怎样用css代码写出各种规则不同的图形 1.正方形 #square {width ...
- 教你用CSS代码写出的各种形状图形
做网页设计时经常要用到各种形状的图形,对于规则的图形很简单,但是对于不规则的图形,一般我们都是用图片,今天就在这里教大家怎样用css代码写出各种规则不同的图形 1.正方形 #square {width ...
- 程序员面试京东前端,现场JavaScript代码写出魔方特效
程序员面试京东前端,现场JS代码写出魔方特效,成功搞定20K月薪 今天小编我逛论坛,看到了一位程序员小伙子,因为是有了两年工作经验,然后去京东面试前端岗,一面二面轻松就过了,到了技术面这一块,小伙干脆 ...
- 用最简单的代码写出banner图轮播效果
以下视频是由[赵一鸣随笔]博客提供的“用最简单的代码写出banner图轮播效果”. 查看全屏高清视频,请点击链接:http://www.zymseo.com/58.html
- 只用120行Java代码写一个自己的区块链
区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Java 语言来实现一个简单的区块链,用不到 120 行代码来揭示区 ...
随机推荐
- STL中的BITSET运用
胡小兔的OI博客C++ bitset 常用函数及运算符 对于一个叫做foo的bitset: foo.size() 返回大小(位数) foo.count() 返回1的个数 foo.any() 返回是否有 ...
- 虚拟视点demo
2019年7月16日15:55:11 感觉虚拟视点也是视觉slam里头一个重要的需求和应该实现的功能,但是好像 没看到什么资料. 百度的全景地图,或者有些公司网站上的3d装修效果图,可以用鼠标拖动查看 ...
- BERT中文 添加 early_stop
Step1:建一个hook early_stopping_hook = tf.contrib.estimator.stop_if_no_decrease_hook( estimator=estimat ...
- 7.12T1序列
1.序列 [问题描述] Hzy 得到了一个字符串,这个字符串只有’A’,’G’,’C’,’T’这四种字符,她发现这个 序列中连续 k 个字符可以形成一种新的字符序列,她称这种序列为 Hzy 序列,她现 ...
- Leetcode题目215.数组中的第K个最大元素(中等)
题目描述: 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
- Java 比较两个字符串的相似度算法(Levenshtein Distance)
转载自: https://blog.csdn.net/JavaReact/article/details/82144732 算法简介: Levenshtein Distance,又称编辑距离,指的是两 ...
- docker部署多个mysql容器,并使用java连接
测试springboot多个数据源配置时,需要安装多个mysql容器,由于资源限制,当前只有一台虚拟机,如果在一台机器上安装多个mysql实例,是可以的,但步骤比较繁琐,使用docker来安装MySQ ...
- Django中三种方式写form表单
除了在html中自己手写form表单外,django还可以通过 继承django.forms.Form 或django.forms.ModelForm两个类来自动生成form表单,下面依次利用三种方式 ...
- SRCNN代码分析
代码是作者页面上下载的matlab版.香港中文大学汤晓鸥教授.Learning a Deep Convolutional Network for Image Super-Resolution. htt ...
- easyUI之Messager(消息窗口)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...