oop作业总结第三集
前言:
转眼已经到了学期末,面向对象课程也迎来结课,这是oop第三次作业的大总结,对于我这样的菜鸟来说,说不难是不可能的,题目集的难度都是由浅入深,循序渐进的,越往后写越是有点力不从心的感觉。但是这门课是我们接触软件的开始,并不是结束,这门课结束了不代表学习就要结束,所以在结课之后,对于最后两次题目集做一次总结,以便巩固自己所学的知识.
- 题目类型和之前的一样,都是在家居强电电路模拟程序-2的基础上进行两次迭代。
设计与分析:
-
对于家居强电电路模拟程序-3:
这次迭代还添加了线路中包含多个串联起来的并联电路的情况,使得电路更加复杂。 -
代码分析:
这次我对在家居强电电路模拟程序-2的不足之处进行了修改,对代码进行了大规模更改,相较与之前的更加简单,将多次重复的代码单独拎出来做一个方法,提高了代码的复用性
主要类和类间关系如下:
Device 类:这是所有设备的基类,包含设备的基本属性如ID、输入电压、输出电压和电阻。子类通过重写calculateValue()方法来实现特定设备的电压计算逻辑。
ControlledDevice 类:是Device的抽象子类,名为受控设备,所有需要计算输出值的设备继承自它,如B、R、D和A。
B、R、D 和 A 类:分别代表白炽灯、日光灯、吊扇和落地扇,它们都是ControlledDevice的实例,每个类都有自己的电压计算规则。
S 类:代表窗帘,它有自己的计算方法,根据输出的光照强度调整输出。
ControllingDevice 类:这是一个抽象基类,名为控制设备,用于控制设备,如F、K、L和H,它们有自己的行为和状态。
F 类:代表可调节的设备,如风扇,有上/下位置控制和电压映射。
K 类:代表开关,有开启/关闭状态。
L 类:代表连续调节器,可以设置参数来改变输出电压。
H 类:代表互斥开关,可以同时控制两条电路,一条路开时,另一条路则关闭。
Series 类:代表串联电路,包含一个电压和电阻,用于管理串联设备的电压分配。
Parallel 类:代表并联电路,包含多个串联电路,用于管理并联设备的总电阻和电压分配。
Main 类:是程序的主入口,包含了全局的设备集合,如开关、调节器等。它负责读取用户输入并根据输入更新设备状态和电路。
Input 类:负责解析用户输入,根据输入创建或更新设备和电路。
- 代码逻辑:
类间关系是通过继承、组合(如设备添加到电路)和关联(如设备之间的控制关系)来实现的。例如,设备可以被添加到串联或并联电路中,而控制设备则可以影响其他设备的行为。通过这种方式,代码模拟了一个复杂的电器系统控制模型。
这次题目相较于前一次的题目增加了由电压和自身输出的光照强度调控的窗帘设备,思路很简单,重写计算窗帘打开程度的方法,将所有灯光设备的输出值保存相加后,最后再输出窗帘的打开程度即可。
这一次难点在于与两条线路发生关系的互斥开关H
我最开始的想法是在H内添加两个私有的基础开关类Switch,分别在两条线路中,通过H类内的转换方法Toggle()将Switch类的状态state发生改变,从而实现互斥开关H的打开与闭合,这样的想法很美好,但我忽略了一个问题,在于不同连接点的问题,互斥开关有三个连接点,只有2,3连接点处的两条线路存在相互互斥,如果输入时,连接节点和预想的不一致,不是由一条串联电路加上一条并联电路的类型时,就会发生错误。
应该只要在输入和处理互斥电路时对其连接节点做特殊处理并保存在H类的两个Switch类中应该就可以解决问题,但是由于自身能力问题,直到题目集结束我都没有完成互斥电路的改造,也是比较痛苦的一。
还有其他的问题我认为出自上一次家居电路-2中未公布测试点所未解决的遗留的问题,也是没有解决办法。
不足之处在以上都有提到,写代码效率不高,难以发现并修改实际出现的问题,想问题不全面不深刻,出现漏考虑的漏洞出现,导致频繁由测试点无法通过,这些问题都在解决实际问题时有重大缺陷,要趁早改正这些不足之处,这样我才能在这条路上走得更远。
- 对于家居强电电路模拟程序-4:
在家居强电电路模拟程序-3的
Device 类,ControlledDevice 类,B、R、D 和 A 类,S 类,ControllingDevice 类,F 类,K 类,L ,H ,Series 类,Parallel 类,Main 类,Input 类的基础上
添加了一个新设备二极管设备继承自ControledDevice类,并实现其calculateValue()方法来模拟二极管的特性,通过其输入的二极管接触点来判断二极管的方向,从而实现单向联通的功能,
除此之外,本题除了根以往一样输出电路设备的基础信息以外,还要输出电路设备在此条电路上的电压,并且对于电路设备添加了电流上限的限制,这个的解决思路很简单,电流的值很好得到,用电压除以电阻即可,当然也要考虑某些特殊情况,不能出现除以0的情况,要注意做错误分析。
当然此题最大的难度还是在于复杂的电路,各种设备的出现,如互斥开关和二极管,再加上迭代出现的并联内还有并联电路的情况,符合实际生活中出现的随机且复杂的问题,但是对于没有完全通过前面两次迭代的我来说,无疑是难上加难,设计编写很久的代码也只能得到寥寥无几的分数,各种问题同时涌现,整得我束手无策。
踩坑心得:
互斥电路考虑不全面导致整个电路在运行时会出错,应该在刚刚开始添加这个类时就应该考虑清楚,就可以避免这么多麻烦,省时又省力,这个问题告诉我们考虑问题一定要全面,把所有可能的情况都考虑一遍,不能想到哪写到哪,先做需求分析不是没有道理的。只有预先分析了所有问题所在,才有可能编写出一段适用于应对所有状况的代码,即使出现问题也只要添加新的类应对新需求即可,这才可以被称作一份正常可用的代码。越是复杂的问题就越是贴近我们现实中的实际问题,虽然这次题目没有能够取得一个令人满意的成绩,但是这也为我的面向对象学习过程积累了重要的经验,犯过的错不再犯也许也是一种不错的进步。
改进建议:
这几次的题目集都没有公布测试点,正如老师说的实际生活中没有测试点给你,你只能自己思考,这句话当然没有错,比如在电路-2的写题过程中没有测试点公布当然可以,我也原意接收这样的挑战,但是我认为在下一次题目发布时,应该公布上一次测试点的提示,为什么呢,就拿我来说,在电路-2中有三个测试点没有通过,经过很多次测试也没有发现问题所在,这样导致的结果是什么呢,下一次题目在有相同或者类似的测试点中只会一错再错,经过几次迭代的累计,正确的根本所剩无几,没有发现问题就无法改正自己的思路,不能更正,无异于在shi山代码上再次堆叠,我觉得这也是最后一次题目集成绩如此惨淡的原因之一,没有改正的机会,又怎么能得到提高呢。
总结:
这是面向对象课程的最后两次作业,每个人都想认真对待,来实现自我在面向对象编程方面的提高,完成这样的一系列的作业也有很多收获:
通过编写和维护这样的代码,提高了在面向对象编程(OOP)方面的编程能力。
还可以巩固设计模式相关知识,如策略模式(ControlledDevice和其子类),有助于学习如何在软件设计中使用设计模式来提高代码的可复用性和可维护性。
提高问题解决能力,在编写代码的过程中,可能会遇到各种问题,解决这些问题可以锻炼问题解决能力和调试技巧。
有了一定软件架构设计能力,通过构建这样的一个系统,可以学习如何设计软件架构,如何将复杂系统分解为可管理的模块。
还有助于我们对于实际应用理解,可以更好地理解现实生活中出现的问题和挑战,以及如何用软件来解决问题。
总的来说,面向对象课程是我们学习软件的敲门砖,现在大一所学的都是基础中的基础,只有熟练掌握这些知识,才能在以后的课程甚至工作中能有继续学习的能力,学习的过程无疑是枯燥的,但是,每学习完一些知识,每攻破一个测试点,每次发现最后问题所在,也无疑会给我们带来不断的激励,有动力才更会学习,我希望我能在今后软件路上走的更远更深更快更踏实,一时的失败不代表永远,不断的向前学习永远都是胜利,加油继续努力吧!!!
posted on 2024-06-29 15:58 oblivioner 阅读(11) 评论(0) 编辑 收藏 举报