OOP大作业二轮总结

第二轮下来最大的体会是自己的代码相较之前精炼了很多,从第四次作业开始注重了遵循单一职责原则。在做需求分析这方面也花了更多心思以更好地面对之后的迭代。
关于OOP中的单一职责:
前一轮大作业我把用到的方法全部堆在了主函数里,一个主函数能有四五百行。这次学会了用“代理者”Agent,主函数只负责输入和输出,代码可读性大大增加了。做题前要确认好类间关系以及各种属性应该安排在哪个类中。

三次作业的bug分析:

第四次大作业:
1.没有设置一个学生类,导致多个学生作答的情况的测试点只过一两个;(果然还是需求分析这方面没做好= =)
2.多人多试卷乱序输入时逻辑过于混乱导致输出也是完全错的
3.删除已经储存的信息后会出错(没有用List类而用的普通的数组)
第五次大作业:
1.最初没考虑档位上下限,做出了一个能无限升档和降档的调速器= =
第六次大作业:
1.输出的某个数据的格式不符合要求(但是结果提示的是答案错误不是格式错误害得我改了三个多小时没发现是格式错误555)
2.最初的需求分析没做好,没有做到普遍性
对bug的总结:
1.在做需求分析的时候一定要全面考虑,要追求普遍情况而非特殊情况,比如第四次作业潜意识认为只有一个学生,多个学生的情况完全没有办法。
2.不能疏忽题目要求,在代码没有逻辑错误和算术错误的情况下最应该先检查数据输出格式。
3.每一个类有什么限制都要了解清楚,不然真的贻笑大方了(我那档位爆炸的调速器)

下面是每次大作业的具体分析:

第四次大作业:

第四次大作业仍然是答题判题程序,通过增加题目种类(多选题,单选题,填空题)以考察继承与多态的学习成果。
SourceMonitor给到的代码分析:

从代码行数也能看出MatcherAndSeparation是比较关键的类,起到了一个代理的作用,最主要的逻辑也是写在其中。
类图:

踩坑心得

在写完多选题类后跑程序发现得到的答案都是正确的,但是一分没拿到,改了很久才发现是题目输入样例自带了个空格在答案后面,输出时我把那个空格一并输出了导致格式错误。很多时候在答案正确情况下最应该先检查格式问题。

改进建议

程序里同时存在一个抽象类Question和一个Question应该是当时我想把储存好的三种题型再总和到一起,但类图显示抽象类Question和Question两者之间没有联系,现在想想做成继承关系的话也能省不少代码了= =

第五、六次大作业:

第五次比较简单,就和迭代后的第六次放一起分析了
第六次大作业的代码分析:

主要方法放在了Agent函数里,写了四百多行,已经是优化了一遍后的行数了,问了下身边同学的总行数和我差不多,都是九百多行。
类图:

在第五次作业的串联电路基础上增加了并联电路的实现。

踩坑心得:

一开始思维没有打开,下意识认为题目就是局限在只有两条支路的并联电路,于是写的情况也是针对只有两条支路的情况,写的代码行数很多拿到的分却很少。后来全部重写了一遍,做成普遍情况后有n条电路都没问题。
总体还是偏简单的,但我卡壳了几个小时,最后是找了好几个大佬互测了一下才发现自己是数据格式输出错误,编译器写的是正确的格式,pta上的是错误的版本,导致我把其他人给的样例过了一遍发现计算结果都没问题还是没拿到分。
改正后36个测试点还有6个没过,但和其他人交流时发现即使是满分代码也有bug,比如断路情况下电路中的电器仍然能工作,所以这几个测试点一时半会真不知道到底是什么问题。

改进建议:

Agent函数里重复的代码太多了,几乎全是同样的for循环,如果把重复的地方单独做成一个方法类的话能让代码精简很多。

二轮下来的总结

最大的缺点是代码中仍旧出现了很多的if语句和for循环(说人话其实就是垃圾代码),诸如此类:

