【写在前面】这篇博客是软件工程这门课中要求结对编程。规则是这样的:结对的两个人,分别看对方个人项目代码,2天时间内,分析对方代码优点和缺点。我是来分析凌嘉文同学的代码。

先写一下个人项目中的项目需求,这样大家好理解:

一、项目需求

  1. 命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;
  2. 登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;
  3. 题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);

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

  5. 生成的题目将以“年-月-日-时-分-秒.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代码写出这个系统的更多相关文章

  1. 如何用70行Java代码实现深度神经网络算法

    http://www.tuicool.com/articles/MfYjQfV 如何用70行Java代码实现深度神经网络算法 时间 2016-02-18 10:46:17  ITeye 原文  htt ...

  2. "如何用70行Java代码实现深度神经网络算法" 的delphi版本

     http://blog.csdn.net/hustjoyboy/article/details/50721535 "如何用70行Java代码实现深度神经网络算法" 的delphi ...

  3. [置顶] 如何用PYTHON代码写出音乐

    如何用PYTHON代码写出音乐 什么是MIDI 博主本人虽然五音不全,而且唱歌还很难听,但是还是非常喜欢听歌的.我一直在做这样的尝试,就是通过人工智能算法实现机器自动的作词和编曲(在这里预告下,通过深 ...

  4. JS函数 编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数。

    编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数. 任务 第一步: 编写代码完成一个函数的定义吧. 第二步: 我们来补充函数体中的控制语句,完成函数功能吧. 提示: ...

  5. CSS代码写出的各种形状图形

    做网页设计时经常要用到各种形状的图形,对于规则的图形很简单,但是对于不规则的图形,一般我们都是用图片,今天就在这里教大家怎样用css代码写出各种规则不同的图形 1.正方形 #square {width ...

  6. 教你用CSS代码写出的各种形状图形

    做网页设计时经常要用到各种形状的图形,对于规则的图形很简单,但是对于不规则的图形,一般我们都是用图片,今天就在这里教大家怎样用css代码写出各种规则不同的图形 1.正方形 #square {width ...

  7. 程序员面试京东前端,现场JavaScript代码写出魔方特效

    程序员面试京东前端,现场JS代码写出魔方特效,成功搞定20K月薪 今天小编我逛论坛,看到了一位程序员小伙子,因为是有了两年工作经验,然后去京东面试前端岗,一面二面轻松就过了,到了技术面这一块,小伙干脆 ...

  8. 用最简单的代码写出banner图轮播效果

    以下视频是由[赵一鸣随笔]博客提供的“用最简单的代码写出banner图轮播效果”. 查看全屏高清视频,请点击链接:http://www.zymseo.com/58.html

  9. 只用120行Java代码写一个自己的区块链

    区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Java 语言来实现一个简单的区块链,用不到 120 行代码来揭示区 ...

随机推荐

  1. RabbitMQ的下载与安装

    RabbitMQ的安装注意事项: 1. 系统的管理员账户不能是中文(win8) 2. 计算机名不能是中文(win8) 3. 推荐:使用默认的安装目录 4. 使用的计算机用户必须是管理员 如果安装不成功 ...

  2. HDU 3394 Railway —— (点双联通,记录块信息)

    这题是比较模板的找点双联通并记录的题目. 题意大概是:一个公园有n个景点,1.所有游客都是绕环旅游的,找出所有不在环内的路的条数:2.如果两个环中有重复的边,那么这些边是冲突的,问冲突的边的总数. 分 ...

  3. Difference Between static and default methods in interface

    I was learning through interfaces when I noticed that you can now define static and default methods ...

  4. windos系统下使tomcat按天生成控制台日志catalina.out

    windos系统下的tomcat默认不会记录控制台catalina.out日志,只有访问日志,不便于排错 修改启动文件 1.打开bin下面的startup.bat文件,把 call "%EX ...

  5. LeetCode 200. 岛屿的个数(Number of Islands)

    题目描述 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1 ...

  6. java代理浅述

    代理 代理主要可以分为: 静态代理 JDK自带的动态代理 Cglib 静态代理 静态代理比较简单,简单来说就是不想直接调用被代理类,通过代理类来实现功能.如下就是使用了静态代理 定义接口 public ...

  7. Table 'xxx.hibernate_sequence' doesn't exist

    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'xxx.hibernate_sequence' ...

  8. Linux字符编码默认为UTF-8,如出现乱码可设置为GBK

    Linux字符编码默认为UTF-8,如出现乱码可设置为GBK1.手动更改profile文件的命令: vi /etc/profile 也可以修改 /etc/sysconfig/i18n 文件,如 LAN ...

  9. 京东商城跨域设置Cookie实现SSO单点登陆过程

    可以先看下这边文章:http://blog.chinaunix.net/uid-25508399-id-3431705.html   1.点击首页的登陆按钮跳转到京东的登陆中心https://pass ...

  10. Spring Security登录超时,angular ajax请求出错自动跳转至登录页(jQuery也适用)

    公司开发采用Spring Security+AngualerJS框架,在session过期之后,ajax请求会直接出错.本文介绍如何实现出错情况下自动跳转至登录页. 整体思路是,session过期后, ...