重生之我在男航学Java-1

news/发布时间2024/5/18 12:19:09

一、前言

  • 第一次题目集主要是让我们熟悉对类的使用和对单一职责的理解,由于给出了设计建议,并且内部给出了具体的设计分析,第一次PTA的题量大但是难度并不是很大,虽然老师说了可以使用正则表达式,但我由于自身的懒惰附加c语言面向过程的思想根深蒂固,我在第一次PTA中并未使用正则表达式,导致我使用split函数后进行if判断实际上并未真正意义上的实现面向对象编程,而是仍然在面向过程编程,我对此深感惭愧......

  • 第二次的题目集在第一次的题目集的基础上减少了题量,但是增加了新的试卷与答卷类,导致我不得不去学习并在其中使用正则表达式。但是仍然存在面向过程编程的思想,导致我即使过完了所有样例也无法取得满分,类之间也没有符合单一职责的原则,类和类之间的耦合性极高。为我第三次PTA的失败埋下祸根......

  • 第三次PTA不出意外的难度很大,虽然在第二次的基础上再次减少了题量,但是由于我对于整体框架的把控出现了的问题,以及对问题的分析出现了缺陷,使得我写了大半的代码不得已进行重构,但在第二次重写的过程中在正则表达式的使用上出现了逻辑上的错误导致并没有提取到我想要的内容,使得我反复加强了类与类之间的耦合性,导致在最后的时候我的代码牵一发而动全身,代码的复用性极差,代码也未符合开闭原则,对此我做出深深的自我检讨......

  • 综上,其实前三次的题量并不是很大,但是主要考察我们对类与类之间关系的理解,以及在设计时是否满足了面向对向设计的原则,否则每一次PTA都意味着重新设计设计一次代码,以及由于c语言留下的坏习惯,喜欢边写边过样例,而这在面向对象的编程中显然使行不通的,面向对象原则上就是对整体框架的把握以及对类间关系的设计,我在接下拉的PTA中一定会将实践与duan老师所讲的思想融会贯通,做到“知行合一”!

二、设计与分析:

  • 答题判题程序-1

  • 从这张类图可以看出我的类虽然按照设计建议定义了3个类,但是真正起作用的只有Paper和Topic类,其中Main类的实现如下:

  • 从Main类不难看出我的设计存在严重缺陷,代码的复用效果极差,因为采用的使if的多次判断以及使用split对其进行分割,并未将面向对象的思想融入其中反而延续了c语言面向过程的思想,并且其中类也没有严格按照单一职责原则进行设计。使得我即使在题目集一中拿取了较高的分数,但在第二次题目集中仍需对代码进行重构,加大自己的工作量,踩了没必要踩的坑,正如duan老师所言,有的坑踩了也没什么收获,只是让我多浪费了一些时间罢了。

  • 答题判题程序-2

  • 从这张图中,我们可以看到由于第二次新增了试卷信息导致我的代码不得不进行重构,由此体现了我的第一次代码存在的极大问题,以及对开闭原则的完全忽视,但在第二次题目集中,我仍然存在单一职责设计存在缺陷,三个了类之间的耦合性极强,Paper类中同时使用了Topic类和Answer类,最后通过Main类来进行实现,因为对正则表达式解析的忽视,应该对正则表达式再进行一个类的设计,专门来进行正则表达式的解析,使得我的代码即使过了全部样例仍然存在一定的缺陷,例如:题目空格过多时正则表达式的解析错误。当然,最主要还是因为我一边写程序一边过样例的坏习惯使得我的代码的复用性极差,一旦迭代就要进行重构。其中Main类的实现如下:

  • 再Main类中不难看出我在Main类中实现了大量的方法,其中包括但不限于结果的打印以及对正则表达式的判断,面向过程编程的结果就是我在第三次题目集中难以对代码进行优化,需要代码再次重构,以及我对单一职责的理解仍然不够深刻,难以运用其中。
  • 答题判题程序-3

  • 在这第三次题目中,由于前面造的孽,导致我第三次写的代码仍需重构,这次我专门使用了Print类来进行对结果的打印以及Judge类来对题目的对错进行判断,但由于对总分的设计存在缺陷使得我在Print类中去实现对总分的计算,大大增加了Print类与Paper类的耦合性,其次由于缺少对正则表达式专门解析的类使得我仍Main中使用了对其进行split分割和if判断的处理,其中Main类的实现如下:

  • 其中Main主要就是实现了对正则表达式的解析,但由于解释式存在一定的逻辑错误使得我在过样例时出现了无法识别格式错误的问题,此外Print类中实现了本应该由其他类实现的大量方法,究其原因是因为我对结构的把控实在太弱,导致我的方法不得不改变位置,其中Print类的实现如下:

  • 在Print类中实现了本应该由Judge类实现的方法,同时由于结果的优先性考虑出现了问题是使得我的Print类中的方法使用了多次if来进行判断。

  • 综上,在最开始的时候只是单纯的用Topic[]来存储Topic,由于第二次增加了试卷类和答卷类,开始考虑对试卷类和答卷类也进行Paper[]和Answer[]的存储,这就导致我第二次出现了无法匹配试卷和答卷的情况,于是在第三次的数据存储中选择使用 HashMap<Integer,Topic>,HashMap<Integer,Paper>,HashMap<Integer,Answer>方便我对试卷和答卷的匹配以及试卷和题目的匹配。

