(1)前言:
这几次的大作业的也包含了String类的使用和各种String的处理方法,包括字符串按照正则表达式查找和切割。
以及很多新知识点,包括类的封装,继承和多态,其中继承可以说是贯穿整个程序,继承可以让程序简单易读,好修改,
而这个还要求进行一个复杂性很高的排序,所以还用到了TreeMap集合进行管理和储存,利用里面的key值还自定义的排序规则进行排序,
这两次作业的题量题集7的题目还算是比较简单的,因为相对与上一次的迭代来说,只增加了一个互斥开关和受控窗帘,电路也就增加了串联串串联,和并联套并联。
但是题集8的题目,就非常的抽象了,我觉得很不合理(下面会提到,这里不过多赘述),这个不合理导致极大的增加了题目的难度,可以说完全和前面一次的代码关联性都并不是很强了,就像是打着迭代的幌子出了一个新题目一样。
如果要说题目的难度的话,题集7中规中矩,想到了就简单,没想到就难。
而题集8的难度就直线飙升了,就我的视角而言,是没看到一个满分的。

(2)设计与分析:
对于题集7的大作业来说难度没有很高,新增加了一个互斥开关属性和结构如下:

以及输出的信息:

受控窗帘的输入的方式和其他的受控设备差不多,就不过多说明了,输出的信息如下:

受控窗帘的输出的信息是窗帘的打开程度,而窗帘的打开程度要受亮度的影响,而整个电路中能产生亮度的设备只有白炽灯和日光灯。
但是要判断设备是不是白炽灯和日光灯对于我目前的知识储备海做不到,所以我在整个电路的顶级父类设备类中新加一个返回亮度的方法getlux()以及一个lux属性(默认为0)来表示亮度,除了白炽灯和日光灯其他的设备全部返回0,然后再重写白炽灯和日光灯的getlux方法
这是原本的方法:

重写后:


至此,受控窗帘的问题解决了。接下来的问题就只剩下了互斥开关了,互斥开关说难也难,说简单也简单,就看你能不能想到如何处理那个互斥开关,我思考了整整一天,不知道什么时候突然灵光一闪想到,能不能把一个互斥开光拆成两个独立的开关,但也不能完全独立,得受互斥开关的控制,最后经过不知道多少次的整改,终于改好了最终版,我将互斥开关拆成两个开关,将这两个开关分别加到对应的电路里面,再将这两个开关交由互斥开关来管理,来改变对应的属性,但在打印信息的集合里面,不会把开关放进去,而是单放互斥开关,这样就保证了打印信息的唯一性,不会把两个开关的信息都打印出来。
之后的步骤就简单了,就和之前的控制设备差不多,继承受控设备类,并重写里面的抽象方法,再构建一个受控窗帘和互斥开关的输入信息的格式
格式如下:

补充(类图):

对于题集8的大作业来说难度直线飙升。
增加的设备倒是不多,只有一个二极管,结构如下:

以及输入信息的限制:

以上都是比较简单就能搞定的,我们先进行设计,对于二极管而言其实非常简单,其实只要判断一下是正是反,正的电阻设置为0,反的设置为无穷大,这里由于不知道设置为多大合适,我就直接把它当作断路,也就是说反饥接电路断路。有了这些信息设计出一个二极管就没有难度了。
还要补充一下二极管的输出信息的格式,格式如下:

接下来就要说明这个题目抽象的地方了,首先是输出信息的格式,新加了一个输出引脚的电压

这个对于我的代码来说其实并不难,只用正常的输出就可以了,但真正难的地方在于,引脚的电压如何判断,对于我这个高中物理都快要忘光的人来说,这真的是一大难题,然后他给的样例又很抽象还少,根本就不能解决我的问题,比如说,正常联通的话(多个受控设备)两端引脚的电压怎么算,样例只有一个受控设备的情况,要么就是其他的受控设备1断路,总之样例的输出结果就只有220或者0,这个样例给了约等于没给。还有就是再断路的电路中,到断开的那个节点为止,它之前的电路都有电压,知道断开的设备那里,一边有一边没有。还有一个问题,就是互斥开关的电压怎么算?

以上这些问题还只是新加的一个内容,除了这个还加了一个电流限制,格式如下:

本来电压的问题已经够头大了,还紧接着又要对电流进行判断,电流的问题其他可以说更加的复杂,它不仅仅是用电压除电阻就可以得到电流的,因为有控制设备,这些设备的电阻都是0,他们的电流都要看整个电路的电流大小来决定的,所以要先得到整个电路的电流,再根据这个电流来给受控设备进行赋值,但如果得到整个电路的电流又是一个问题。

还加了一个短路检测,如果整个干路短路的话,就不输出设备信息,只输出短路错误,格式如下:

那么至此问题已经了解完毕,接下来就是来解决问题了,你是不是以为我想这样说。
那你就大错特错了,没写出来,根本没有思路

(3)踩坑心得:
题集7的题目虽然不难,但是坑还是有的,就比如说,排序的方式,其实我真的恨不能理解为什么要改这个地方,纯属是为了绊我们一下吗?因为输出信息的时候要对数据进行排序,而上一次用的是数字顺序,比如9后面接10,但这次改成了字典序,如果有10和1,那么10应该排在前面,完全不能理解,如果不是有人提醒了一下我,根本就不会想到这个地方,以下是改进后的代码:

还有就是互斥开关的问题了,互斥开关有一种特殊的使用方法,就是一段接电路,一段空接,也就是什么都不接。本来没什么问题,但我的互斥开关里面的开关是在有信息之后创建的,但单用的话就只有一段输入信息,所以我的代码就一直报段错误,但最后还是找到了错误的地方并且加以改进完成了。
(4)改进建议
代码改进的话其实可以改进很多东西,其中较为重要的一定就是,避免代码的冗余,相同的代码写了太多次了,其实可以都抽调成一个方法,这样可以节省很多的空间。
而且注释一定要写,我个人认为注释还是挺有用的,我其实也写了一点但到了后面敲代码的时候不是忘记写,就是觉得下一次我看这些代码的时候肯定可以记起来,结果可想而知,我真是太高看自己,上个厕所回来都可能会忘记写到哪了,我居然觉得我可以记得上一次写的什么东西,
总而言之,写注释,不吃亏。
(5)总结
经过了这几次的作业,让我学到了如何更好的包装一个类,以及类雨类之间的继承关系,多态的多种使用方法和使用场景,还学到了很多String类自带的方法,包括trim,split,matches等等,以及正则表达式的应用,还有TreeMap,ArrayList等集合以及可以熟练的使用了,lamda表达式也能熟练掌握了,还有课外方面的,比如API文档的使用。
但是还有很多不足的地方,类与类之间的关系应该设计的更加的合理,数据结构感觉还有可以改进的地方,对于错误以及报错分析的不够完美。

(6)这一次相比于上一次的大作业前面几次迭代差别不大,但我还是觉得最后一次的迭代设计的很不合理,就像是确定了开始的题目和最终的题目,但是中间难度增加的不合理,但也硬着头皮把最后一次迭代的作业发了出来,这直接就导致了改进难度大大增加,甚至代码结构可变性弱的代码就必须要全部重新写一遍才有救,还有就是样例给的很不合理,很不合理,很不合理,而且很少,这会大大增加一些阅读题目的成本,没有必要,没有样例,有什么连题目的要求都看不懂,还有虽然我不知道测试点,但经过我前几次,疯狂凹那最后几个测试点来看,测试点有时候也很不合理,测试点的要求题目里是一句话都不提。