一、前言
在这个学期即将迎来尾声的时候,这个阶段的大作业也迎来了最后的两个迭代大作业,而本次博客就将围绕这两个迭代大作业讲述
二、设计与分析
这两次的迭代作业的类设计其实没有很多的变化,只不过根据题目要求添加了互斥开关和受控窗帘,二极管这几个类,其中互斥开关是控制器的子类,受控窗帘属于设备的子类,二极管属于仪器类的子类。
因为受控窗帘的窗帘开放程度的参数是根据整个系统的光照强度设置的,所以我写了一个方法在整个电路都运行了之后再根据电路中所有的灯的亮度对这个窗帘的开放程度进行调整。
而针对互斥开关的内部细节操作,我则是设置了一个变量port,用来表示该互斥开关开关搭在哪一个引脚上,当port为2时,电流传进引脚二,当port为3时,电流传进引脚三,port为一时,则传进引脚一,这也是针对当引脚二和引脚三都在引脚一前面的情况。而二极管则是当引脚二在前的时候,该二极管反接,电阻无限大。
下面两张图分别是前一次博客和这一次博客时SourceMonitor的分析报告
从图片上可以看出来,在两次的代码的文件数量增多了4个,因为除开了上面讲到的三个类之外,还有一个窗帘的抽象类,作为受控窗帘的父类。
而在代码行数上,从688行到984行,多了大约三百行的样子,主要是第八次大作业的修改多了一些,在引脚的接入方向从以前除了互斥开关可能会存在引脚1在同元件后,变成了所有元件的引脚1与引脚2的顺序都可能随机,这点会在踩坑心得中详谈。并且在输出信息方面,多加了输出元件所有的引脚的信息这一点,这点也使我修改了不少,虽然在我之前写的代码当中是会将电压通过传参的方式传递经过所有的元件,但是在最后这一次大作业上却没能做到完成该题所有的要求,仍然存在一些错误。
而在注释占比上也相较于上一次有一点提升,从8.4到9.2说明我也已经慢慢养成了在写代码时为代码注释的习惯了,不过这方面还仍需要提高。
而这个最大的复杂度仍然是根据元件首字母创建相应类的对象的那个方法,该方法使用了switch语句。
三、踩坑心得
在最后一次大作业中因为同一个元件的引脚的先后顺序可以不同,比如引脚2可以出现在引脚1的前面,这点对于我写的代码的影响还是偏大的,因为最初我在设计类的时候担心可能之后会有元件的两个引脚不会以1或2的编号命名,或者同一条电路中的引脚顺序不会按照连接的顺序输入,这会对连接电路的那个方法造成一定的影响,所以我就在引脚类中添加了一个布尔类型的参数isInputPort,用于表示该引脚是不是输入端的引脚并且在创建这些引脚的时候就对这些引脚的inputPort参数进行了设置,但这一次的大作业中这一种输入模式打破了我原本的写的模式,所以我不得不对原有代码进行比较多的修改,并且在这一次的大作业中我删除了isInpuPort这一个参数,毕竟这一次输入模式的较大改变,我也不得不对这种设计进行修改。这也让我明白在给类添加参数之前应该要先思考该参数是否合理,是否符合应用。
在前几次大作业中,因为我给引脚类添加的inputPort这个参数,所以我在第三次大作业添加了互斥开关时为了应对出现引脚1在引脚2,3后的情况,我还写了一个方法用于对这种情况下的三个引脚的isInputPort这个参数进行修改,但在这一次大作业之后我就反思,在写第三次大作业的时候也许我就应该删除掉这个参数了,这也是我的疏忽点。
四、总结
在这一阶段的大作业中,我对于Java中的继承和多态的使用更加熟练了,继承和多态的使用使得整个代码更加具有灵活性,并且这提高了代码的重用性,当我使用继承的时候就可以避免写过多相同的方法,并且多态的使用也提高了我代码的简洁性,就比如我这个代码中的CircuitMember类作为电路元件的父类,在使用链表的时候范型我可以直接写成LinkedList<CircuitMember>,这样就可以储存所有的电子元件对象了,而不用为所有的类的对象都新建一个新的链表,并且这样的形式,我也不用额外写一个排序方法了,只需要为CircuitMember类实现Comparable接口的compareTo方法就可以了。
但是虽然继承和多态虽然好用,但是并非什么情况都可以用,还是得根据实际情况使用,并且在使用继承的时候父类的设计就要更加的谨慎了,因为其子类越多,修改父类的一处地方法后,有时就会涉及到很多类的修改,这样对于修改程序是一个灾难,所以继承虽然优点多,但也不能无脑使用,还是得在满足了“是一种的”的条件后使用才是对的。
在类的参数变量的添加上应该要思考该参数的存在是否合理,是否符合要求,是否不会造成代码的效率变差。