if (arr.startsWith("#N:")) {if(arr.matches("#N:[0-9]+[ ]#Q:.+[ ]#A:.*")){String[] a = arr.split(" * #A: *| * #Q:*|#N:");if(a.length == 3){single[Integer.parseInt(a[1])] = new SingleKind(Integer.parseInt(a[1]), a[2].trim(), "","s");}else {String answer = a[3].replaceAll("\\s+$","");single[Integer.parseInt(a[1])] = new SingleKind(Integer.parseInt(a[1]), a[2].trim(), answer.trim(),"s");}}else {System.out.println("wrong format:" + arr);}}else if (arr.startsWith("#K:")) {if(arr.matches("#K:[0-9]+[ ]#Q:.+[ ]#A:.*")){String[] a = arr.split(" * #A: *| * #Q:*|#K:");if(a.length == 3){fillblank[Integer.parseInt(a[1])] = new FillblankKind(Integer.parseInt(a[1]), a[2].trim(), "","f");}else {String answer = a[3].replaceAll("\\s+$","");fillblank[Integer.parseInt(a[1])] = new FillblankKind(Integer.parseInt(a[1]), a[2].trim(), answer.trim(),"f");}}else {System.out.println("wrong format:" + arr);}}else if (arr.startsWith("#Z:")) {if(arr.matches("#Z:[0-9]+[ ]#Q:.+[ ]#A:.*")){String[] a = arr.split(" * #A: *| * #Q:*|#Z:");if(a.length == 3){multiple[Integer.parseInt(a[1])] = new MultipleKind(Integer.parseInt(a[1]), a[2].trim(), "","m");}else {String answer = a[3].replaceAll("\\s+$","");multiple[Integer.parseInt(a[1])] = new MultipleKind(Integer.parseInt(a[1]), a[2].trim(), answer,"m");}}else {System.out.println("wrong format:" + arr);}} else if (arr.startsWith("#T:")) {if(arr.matches("#T:[0-9]+([ ][0-9]+[-][0-9]+)*")){t++;int g = 1;String[] a = arr.split("\\s+|-+|#T:");paper[Integer.parseInt(a[1])] = new TestPaper(Integer.parseInt(a[1]), (a.length - 2) / 2);for (int j = 0; j < a.length - 2; j += 2) {paper[(Integer.parseInt(a[1]))].setStandardGrade(g, Integer.parseInt(a[3 + j]));g++;}for (int j = 1, m = 2; j <= (a.length - 2) / 2; j += 1, m += 2) {paper[(Integer.parseInt(a[1]))].saveQuestionNum( j, Integer.parseInt(a[m]));}}else {System.out.println("wrong format:" + arr);}}else if (arr.startsWith("#S:")) {if(arr.matches("#S:\\d+ \\d+( #A:\\d+-.*)*")){ans++;int num = 0;String[] a = arr.split(" *#S:*| *#A:*|[-]+");if(a.length % 2 == 0) {String[] a2 = a[1].split(" ");this.answer[ans] = new AnswerPaper(Integer.parseInt(a2[0]), a2[1], (a.length - 2) / 2);for (int i = 1, j = 3; j <= a.length; i++, j += 2) {if(Character.isWhitespace(a[j].charAt(a[j].length()-1))) {answer[ans].setStudentAnswer(i, a[j].substring(0, a[j].length() - 1));}else {answer[ans].setStudentAnswer(i, a[j]);}}}else{String[] a2 = a[1].split(" ");this.answer[ans]=new AnswerPaper(Integer.parseInt(a2[0]), a2[1], (a.length - 1) / 2);for (int i = 1, j = 3; j <= a.length - 2; i++, j += 2) {if(Character.isWhitespace(a[j].charAt(a[j].length()-1))) {answer[ans].setStudentAnswer(i, a[j].substring(0, a[j].length() - 1));}else {answer[ans].setStudentAnswer(i, a[j]);}num = i;}num += 1;answer[ans].setStudentAnswer(num, "");}for (int i = 1, j = 2; j < a.length; i++, j+=2) {answer[ans].setStudentQuestion(i, Integer.parseInt(a[j]));}}else {System.out.println("wrong format:" + arr);}}  else if (arr.startsWith("#X:")) {if(arr.matches("#X:[0-9]+([ ]\\w+[-][0-9]+)*[ ]\\w+")){String[] a = arr.split("\\s+|-+|#X:");for (int j = 1, m = 2; j <= (a.length - 1) / 2+1; j += 2, m += 2) {this.students.put(a[j], a[m]);stu++;}}else {System.out.println("wrong format:" + arr);}} else if (arr.startsWith("#D:N-")) {if(arr.matches("#D:N-[0-9]+")){String[] a = arr.split("#D:N-");int questionNum = Integer.parseInt(a[1]);this.deletedQuestions.add(questionNum);single[questionNum] = new SingleKind(questionNum, null, null,"s");multiple[questionNum] = new MultipleKind(questionNum, null, null,"m");fillblank[questionNum] = new FillblankKind(questionNum, null, null,"f");}else {System.out.println("wrong format:" + arr);}} else {System.out.println("wrong format:" + arr);}int k=1;for(k=1;k<100;k++) {if(single[k]!=null) {question[k]=new Question(single[k].getQuestionNum(),single[k].getQuestionContent(),single[k].getStandAnswer(),"s");}if(multiple[k]!=null) {question[k]=new Question(multiple[k].getQuestionNum(),multiple[k].getQuestionContent(),multiple[k].getStandAnswer(),"m");}if(fillblank[k]!=null) {question[k]=new Question(fillblank[k].getQuestionNum(),fillblank[k].getQuestionContent(),fillblank[k].getStandAnswer(),"f");}}
}
缺点