三、采坑心得:

  • 答题判题程序-1

  • 其中的非零返回是由于正则表达式使用过程中出现了多个空格,我的正则表达式却没有对应的匹配模式导致group捕获失败而造成的非零返回

  • 修改之前的正则表达式如下:

  • 修改之后的正则表达式如下:

  • 修改之后的得分如下:

  • 答题判题程序-2

  • 由于最开始是一边过样例一边进行的编程的书写,从而导致自己忘记了要对答卷和题卷进行匹配。

  • 更改后如下:

  • 增加的对答卷和题卷的匹配如下:

  • 答题判题程序-3

  • 从类图来观察不难看出我的第三次设计结构框架存在很大的问题,导致了我最后前面忘记了对正则表达式的逻辑错误进行更改,由于类与类之间的耦合性实在太强,导致我对此错误不知如何下手,可谓是牵一发而动全身体啊,呜呜呜~~~~

  • 由于我在判断答案是否存在之前就对题目进行了删除,导致了在判断题目是否存在之前就对其进行了删除,而题目不存在的优先级高于题目被删除,我对此进行了以下修改:

  • 我在对Judge类进行初始化时对topicHashMap进行了clone,这样即使他被删掉了一个题目,我也可以通过clone出来的topicHashMap1结合if语句对优先级进行判断

四、改进建议:对相应题目的编码改进给出自己的见解,做到可持续改进

  • 答题判题程序-1

  • 对此处正则表达式的设计专门用一个类来进行处理,使得其更符合开闭原则

  • 答题判题程序-2

  • 把以上对答卷总分的判定,题卷是否为空,以及对答卷和题卷的匹配全部写入一个Judge类中,避免在Main类中实现过多的方法

  • 答题判题程序-3

  • 对答案的判断将其结果专门存入答卷的一个列表中,避免对if/else的重复使用而导致代码的冗杂

  • 对学生判断是否存在的方法放入Judge类中,遵守单一职责原则,避免Print类中存在太多的其它方法而违背此原则

  • 将该正则表达式进行更改使其匹配时将#Q也匹配进去,便于后续对于题目格式问题的判断,否则在我框架出现大问题的前提下无法通过样例而得不到分,呜呜呜~~~

五、总结

1.对于正则表达式的学习

  • 处于题目的需要,使我不得不进行对于正则表达式的学习,通过对正则表达式的学习,让我能够更加高效的处理特殊的字符串,同时提高了自己的自主学习能力,边学边用,使我对正则表达式的熟练度迅速提升。

2.面向对象的设计原则

  • 前面的学习使我认识到了面向对象设计原则对代码的重要性,它提高了代码的复用性以及可扩展性,虽然我在实际写题目的过程中对其的使用糊里糊涂,但三次题目我重构了三次代码让我意识到了面向对象原则积极遵守的好处,我在后面的题目集中一定仔细审题,合理的对类进行设计,好的设计往往能够减少自己的工作量。

