OOP第二次blog作业

OOP第二次blog总结作业 

前言

三次题目集(4,5,6)的知识点涵盖了从基础的数据结构如ArrayList、HashMap的使用,到较为复杂的逻辑处理如正则表达式的匹配、自定义类的设计与实现,以及排序算法的应用等。我觉得题量适中,且每个题目给的时间相对而言也是比较充裕,既能保证学生充分练习和巩固所学知识,又不至于造成过大的负担。从难度上看,题目逐渐递进(当然第四次PTA作业跟第五次和第六次没啥关系),从简单的输入输出处理(涉及了大量正则和for循环的嵌套)到复杂的逻辑判断和面向对象编程的应用,使得我在完成题目集的过程中能够逐步提升编程能力,无论最后的结果如何,不管有没有拿满分,这都是过去式了,起码我尽了我的全力去思考解方案了。

设计与分析

在源码分析过程中(在这里我将对源码进行详细分析,除了类图和方法复杂度的分析外,我还会针对java的几大设计原则进行着重分析),我发现题目集的设计充分体现了面向对象编程OOP的思想。

(以下是对三次题目的分析和难点解析)

屏幕截图 2024-06-06 194642

屏幕截图 2024-06-06 194700

在题目4中,通过定义Question、Paper、AnswerPaper等类,将试卷、题目和答题卡等抽象成具体的类,大大简化了代码逻辑,提高了代码的可读性和可维护性。同时,利用ArrayList和HashMap等数据结构实现了对题目、学生信息和答题卡的高效存储和管理。此外,正则表达式的灵活运用也在题目解析和答案匹配等方面发挥了重要作用。

屏幕截图 2024-06-06 195900

在题目5中模拟了一个电路控制系统,通过Device、Control和Line等类,模拟了电路中的各种元素及其控制逻辑。系统能够解析用户输入的电路配置,模拟电路的运行状态,并根据控制指令调整电路元素的工作状态。该系统展示了面向对象编程在模拟复杂系统行为方面的优势,能够直观地反映电路控制的逻辑和元素之间的相互作用。我觉得这其中最难的就是对输入信息的提取,我想想办法把Input给优化,因为老师说一个方法最好不超过三四十行,但我始终没有啥效果,非常得冗杂(我看着我的一百多行的处理输入信息的代码陷入了沉思)。

相对与题目5在题目6中我还对Output类中的方法进行了修改,不在使用多个循环去输出。(以下可以表明做提前的设计,以及单一原则的重要性)

在题目6中在电路控制系统的基础上进行了扩展,增加了对复杂电路(如并联电路)的支持和分析功能,就是加入了并联,要我对于题目5中进行了大修改,这其实也不能怪别人,我看题目5比较简单,就没有为后面着想,简单设计好了继承结构和类之后,我就开始着手写代码,为我后面重写计算电阻啊,判断电路是否有效啊,对TotalCircuit进行修理,以及核心的working方法都要进行添加和改变。通过定义TotalCircuit和ParallelLine等类,系统能够解析并模拟更复杂的电路结构,包括串联和并联的组合。该系统不仅能够检查电路的有效性,还能模拟电路的运行状态,计算电流、电压等参数。

由于老师要求,不再细表出全部源代码的实现,只针对性得放出象征性代码进行说明和分析。

题目四代码分析

代码功能

该代码是一个关于试题管理、试卷创建和答题卡判分的系统。

类图如下:

屏幕截图 2024-06-06 200820

屏幕截图 2024-06-06 200455

从Metrics对类复杂度的分析:我可以深刻的明白自己的缺陷体现在了Main里面了,这是因为我里面不仅仅有main方法入口,还有一个最主要的私有的judge方法,那时是初次接触java,没啥经验,我看过别人的代码,main里面加注释也才不超过20行,直接给了我很大的明悟和视觉冲击。

Java设计原则分析

  • 单一职责原则(SRP):代码中定义了多个类(如Question, Paper, AnswerPaper等),每个类负责特定的功能,符合单一职责原则。
  • 开放封闭原则(OCP):通过继承(如QuestionK和QuestionZ继承自Question)实现了对问题类型的扩展,同时不需要修改已有代码,符合开放封闭原则。
  • 里氏替换原则(LSP):子类(如QuestionK和QuestionZ)可以替换基类(Question)出现在父类允许出现的地方,没有违反里氏替换原则。
  • 接口隔离原则(ISP)和依赖倒置原则(DIP):说实话在我的代码书写中不太明显,其实根本没有用到hahaha(因为那时根本不知道是啥)。

OOP三大特性分析

  • 封装:每个类都封装了自身的数据和方法,如Question类封装了题号、内容、标准答案和分数等属性。
  • 继承:QuestionK和QuestionZ通过继承Question类,重写了isTrue方法以处理不同的答案验证逻辑。
  • 多态:在judge方法中,通过instanceof判断问题类型,并调用相应类型的isTrue方法,体现了多态性。

