OOP作业第一次总结
前言
对于这三次题目集,个人认为主要考察的是对正则表达式的应用及类与类之间的关系设计,抛开一些***钻的测试点不谈,整体难度不大,题量也不太大。对于这三次作业集的两个难点,一是正则表达式,由于是第一次接触,一些细节可能用的不到位,一些小技巧也不太会用,以及题目并未规定题号之类的信息是否一定是数字,这些原因都造成了正则表达式的冗余。二是对类的设计,由于是第一次用类来设计程序,对类与类之间的关系模糊不清,这会导致代码变得复杂,可读性降低。
设计与分析
第一次作业
由于是第一次作业,所以功能并不复杂,也没有***钻的测试点,类之间的关系也给出了解释。
这里试卷和答卷这两个类,因为答卷里的属性与试卷的属性有多处重复,所以我用答卷继承了试卷。在题目类中加入isTrue方法来判断该题目是否正确,通过调用setAns方法来初始化答卷。print用于打印学生的答题情况,包括每道题的答案、是否正确以及总分。这个方法在后续的作业也不断完善。
第二次作业
第二次作业完善了试卷类,试卷类可以有独立的题目,所以我选择了Map容器来存储题目,可以通过题号来找到题目,以此来封装试卷。输出也增加了总分的计算,一张试卷也可以有多张答卷,这时答卷类和试卷类的关系变得不太紧密,所以我没有选择用继承。
这次的作业因为设计到了多张试卷答卷的情况,所以使用了大量的集合来存储信息,在试卷类中也采用了集合来封装问题。
关于空格问题,学习java的时间也长了,使用了trim这个方法来去空格,同时对链式表达也更加熟练,这也简化了代码。同时Map容器的使用也减少了很多工作量。
第三次作业
这次作业的测试点来到了28个,这里的槽点下面谈,先来谈谈类的设计。这次作业增加了学生的学号和姓名和删除题目这一功能还有错误格式判断,同时完善了答卷类的细节。这里我加了一个学生类使it成为答卷类的爸爸。这里的学生类成员属性都较为简单(感觉是为后面埋坑)。同时为题目类增加了一个属性以此来判断题目是否被删除。
答卷类采用集合储存了答卷的答案信息和题号,通过题号来搜索试卷的题目以此来判分。因为是按题目顺序输出,使用用List来存储各题得分。
踩坑与心得
我已经迫不及待的想要吐槽第三次作业了(ノ`Д)ノ(bushi
第三次作业的坑点
一个一个来(我能写一千个字)
首先就是总分的计算,这次的测试点好像没涉及,但谁也不知道你是不是这里出问题了。这里有两个地方没表述清楚,一是关于被删除题目要不要算进题目中,二是不存在的题目要不要算进总分内。经过我的枚举,发现总分不管怎么算都对测试点没有任何影响。
第二个就是试卷中的题目如果在答卷后面出现,这是算题目不存在还是能取到这个题目,这里题目没有明确给出。
第三个就是测试点,首先这个测试点的解释说明可以说是如有。就单空白卷来说,题目中并没有给出空白卷改如何输出,以及什么是空白卷,是#S:呢还是#S:1呢还是#S:1后面要跟学号呢?又或者是试卷没有题目?然后就是答案为空字符,这就更迷糊了,是哪里的答案为空呢,题目的答案为空还是试卷的答案为空?答案为空字符不就是答案为空吗?答案为空不就是answer is null?为什么还要输出题目~~呢???没有任何信息指向答案为空字符≠answer is null。不等式秒了?!还有就是23,24,25,26这四个测试点好像后面是改过的,不然我也不会对。还有一个地方就是这里
如果是空白卷的话,那么应该不会有#A:,这就不符合格式要求了,理应输出格式错误的。
以上这些我觉得算不上坑点,应该是表意不清,唯一坑的地方也就是答卷类的是序号而不是题号,当时没仔细看,导致首次提交爆了好多测试点。
第二次作业
第二次由于眼瞎,把不等于错认成了小于,调了一个小时发现题看错了〒▽〒。
第一次作业
这个没什么好讲的,毕竟是第一次作业,难度不大,且时间有点久,题也不太难,对题目没什么印象了,好像也没啥问题。
谈谈心得
前两次作业都没遇到什么阻碍,唯一的问题就看错了题。而第三次的作业的难度也上了一个档次,在和同学的交流中也摸清楚了几个测试点的样例,但这不代表你能通过这个测试点,这一点更深层的原因是就是对特殊情况的考虑不够全面。所为是知其一者但不知其二者多矣。
改进与建议
作业的迭代意味着代码的增长,由于输入的信息越来越复杂,要求也越来越多,在写入这一块的内容也越写越多,main方法变得冗余。老师课上提及的工具类是一个不错的建议,把对题目的输入封装到一个类中来减小main方法的代码量,减少代码的重复,提高复用率。
二就是对正则表达式进行迭代,增加其可读性,通过使用特殊字符来限制查找范围。
三就是封装,封装继承和多态是面向对象的三个重要原则,作业题量的增加,导致使用封装会更加繁复,所以我并没用对数据进行私有化,这也是需要改进的一个点。
总结
这三次作业的训练,让我对正则表达式有了更深刻的理解,尤其是第三次作业加入了对格式正确与否的判断,对正则表达式的特殊符号,如$,^这些来限制格式的规范。同时对面向对象的程序设计也有了更好的理解,类与类之间各自独立又相互关联。这三次作业是开头,面向对象编程也才刚刚开始,还有许多OOP编程的原则未使用上,如继承,接口,抽象类,还有各种设计模式,如单例模式等,这些在前三次作业中并没有表现出来,这也意味着后续的作业还有更多提升空间和发展,难度也会越来越大,也代表着学习的步伐更不能停下来。(当然o((>ω< ))o,还是希望后续作业个样例能多一些,一些特殊情况稍微提示一些怎么输出,就如上面提到的那样,模棱两可这种多给点提示吧qwq)