3.对于整体的设计问题

  • 在第三次题目集中我延续了前俩次的边过样例边写题的不良习惯,使得我的类与类之间的耦合性极强,同时还出现了相当多的逻辑错误,对方法先后调用顺序的思考,导致了我第三次PTA甚至连样例都无法全部通过,其中对数据存贮的问题也是先后更改了多次,下次在写之前我一定要将整体的大框架通过PdShell先搭建出来,避免再出现和这次一样初次严重的错误。

4.其它(此处为一些个人感概,老师或助教可以考虑对其跳过)

  • a.对于最后一道题的分数设置我觉得未免有些太过高,使得如果最后一道题不做好的话就会导致PTA的分数很难看,对学生而言是一种打击,但换个方式来说,其实也是对学生的一种激励手段,但我还是恳请cai老师手下留情,呜呜呜~~~

  • b.对于面向对象设计这门课,我觉得完全可以直接放在大一上学期进行学习,c语言面向过程编程的思想使我(不知还有多少人...)陷入了先入为主的思想危机,导致在最开始写题目时老是会使用面向过程的思想进行面向对象的设计,使得即使做出来题目也仅仅是为了得分,而不是真正意义上的学会面向对象的设计和思想,此外,我校软件工程专业主流的语言是Java,我觉得c语言的学习完全没有必要(也不是完全意义上的没必要,只是感觉现在根本用不到了),我了解一些学校是从大一上学期就直接学习Java不学习c语言的同专业学生,我认为我们这么做也不是不行。

  • c.duan老师虽然老是说自己讲的不好,实则是对自己过分的谦虚了(嘿嘿)。duan老师面向对象设计这门课是我大学以来听得最认真的一门课了(尽管我的PTA有时写的跟垃圾一样),duan老师对于这个行业以及这个专业的理解让我真正学到了一些东西,不止是技能上的,包括思维上和认知的提高,我觉得段老师说的有些话很有道理,比如“困难前移”这个观点我对此非常推崇,在如今的社会想要不被淘汰就得适应规则,对于“困难牵前移”,尽管在平常的PTA中让我们欲仙欲死,但是在大学这个试错成本最低的时间段,如果连这都适应不了,很难想象以后在这个行业中该如何生存下去。duan老师带我们提前体验了了以后工作中会遇到的困难,以后在工作中想必会轻松一点。另外,我还想对自己说

菜就多练!

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

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

相关文章

python 爬虫

python 爬虫 1.开发工具 pycharm: https://pan.baidu.com/s/1s_bkgDT0QxNTQY07LnQRWQ?pwd=2dlb提取码:2dlb python3 VSCode 2.第一个爬虫的开发from urllib.request import urlopenurl = "http://www.baidu.com"resp = urlopen(url) #print(resp.read().decode(&q…

项目冲刺

项目冲刺汇总 第一天 第二天 会议图片第三天 会议图片第四天 会议图片第五天 会议图片第六天 会议图片第七天 会议图片燃尽图

解决 Win11 微软拼音输入法下 JetBrains IDE Shift+F6 失效的问题

如果你使用 Win11 系统下的微软拼音输入法,同时又在使用 JetBrains 系列的 IDE,你可能会发现 "Refactor -> Rename..." 功能对应的默认快捷键 Shift+F6 按了之后没有反应,但通过菜单执行这个操作是正常的。这个问题目前基本可以确定是微软拼音输入法引起的。 目…

RILIR 复现 一些 idea

伪代码:在 if done 的时候,在环境中已经跑了一个 trajectory 了,利用当前的 trajectory 和专家的 demo 求一下 reward(文章中用的是 optimal transport 的几种方法) 否则,就继续在 observation 的基础上利用 actor 学到的策略 sample 出 action,并用 list 记录下当前的 …

OOP题目集1~3的总结

目录(一)前言 (二)作业介绍 (三)算法与代码 (四)SourceMonitor代码分析 (五)自学内容 (六)总结一、前言介绍本篇博客的大致内容、写作目的、意义等本篇博客介绍如何使用Java语言基础和算法来解决题目问题,在此基础上进行对最近Java编程语言学习的总结 题目的难度为…