学到的各种模式没使用过,为了在一周时间内边上课边写大作业于是只敢在“舒适圈”中用些自己比较习惯的写法,希望自己在之后空闲下来的时间去钻研和掌握课上学到的模式。

进步

在分析类间关系上更熟练了,继承和多态的使用和遵循了单一职责也使得未来迭代后不需要花太多时间去修改。在这方面也有实验的功劳,我在实验上花了不少心思后对做需求分析和设计类间关系上更加有方向了。还有就是对List类有了更多的了解,用起来很方便,之前一直用普通数组解决问题导致几乎无法增删情况。

未来展望:

多啃啃Java课本,学会更多方法有助于优化代码,和身边同学交流一下看看他们用的哪些好用迅速的方法还是很有必要的。要敢于去沟通交流互测代码才能及时发现自己的错误。要多多享受这种查缺补漏的过程。在大作业适当降低难度后我也能更快完成作业,空闲的时间也多了出来,对OOP的热情也是保持了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/722289.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6.9找回机制接口安全验证码token接口

响应包response burp截取拦截,改相应包; 思路:此处应该若是修改密码,先抓到修改成功数据包(截取验证关键字),在替换为需要绕过的数据包,截取response数据包,修改验证成功关键字达到绕过效果; 1.发送验证码 2.验证 3.重制密码 1-3跳过2; 短信轰炸 实例接口调用发包;…

运筹学练习Python精解——图与网络

练习1 北京(Pe)、东京(T)、纽约(N)、墨西哥(M)、伦敦(L)、巴黎(Pa)各城市之间的航线距离如下表所示。从北京(Pe)乘飞机到东京(T)、纽约(N)、墨西哥城(M)、伦敦(L)、巴黎(Pa)五城市做旅游,每城市恰去一次再返回北京,应如何安排旅游线,使旅程最短?L M N Pa Pe TL 0 56 35 2…

Win11系统下的MindSpore环境搭建

本文介绍了一个在Win11系统下,通过WSL2+Docker+VSCode的方案搭建了一个mindspore-gpu的编程环境。这种方案既可以实现Linux系统编程以及部署的便捷性,又可以兼顾Windows系统强大的办公软件生态,甚至还可以借助Docker达到一定的软件可迁移性和可复制性。技术背景 笔者尝试过不…

JSON文件存储

JSON 文件存储JSON,全称为 JavaScript Object Notation, 也就是 JavaScript 对象标记,通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。对象和数组在 JavaScript 语言中,一切皆为对象。因此任何支持的类型都可以通过 JSON 来表…

关于类、继承、接口的复习(1)

均使用这个层次结构:多态:一个对象变量可以指示多种实际类型 动态绑定:一个对象变量在运行时能够自动选择适合的方法 注:对象变量是一种“引用”,引用不同块对象的内存,“指示多种实际类型”就是一个对象变量可以在不同情况下引用了多种有继承关系的类型,规则是——对象…

OO题目集4~6总结

OO题目集4~6总结 ​ 在之后的几次题目集的7-1题目中,难度渐渐高了起来,第四次题目集主要是在第三次题目集的基础上添加了一些功能,而之后的两次则是设计一个新的程序,是关于电路设备及电路的,与之前的答题程序不同,新的题目对于创新和思考能力以及思维逻辑能力要求更…

南昌航空大学软件学院-23201930-刘靖辉-第二次blog作业

1. 前言 2. 设计与分析2.1 OOP-4:答题判题程序12.1.1 题目2.1.2 源码2.1.3 评价与分析2.1.4 踩坑心得2.1.5 改进建议2.2 OOP-5:答题判题程序22.2.1 题目2.2.2 源码2.2.3 评价与分析2.2.4 踩坑心得2.2.5 改进建议2.3 OOP-6:答题判题程序32.3.1 题目2.3.2 源码2.3.3 评价与分析…

跟思兼学Klipper(30):使用辅助宏调整3D打印机无感归位堵转检测阈值

又名《调整堵转检测阈值降低创想三维 K1C 打印机无感归位啪啪声》 前言 原创文章,转载引用务必著名链接,水平有限,如有疏漏,欢迎指正交流。 文章如有更新请访问 DFRobot 社区及 cnblogs 博客园,前者内容较全,后者排版及阅读体验更佳。 手中的创想三维 K1C 3D 打印机目前使…

分组排名

问题:按A列数据分组降序排名函数公式解决:=MATCH(C2,SORT(FILTER(C$2:C$20,A$2:A$20=A2),,-1),)Filter部分提取相同配货仓的销售金额 Sort部分将同组内销售金额降序排序 Match部分查找每个值在降序排序后数据中的位置,相当于获取排名