后三次大作业总结

总结Blog

前言

在本次PTA大作业中,我经历两道难度不小的题目。这两道题不仅加深了我对Java编程的理解,更锻炼了我的系统设计能力、逻辑思维和问题解决技巧,让我对面向对象的设计原则有了更深的理解。

知识点概述

面向对象编程:深入理解了类和对象的概念,掌握了如何使用类来模拟电路的实体。

集合框架:熟练使用HashMap和ArrayList等集合类,以及其自带的sort,reverse方法,提高了数据结构处理的效率。

面向对象设计:

在面向对象设计方面,学习并实践了以下核心概念:

抽象:通过抽象类和接口,定义了电路系统中各类设备的基本行为和属性。

封装:确保了对象的状态和行为的封装性,使得对象的实现细节对外界不可见。

继承:利用继承机制,减少了代码的重复,并提高了代码的可维护性。

多态:通过重载和重写,实现了不同设备对同一行为的不同实现,极大遍历了编码的实现,减少了代码复杂度。

设计分析

第一题目集设计分析

Main

在第一题目集的设计中,最主要的难点是互斥电路的实现。我的设计思路和实现方法如下:

控制设备类设计:为每种控制设备设计了相应的类,如开关类Switch、以及调速器列,分档调速器类ShiftGovernor和连续调速器类ContinuousGovernor。各司其职。

受控设备类设计:为每种受控设备设计了类,如白炽灯类IncandescentLamp、日光灯类FluorescentLamp、吊扇类CeilingFan等。这些类继承自一个共同的抽象类Appliance,以实现设备的基本行为。

电路连接模拟:设计了一个Input类来处理输入的电路信息,使用正则表达式匹配并解析输入的电路连接和控制指令。

电路状态管理:实现了一个TotialCircuit类来储存以及实现电路的运行,包括电路的短路断路,设备的开关状态、电压、电流等。

至于电路的储存,如电路中有多个并联,该实现在第一次迭代便已经实现,这里不多赘述。

接下来是本次迭代的重难点,互斥电路的实现。在一开始题目未发布之前我便在思考该实现,一开始的思路本来是在互斥电路中储存两个串联,后看了具体的题目后豁然开朗,将两个并联改成开关,在电路以及电路的遍历中只储存这两个常规开关而非互斥开关,而将互斥开关储存在要输出以及调控的集合之中,而在互斥开关中去管理两个常规开关来实现互斥开关的一开一闭。

第二题目集设计分析

Main

该迭代应该为这么多次大作业以来最难的一次迭代,新增了很多,以及很难的内容

二极管类设计:设计一个Diode类来模拟二极管的行为。

电位输出:修改了Element类的show方法,使其能够输出设备的电压状态。

短路检测:增加了短路检测的逻辑,当检测到短路时,程序将停止执行并输出错误信息。

电流限制:为每个设备增加了电流限制的检查,当电流超过设备的最大电流限制时,程序将输出超出电流限制的错误信息。

同时本次迭代多了并联中的串联有并联的情况,该情况在第一次迭代就已经实现也不多说。

本次迭代中的二极管设计思路和上次迭代的思路相像,都是将其改成普通开关,然后将该开关代替本体从而实现题目要求。

电位输出,应该是本次,或者是这么多次大作业以来最难的一个实现了,常规的电位set还不算复杂,难就难在特殊情况,也就是断路和断路的电路中元件电位的set。

屏幕截图 2024-06-29 180325

电位的输出要求按照引脚的顺序输出,也就是说不一定是输出电位和输入电位的输出顺序不固定,这里我用了一个boolean变量,来储存电位的输出顺序,如果为true则是先输出输入电位再输出输出电位,反之则反,这算是我自认为比较巧妙的一种设计了。

屏幕截图 2024-06-29 180458

屏幕截图 2024-06-29 180410

屏幕截图 2024-06-29 180547

