7-8次的大作业总结性blog(附含对8次大作业的总体总结)
引言
日月如梭,蓦然回首,一个学期紧张刺激的java学习已经进入尾声,而这将是本学期最后一次的大作业总结blog了。一刻也没有时间为大一的结束感到惋惜,紧接着赶往战场的还有高等数学,离散数学,习概,java的考试,最近真是过的太充实了呢ww
好了废话也不多说了,让我们进入正题:最后两次的大作业究竟是什么,以及在我眼中,这八次大作业教会了我那些知识。遗憾的是,即便我加班加点地修改代码,最后一次大作业仍然没能完成测试点地要求,但是失败也同样能给我们带来些许教训。
对最后两次大作业的认识
最后两次大作业与之前的不同就是在与对引脚的利用以及互斥开关的加入,以及窗帘
对于7-8次大作业的初步评价
第7-8次作业难度很高,最直接的证据就是老师都花了好久才完善了自己的代码,所以发出作业的时间很迟,并且第八次大作业的测试点还一直变动,这足以说明难度还是有的ww
所设计的知识点主要有:树的运用,链表的运用,继承与多态关系,类的设计等
怎么去理解互斥开关
互斥开关是一种控制线路串联的方式的开关,在中学物理中,有一个更熟悉的名字:单刀双掷开关(当然了,由于我没有系统的学习电路知识,所以这两者可能并不是等价的,但是目前在题目中是如此)。它的特点是可以切换电路的走向,并且在任何时候只有一条通路。

那么在拿到题的瞬间,我便想到了:能不能把这个互斥开关等效替换为两个并联的开关呢。答案是肯定的,当然这未必是最好的做法。

在我的构想中,一个互斥开关其实就是将两个串联电路的开关关联起来,让他们产生互斥的联系,这样就能达到互斥开关的等价效果。

由上图可以看出,我的互斥开关的主要逻辑就是将两个开关作为属性存入了互斥开关类当中,并且添加了关联开关的方法,如果要改变互斥开关的状态,只需要同时改变已经关联上的开关状态即可。
优点:这样的设计也是符合拓展原则的,并且可以复用之前的Switch类代码,提升了代码的复用性。
难点:我认为这么实现的难点主要体现在两个方面,一是如何实现两个开关的联系,二是如何与之前的文字处理相兼容。接下来我逐一讲解我的思路。
1.怎么关联?
说起来容易做起来难,虽然逻辑上我门只需要无脑绑定两个开关就行了,但是代码要考虑的事情就很多了。应为最为程序,肯定是不能把一句“听好了!这个开关和那个开关是关联的!”的自然语言抛给计算机吧,它肯定是看不懂的(除非是深度学习式AI),需要一套具体的逻辑来实现这个过程。
但是难点难点来了,我们的输入规则是一个一个串联电路输入,也就是说,一个互斥开关,需要两句话输入才能构成一个完整的开关。换句话来讲,我们需要解决的问题就是如何让一个“半成品”开关能保存在程序中,直到遇见它的“另一半”,并把他们组合起来,再放入另一个等待调度的链表中去。
这个问题我思考了很久,最终还是决定使用最原始的方式:使用链表哈希表。我听说别人有更好的方法,但是始终寻觅不到结果。

实现这一逻辑的主要代码就在这里了。这是我用于进行线路组成以及翻译指令的Agent类的create方法。上面是一个Switch语句(没有完全放出来),其他的基础元件在那个switch语句中进行创建,但是互斥开关特殊了。首先使用了正则表达式匹配,看看是否有格式为H\d:为开头的指令,如果有,那就是创建互斥开关的指令了,此时进行判断:现在添加的开关,是互斥开关的哪个部分呢?
可以看到,如果我们在搜索HashMap中没有找到对应的互斥开关,说明这是一个尚未创建的开关,此时我们会创建一个新的互斥开关,并把这个小开关以及它的引脚存入,再把互斥开关的引用存入HashMap中。
如果,HashMap中搜索到了这个互斥开关,说明我们要添加的是这个互斥开关的另一部分,所以让哈希链表返回这个开关的引用地址,然后添加进另一半的小开关,至此,两个开关已经全部添加完毕
接下来根据题目要求,我们会对互斥开关进行初始化,让互斥开关中,引脚为2 的开关闭合,引脚为3的开关断开。现在,这个互斥开关就可以添加到待定链表中等待我的使用了。下图是初始化的逻辑

