结对编程-如何用精简的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 行代码来揭示区 ...
随机推荐
- 转载像元素周期表一样的html5的标签图集
转载请注明出处. HTML5标签集合
- Sqlite3错误:Recursive use of cursors not allowed 的解决方案
感悟] 写完这篇日志后,有调了一段时间程序,又有了一点心得分享下: 一)爬稳定的数(dong)据(xi)最好存储下来,特别是数据库在国外的那种,下载时间成本太高昂了,存起来再处理,会节约很多时间: 二 ...
- 判定Java程序员等级,HashMap就够了
JDK1.8 HashMap源码分析 用到的符号: ^异运算:两个操作数相同,结果是;两个操作数不同,结果是1. &按位与:两个操作数都是1,结果才是1. 一.HashMap概述 在JDK1 ...
- shell 拾遗
1, 按照行读取文件 while read line do echo ${line} done < ${filename} 2.循环中使用命令输出 while read line do echo ...
- PHP环境搭建之单独安装
还在使用PHP集成环境吗?教你自定义搭建配置PHP开发环境,按照需求进行安装,安装的版本可以自己选择,灵活性更大. 目录:1. 安装Apache2. 安装PHP3. 安装MySQL4. 安装Compo ...
- JVM | JVM的核心技术
说到JVM,很多工作多年的老铁,可能就有点发憷了,因为搬砖多年,一直使用java这个工具,对于JVM没有了解过,有句话面试造航母,上班拧螺丝,要啥自行车啊,知道如何搬砖就可以了,为啥要懂这么多,如果你 ...
- Mysql查询某字段重复值并删除重复值
1.查询重复值: select code,count(*) as count from hospital group by code having count>1; 该语句查询code重复值大于 ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-1.SpringBoot整合微信支付开发在线教育视频站点介绍
笔记 第一章项目介绍和前期准备 1.SpringBoot整合微信支付开发在线教育视频站点介绍 简介: 课程介绍,和小D课堂在线教育项目搭建开发 1.课程大纲介绍 2.微信支付项 ...
- list中包含多个相同值时,List中的indexOf(Object o)方法的返回值
查一下Java API,List下的indexOf(Object o)方法的返回值为list列表中首个元素出现位置的索引,找不到时返回-1
- Spring-Kafka —— 消费如何达到最高的吞吐量
首先简单的介绍一下消费者对topic的订阅.客户端的消费者订阅了topic后,如果是单个消费者,那么消费者会顺序消费这些topic分区中的数据,如果是创建了消费组有多个消费者,那么kafak的服务端将 ...