普通电路电位的set我采用的是输出电位等于输入电位减去电压,然后重写并联电路中的方法然后通过不断调用起到深层遍历的作用,也就是处理并联里有并联无限套娃的情况。而短路和断路的电路,由于在判断电路是否短路断路,如果是就将该电路移除,因此想要遍历断路和短路电路,我又给并联和串联类新增了一个static属性,用来储存被移除的电路。然后在重新给断路短路set电位,断路的set电位则是分两次,从头开始遍历直到碰到断开的部分,这一部分的电位都等于电路的输入电位,然后再reverse电路,从尾开始遍历直到断开的部分,这一部分的电位都是电路的输出电位;短路部分则是所有电位的都相等,但是有一点要注意的是电流的设置,在某个短路的并联电路中,其未短路的串联电流未0,短路的串联则分流,这一点需要注意,若没有正确设置好电流,则在输出元件电流是否超出范围这一部分可能会出问题。

心得体会

第一题目集心得

在第一题目集的开发过程中,我深刻体会到了面向对象设计的强大。

面向对象设计的重要性:面向对象的设计方法让我能够将复杂的系统分解为可管理的模块,每个模块负责一部分功能,易于理解和维护。

代码复用的便利性:通过继承和多态,重用已有的代码,减少了重复劳动,提高了开发效率。

问题分解的能力:在解决复杂问题时,我学会了如何将问题分解为小的、可管理的部分,如在互斥开关的设计中,我将互斥开关分解未两个小开关,从而将未知改成已知,连电路的运行遍历的不需要因互斥开关而更改。

同时在这次迭代中我深深感受到了引用的便捷性,java中没有指针,但有类似于指针的引用,通过引用可以实现,单存储多操作的便利,即在某个容器储存,而在其他容器操作的形式,极大地便利了编码。

第二题目集心得

本次迭代难度很大,其功能的实现,以及潜在问题的发现,类以及方法的设计,难度都很大,对自己也是很大的一种挑战。除去难度方面,还有一个问题也很值得注意,遗忘,四次电路的大作业时间说长不长,说短也是真的不短,每次开始写的时候,读这个项目都很头疼,因为隔得太久真的忘了很多,每次读项目的时候都可能耗费大量时间,幸运的是我在很早就发现了这个问题,并尝试解决,我的解决方法一是注释,二是尽量减少或者不修改,如果要对代码进行修改,就可能设计很多之前写的代码,但如果我们设计好了每一个类每一个方法,我们就可以只需要增加功能而不需要修改,可能很好得减少我们的工作量以及出错的可能性,这似乎就是开闭原则吧,再一次次大作业迭代中,终于领悟了其真正的含义与妙处。这也是最后一次大作业了,随着这么多次大作业经验的累计,我对面向对象也算是勉强入门,再也不像是之前的面向过程编程,不再是甚至上百的圈复杂度了屏幕截图 2024-06-29 182517

虽然现在依旧不算很好,但也是很不错的进步了。

改进建议

代码模块化,虽然在第二次迭代中已经进行了一定程度的模块化,但仍然有进一步模块化的空间。例如,可以将输入解析、电路状态管理、元件运行等分离为独立的模块,以提高代码的可读性和可维护性。

最后这次大作业很遗憾还有十多分测试点未能拿到,我猜想可能还有几个方面没有做好。精度问题,电压是化整形输出,其可能隐含着精度问题导致输出的答案错误;电流的set,在我改良电路的set后部分错了的测试点对了,部分对了的测试点错了,所以在电路的set中还存在一定问题;断路电路中元件电位的set,虽然正常情况依旧满足,但可能存在特殊情况导致set错误。这些部分都需要改进。

总结

通过这么多次的大作业,我对模块,类,方法的设计以及其原则都有了更深的理解,虽然没法具现进步,但还是可以感觉到自己确实学会了很多,转眼java课程已经结束了,回想起初学java的那个毛头小子,感慨万千。

posted on   yu15030  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示