OOP课程第三次Blog

一、 前言

本次博客是对于题目集7~8的总结和反思。

知识点
本阶段题目集的主要对之前所有知识进行综合考察,主要知识点包括封装、继承、多态,继承、抽象类和接口、List及泛型等。继承包括对super、extend关键字的使用,方法的重写等,多态包括向上转型、向下转型等。在设计上考察了单一职责原则、开闭原则和MVC模式。总体上需要对现已学过的知识进行综合运用。

题量
本阶段题目集只有一道迭代题,只需根据题目新增信息对上一次代码进行增删改查,每次增加3~5个信息并不多,总体题量是合理的。

难度
本阶段题目集是要对之前的知识进行综合运用,每次增加的内容也不算多。
第七次题目集增加受控设备窗帘、控制设备互斥开关和电路结构变化:线路中包含多个串联起来的并联电路,总体上增加的内容并不多,只需多原先的代码进行增删改查,增加窗帘类和互斥开关类,对输入的分割、分压和输出也进行相应的修改大体就能写对,再对代码中的逻辑错误如判断并联电路的短路断路等进行调试修改便能得到满分。
第八次题目集增加的内容相对较多,增加管脚电压的显示、电流限制、短路检测、并联电路中包含并联、二极管,因为开始计算电压的方式是根据电阻进行分压,此次新增的内容需要我对所有设备的管脚电压进行输出,近乎是对代码进行重构,有一定的难度,同时也发现对于互斥开关上一次在电阻和判断连接几号引脚方面写的就有些问题,导致这次改了很久最后分数还是不高。

二、设计与分析

第七次题目集

本次作业新增内容:

1.互斥开关:

互斥开关有3个引脚:1个是汇总引脚,另两个是分支引脚。

开关电路示意图如图1所示,左边是汇总引脚,编号为1;右边两个是分支引脚,右上的输出引脚为2,右下输出引脚为3。图中1、2、3引脚均可以是输入引脚,当1为输入引脚时,2、3引脚为输出引脚;1为输出引脚时,2、3引脚为输入引脚。

互斥开关只有两种状态:开关接往上面的2号引脚、接往下面的3号引脚。开关每次只能接通其中一个分支引脚,而另一个分支引脚处于断开状态。

互斥开关的默认状态为1、2引脚接通,1、3引脚断开。

图1中所示的互斥开关可以反过来接入电路,即汇总引脚接往接地端,两个分支引脚接往电源端。

为避免短路,互斥开关设置了限流电阻,12引脚之间默认电阻为5,13引脚之间默认电阻为10。

2.本次迭代模拟一种受控窗帘:

受控窗帘的电路符号为S,其最低工作电压为50V,电压达到或超过50V,窗帘即可正常工作,不考虑室外光照强度和室内空间大小等因素,窗帘受室内灯光的光照强度控制。

当电路中所有灯光的光照强度总和在[0,50)lux范围内,窗帘全开;
在[50,100)lux范围内,窗帘打开比例为0.8;
在[100,200)lux范围内,窗帘打开比例为0.6;
在[200,300)lux范围内,窗帘打开比例为0.4;
在[300,400)lux范围内,窗帘打开比例为0.2;
在400lux及以上范围内,窗帘关闭。
当电压低于50V,窗帘不工作,默认为全开状态。
如果电路中没有灯或者灯全部关闭,光照强度为0,窗帘处于全开状态。
受控设备电阻:白炽灯的电阻为 10,日光灯的电阻为 5,吊扇的电阻为 20,落地扇的电阻为 20,窗帘电阻为15。

类图

分析:
在本次设计中增加家具Furniture的子类Curtain、控制设备Controller的子类ControllerSwitch2,其他部分保持不变。
总体设计还是比较合理的,抽象出父类Furnture和Controller,Furniture的子类中又抽象出Fan和Light,再向下分出子类各个家具,Controller分出三种控制设备的子类,并根据控制电压的不同方式分别连接三个不同的接口。输入的信息先由Split进行分割,再由PinVoltageHouse对所有电器分配电压,最后由View进行输出。

复杂度分析

基于Sorcemontor的代码分析:
1.从复杂度分析可以看出此次代码的设计并不算特别合理。代码深度Max Depth相较于上次有所降低,但仍然在边缘线上。
2.圈复杂度Maximum Complexity为48,过高;代码复杂度Max Complexity也过高,其原因可能是在输入时有各种信息,只能通过if语句来分割。
3.方法调用很多:Method Call Statements为292。
4.缺乏注释:代码注释几乎为0,代码可读性极低,应在日后多加注意。
5.分支语句百分比:22.7%。逻辑判断较多。

第八次题目集

本次作业新增内容:
1)增加管脚电压的显示

在输出每个电器的状态信息后,再依次输出该电器每个管脚的电压。(格式详见输出信息部分)

2)电流限制

电器在工作时,过大的电流会引起电器过热,从而烧坏电路。本次迭代,每个元器件都有最大电流的设置,当实时电流超过最大电流时,在该电器输出信息的最后加入提示“exceeding current limit error”,与前面的信息之间用英文空格分隔。

例如:@B1:190 68-17 exceeding current limit error