题目五代码分析

代码功能

该代码模拟了一个电路系统,包括控制设备(如开关、调速器等)和受控设备(如风扇、灯泡等),并处理用户的输入指令。

类图如下:

屏幕截图 2024-06-06 201116

屏幕截图 2024-06-06 201002

对于Input,出现了异常高的复杂度,这是因为我要对输入信息进行摄取有用信息构建出元器件,所以用了大量的if和for的内嵌,其中还有switch的使用,我觉得这是没办法的,我避无可避。但是对于Output我是比较粗暴,直接在里面写了一个方法用了整整6个循环来输出(因为我觉得输出格式很单一),那时我就想着可以在下一次在各个类中实现show就可以了,我直接调用不久好了吗???这符合了单一职责。

Java设计原则分析

  • 单一职责原则(SRP):每个类(如Control, Fan, Lamp等)负责特定的功能。
  • 开放封闭原则(OCP):代码通过继承(如Switches继承自Control)和接口实现(未明确展示,但可能存在)来实现功能的扩展。
  • 里氏替换原则(LSP):子类可以替换父类出现在合适的地方(我感觉和多态很像啊)。
  • 接口隔离原则(ISP)和依赖倒置原则(DIP):我想过用接口或者抽象类,但是由于不够熟悉我否决了这些。在这个题目中我并没有使用接口以及它的实现类。

OOP三大特性分析

  • 封装:每个类都封装了自身的属性和方法。
  • 继承:如Switches继承自Control。
  • 多态:在analyCircuit方法中,可能通过不同的控制设备类型来调用不同的方法。(多态真好用,就是用特定的方法我要不然也在父类中写,虽然不合理,但是我比较反感强转,我感觉不爽)

题目六代码分析

代码功能

该代码是对题目5的扩展,增加了更复杂的电路系统处理,包括并联电路,多开关电路的有效性判断等。

类图如下:

屏幕截图 2024-06-06 201412

屏幕截图 2024-06-06 201216

在这次的题目,我觉得做得最好的就是相对于题目5的输出类和Main类进行了极大的优化。但由于并联电路的加入,我不得不对我对输入类来获取输入信息来组建总电路,这导致我的输入类优化的想法泡汤了,而且不妙的是越来约复杂了,我想优化但是却无从下手。我问过好多人,并且和一切同学交流过,他们都是好长的Input类。

Java设计原则分析

与题目5类似,但由于代码更加复杂,对于设计原则的遵循和应用也要求更高,我对题目6做出了我对题目5能想到的一切能改进的了。

OOP三大特性分析

与题目5类似,但由于代码更加复杂,对于封装、继承和多态的应用也要求更高。例如,在ParallelLine类的设计中,需要通过继承Device类并实现自己的work和calResist方法来体现多态性(work方法的代码简直是神来之笔)。

采坑心得

在源码提交过程中,我们遇到了一些问题和挑战。例如,在正则表达式匹配时,由于初始设计的正则表达式不够精确(有时甚至伴随这越界的提示让我摸不着头脑),导致部分特殊格式的输入无法正确解析。通过不断调试和修改正则表达式,我最终解决了这一问题。其次,我在题目6中遇到的了数据精度的优化(就是对于器件工作电压区间的理解),这个我是通过和同学的交流中发现的错误才得到的分。最后也是我这次最大的收获了(我感觉),就是对集合中数据的移除,没有i--,这导致我的代码出现了不可察的漏洞(这浪费我很多的时间在第19个用例当中一直没得分)。

改进建议

针对这三次题目集,我提出以下几点改进建议:

一是进一步优化正则表达式的设计,提高匹配的准确性和效率;

二是加强对面向对象编程思想的理解和应用,尤其是类继承和多态等特性的使用;

三是增加对异常情况的处理,提高代码的健壮性和容错能力;

四是优化代码结构,减少冗余代码,提高代码的可读性和可维护性。

(还有就是老师的word文档里面有些错别字和描述我感觉不准确,我希望可以尽可能描述准确一点。还有就是老师的布置任务的时间周期尽量一致,否则很容易会打乱学习时间布局。感谢老师hahaha~,望老师采纳)。

总结

通过完成本阶段三次题目集的学习和实践,我深刻体会到了编程的乐趣和挑战。我不仅巩固了所学的基础知识,还提高了编程能力和解决问题的能力。同时,我也认识到了自己在编程实践中存在的问题和不足,如正则表达式的使用不够熟练、面向对象编程思想理解不够深入等。针对这些问题,我将继续加强学习和实践,努力提高自己的编程能力。

总之,本阶段三次题目集的学习和实践让我收获颇丰,不仅提高了我的编程能力,还让我更加深入地理解了面向对象编程的思想和方法。我将珍惜这次宝贵的学习机会,继续努力提升自己的编程水平。

posted @ 2024-06-06 21:24  guotianxiang  Views(7)  Comments(0Edit  收藏  举报