如何跟之前的代码兼容?
这其实也是一个问题,因为理想的代码是不改动之前的逻辑而能添加代码的。首先就是在Switch语句中加东西,让互斥开关特殊化,上面也描述过了。
此外就是,尽量把逻辑放入HuchiSwitch类里,而不要放到已经写好的类中去。比如我的初始化逻辑最开始就是放到了switch语句的if里面,这样的代码臃肿,难以阅读。
引脚的储存方式?
我曾经想过很多引脚的储存方式,还曾认为引脚应该单独写成一个类中类,并且每个引脚加入地址。但是可笑的是由于前几次作业引脚什么用都没有,所以我就没有加入引脚。到后面的互斥开关本来应该使用引脚,我也只是把引脚单独添加到了互斥开关中,并且利用一分二的方式化解了互斥开关的逻辑,结果到了第八次大作业,引脚的存在感极强,我不得不为之前的懒惰买单ww,现在我都没有找到引脚最佳的储存方式,代码被我改了个底朝天,属实是不要偷懒为好。
感光窗帘的添加?
这是第七次大作业添加的,但我没有重点去讲,应为确实没什么好讲的。仅仅只是让我去计算房间的光感度,我这里用了一个比较简单的方法,那就是在总类Device中添加亮度属性brightness = 0;之后如果有能发光的东西,那就改变它的亮度属性,不能发光的就默认是0,然后对电路进行递归,计算总光度,最后再把总光度给光感窗帘进行计算,求出它的打开程度。下面是我的代码实现

总体设计
下面便是自动生成的类图了,老实说,我从来不看这自动生成的类图,应为它乱,而且它是按照我自己的代码画出来的,我都写完了还有必要看它画的吗?所以这些都是给别人看的。
有人就会说了:那你就不画类图吗,你这设计习惯很不好啊?我没说我不画,我每次设计之前都会把它画到一张A4纸上,但是当时的草稿跟我最终的设计有很大出入的。

那些年我踩的坑
开发可不是一帆风顺的,我遇到了很多知识上的短板问题,比如:
1.我以为把类当参数传入是讲类的副本进行传输,这一点跟C语言搞混了,传入的东西是引用的地址,而不是副本O
2.递归思路,串联和并联逐层递归,但是我却难以把控它递归的深度,导致出现了多次死循环,死递归,从而使程序崩溃。所以日后的学习中,要加强对于递归的思维锻炼,这是编程的一个重要的能力。
3.再也不偷懒了!以后修改数据一定要用setXX方法,而不是直接修改。如果直接修改的化,很有可能修的不是你想要的东西,特别是在继承的环境下,血的教训!!!
4.分开文件去写!我勒个骚刚,把所有东西放到一个文件去写,想找某一处都要找好久,大大降低了开发效率!!!
对八次大作业的结语
那么到这里,大一下学期的学习任务因该是结束地差不多了,每一次大作业地总结,我都会陆陆续续提出许多新地问题,以及爆料出我新发现的坑,所以这里我不多做赘述。
谈到这八次大作业的感受,我只能说是累和泪。
累在8次大作业,我无时无刻不在把我代码改的底朝天,越改越模糊,越改越累。
累在奔波于博客与B站的知识学习中,但仍然迷茫不知方向。
累在寻找bug时,数据莫名其妙地被偷换了,原因都找不到。
累在问了很多问题,但别人根本解答不了,或者说我听不懂。
泪在每一次我都有很多新的想法,但无力去实现。
泪在8次大作业了,我最希望实现的MVC模式仍然没有真正实现。
泪在没有人和我思路相近,无法跟别人讨论自己地想法。
以上便是感受中地七大lei,当然,也有xi
喜在总还是学习到了很多东西,比如正则表达式
喜在还算完善了两个有价值的程序,有些成就感
喜在不再对Java一窍不通
喜在出人意料的攀登
总而言之,一个时代的谢幕,注定不是平凡的。每个人的心中都有一座永恒的灯塔,在指引我们的方向。
浙公网安备 33010602011771号