本题各类电器的最大限定电流如下:

开关20、分档调速器18、连续调速器18、白炽灯9、日光灯5、吊扇12、落地扇14、互斥开关20、受控窗帘12、二极管8。

3)短路检测

如果电路出现无穷大的电流造成短路,所有元器件信息不输出,仅输出提示“short circuit error”

4)并联电路中包含并联

本次迭代考虑并联电路中包含并联电路的情况,即构成并联电路的串联电路可以包含别的并联电路。例如如下输入的电路,并联电路M2的其中一条串联电路T4中包含了另一条并联电路M1:

#T1:[IN D2-1] [D2-2 H1-2] [H1-1 OUT]

#T2:[IN D1-1] [D1-2 H1-3] [H1-1 OUT]

#M1:[T1 T2]

#T4:[IN K3-1] [K3-2 M1-IN] [M1-OUT OUT]

#T5:[IN K1-1] [K1-2 B1-1] [B1-2 OUT]

#M2:[T4 T5]

5)二极管

增加二极管元件,其电路特性为:正向导通,反向截止;其电器符号如图4所示,当电流从左至右流过时,二极管导通”conduction”,电阻为0;电流从右至左流动时,二极管截止”cutoff”,电阻无穷大,相当于开关打开。

二极管的标识符为’P’,左侧管脚编号为1,右侧管脚编号为2。

二极管如果两端电压相等,没有电流流过,分以下两种情况输出:

1、如果两端电压为0,二极管的导通/截止状态由接入方向决定,1号引脚靠近电源则状态为导通,反之为截止。
2、如果两端电压不为0,二极管导通。

类图

分析:
在本次设计中增加家具Furniture的子类Diode,更改了Device类中的属性和方法,增加电流和引脚的属性和get、set方法,并新增firstPin属性记录连接引脚的顺序。将输出放入每个类之中使输出更加方便。

复杂度分析

基于Sorcemontor的代码分析:
1.从复杂度分析可以看出此次代码相较于上次设计并不是很合理。代码深度Max Depth加深并超出范围,代码过于繁琐。
2.圈复杂度Maximum Complexity为59过高;代码复杂度Max Complexity也过高,其原因是在分电压时用了过多的循环嵌套。
3.方法调用很多:Method Call Statements为515,比上次将近翻了一倍。
4.平均深度Avg Depth也超过范围,总体上代码都过于繁杂。

踩坑心得

1.审题不清,以为互斥开关一直是关闭状态,实际上接3时输出turn on,在开关连接的引脚变化时电阻也会相应变化,也没有审清楚题。


2.判断是否断路写的有些问题,串联套串联有开关开了就算断路,但开始没有考虑。
修改前:

修改后:

3.总电路中最开始要通过控制设备调节电压,而不是直接赋值220V。
修改前:

修改后:

4.判断开路的方法开始写的有些问题,经过修改后正确并拿到满分。

改进建议

1.减少for和if循环的使用以减少代码的复杂性。
2.每个类都要遵循单一职责原则,每个类中代码不能过于冗杂。
3.设计时要遵循MVC模式,使代码逻辑更加清晰同时降低耦合。
4.代码注释少,可读性差,应当在编写代码时适当增加注释。
5.对于一个面向对象项目最重要的就是设计,在初始看到题目时不要盲目去写代码,而是要分析题目需求,看清每一个需求,抽象出父类并画类图,思路清晰之后再开始写代码。
6.很多时候大片错误是因为包含的小错误太多,比如对题目要求没有看清或是某个地方逻辑有问题,虽然通过一步步调试最后都能解决,但是还是需要对需求提前进行分析以免多次返工降低效率。

三、总结

1.这两次作业总体来说难度都存在,在不断构思和修改后比较好的完成了第一次的题目集,但第二次由于需要修改的内容过多加之期末临近最后完成的效果并不理想。还是需要在初始时设计好才能在接下来编写代码和增删改查的过程中更加顺利。

2.这两次的作业是对面向对象课程进行收尾,这一阶段的学习也让我对封装、继承与多态、抽象类和接口有了更深刻的认识。我掌握了封装性是将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互;单继承(一对多):每个类的父类是唯一的,一个父类可以有多个子类,多个子类只能有一个父类;多层次继承:父类可以有父类,子类可以有子类。学到了方法的重写/覆盖、向上转型、向下转型、接口与接口之间的多继承。

3.通过这一课程的学习,我的面向对象的思想在每次的作业中逐渐培养完善。在编写复杂又长的代码时,首先要仔细读题,然后需要有较为完整且清晰的思路并绘制好类图再开始,而不是边写边想,否则最终导致的结果可能是推倒之前所写的代码。

4.在接下来的学习中还需要不断地努力,对前面的不足之处进行改正,在遇到难题时不能畏惧退缩,而是要秉着能解决多少就解决多少的态度去解决问题,并且要虚心向他人请教和查阅资料。

5.学校的java课程设计总体来说结构非常合理。通过线上课程预习、线下课程学习,雨刷课堂实例、动物电器实验和pta答题判题程序作业三管齐下让我对面向对象程序设计有了更深刻的理解。我相信我在这门课中收获良多,进步良多。

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