南昌航空大学-23201406-耿乐-第二次OOP博客作业
对于题目和做题情况的总结,包括判题程序的最后一次和电路模拟程序的前两次。
一、前言
总结三次题目集的题目情况
关于题目集
总体而言,难度在逐渐提升,同时题量在逐步减少,对能力的训练提升。
题目本身
-
与前三次题目集相同,本次三个题目集同样都使用了正则表达式,但难度还没达到与前几次相同的水平,没有作为主要的考察点。
-
题目集中一些附带的题目的类型主要是添加缺失的代码,对于自学和搜寻、查找信息的能力有一定的要求,同时也可扩展一些课外知识。
-
题目集对类间关系的掌握的熟练程度的要求渐渐提高,题目集愈来愈需要清晰的类间关系,主要是对设计的考察。
二、设计与分析
对题目的提交源码进行分析,参考生成报表和类图
第四次题目集
第四次题目集有三道题目,第一道是判题程序4,另外两道都是给定信息让你进行类的设计和实现,没有什么困难。
判题程序4承接了前三次题目,并在判题程序3的基础上在题目中加入了多选题和填空题,输入的解析的难度会更上一层,类间的关系,输出的类型也要求做出相应的调整。
判题程序4作为判题程序迭代中的最后一代(老师说是因为后面的迭代太难了才换了别的),难度还是有的,但因为判题程序3的难度已经不低了,所以写的时候感觉上并不太难。
类图
在判题程序3的基础上,为了下次的程序可以更加方便的更改,对各种控制类进行类抽象化处理谁知道后面没了,导致类图看着有些复杂。
因为多选题和填空题的特征都是可能有多个答案,将它们归纳到了同一个代表有多种选项的类中,以简化代码的编写。
源码分析
可以看出,代码的质量不能算好,大部分的数据,包括最大复杂度,方法的平均深度都超过了软件建议的值。
平均方法中的语句略少,同时,方法的平均复杂度又在可允许的范围内,说明代码结构不合理。
有些可以拆分的方法我并未将它们拆分,导致有些方法过于臃肿,有些又几乎没有作用,这也代表我的单一职责原则做的不够到位,有些方法承担了过多的职责。
方法的深度过于大,说明我的代码的逻辑不够好,用了过多的if和for的嵌套,以后要注意对于代码逻辑的优化,尽量减少方法的深度,用别的方式来减少if和for的使用。
第五次题目集
第五次题目集共有3道题目,除开新增加的电路模拟程序,另外两道都要求在已有但不完整的代码的基础之上,添加一些代码,来达到题目要求的效果。
这要求我们去自己查阅资料,来完成代码的补充。可以促进我们去自行了解一些课上并没有重点提到的内容,但是如果不用什么办法来加深记忆的话,效果可能不是太好。
第五次题目集的难点主要集中在第一题,也就是电路模拟程序上,是一道新的,会有很多迭代的题目。
要求使用程序来模拟一条指定的电路的运行,电路中包含了开关、调速器和用电器,输入中会给出使用的各种设备和输入的电压,并会用特定的语句来调整开关和调速器的状态。最后用指定的格式来输出全部的电器的状态。
类图
除开基础的各个设备的父类,子类关系外,为了使代码更加合理,添加了几个控制类来接受输入。
根据对输入的解析来对在在控制类中的设备的数组进行各种操作,在输入的信息全部处理完毕后,将设备的信息传入Show类中,按指定的顺序输出全部的设备信息。Main类只和控制类有关联。
源码分析
可以看出,除了最大复杂度外,别的数值大都在建议的范围内,但和判题程序4的问题一样,平均的复杂度太小。
对于单一职责的理解一直不太够,对于方法的功能的拆分不够熟悉,需要多注意这方面的问题,多考虑方法间的协调使用,而不是一个方法包含大多数功能。
因为第一次的电路模拟只要求有一条串联电路,且电路中只会有一个用电器,比较简单,主要的难度在如何判断电路是否是通路上。
虽然简单,但是毕竟是迭代中的第一次题目,仍要想好如何为接下来的题目做好准备。老师也给出了接下来迭代的方向,就是加入串联电路,但是这时并没有给出电阻信息,也不知道电阻的信息会以何种的形式出现,就只是完善了几个父类来应对接下类设备的增加。
第六次题目集
第六次题目集只有一道题目,就是电路模拟程序2。
电路模拟程序2在1的基础之上新添加了一种新的用电器和串联电路。而且每种用电器都有了各自的电阻。
本次的难点主要集中在对串联电路的处理以及对于电路的理解和输入信息的改变,并联电路会在串联电路中出现。
类图
老师在题目中给出了建议的类间关系的设计,想了一下,确实是适合题目的设计,很合理。并结合自己的代码做了修改。
因为整个电路(不论是串联电路还是并联电路),因为都要接入电压并输出电压,都可以视为一个大型的用电器,所以将电路类也设为电路设备类的子类。
同时,因为电路中包含有各种设备,所以分配了一个设备类的数组,用以存储一个电路中的设备的信息。
在并联电路类中分配了一个串联电路类的数组,用以存储并联电路中的几条不同的线路,便于操作。
根据输入的信息的不同,重写了几个方法,来处理不同的输入,实现可以创建更加复杂的电路系统。
写题过程中比较好的一点是有几个类,包括输出类Show都没有什么大的修改,只是将新的设备信息加入了进去,说明的类间的关系还是可以的。
源码分析
首先,和电路模拟程序1相比,最大复杂度降低了,同时代码的平均语句数有提升,基本达到的建议的范围,说明代码的结构更合理了。
最大复杂度是19,比建议的最大范围大了4,复杂度最高的方法是对输入进行实现的代码,会对包含并联电路的串联电路进行操作。
仔细看了下自己的代码,controlAll这个方法的确没有严格按照单一职责原则来写,有些作用可以拆分为新的方法,下次要改进。
三、踩坑心得
对出现的问题及心得进行总结
出现的问题
-
在些判题程序4时,我是一点一点改对的,每次都是一点点的小错误,包括但不限于像是空格没去掉什么的,浪费了一定的时间。
-
因为电路模拟程序1的题面老师给出的很早,第一次提交时就只有一个错误了,检测后发现是因为如果开关在用电器后之后就没有作用了。
-
电路模拟程序2一开始提交时,全部是非零返回,检查代码也没发现有什么大错误。偶然用新加的电器写了一个样例,才发现是因为数组没初始化。
-
再看分析结果时,我的程序的最大复杂度普遍超过了建议的水平,说明我所创建的方法的职责不够单一,设计的不够好。
写题时出现的错误除了这几个主要的之外,还有几个小的错误,大都是一些没注意到的小地方,就不过多赘述了。
获得的心得
-
写题目时多注意细节,尽量避免在小的地方出现错误,后期也不太好发现,会浪费一定的时间。
-
在写题目前先把题目中可能出现的情况都考虑一下,并落实到自己的程序之中,减少后期再做修改的麻烦。
-
不要谈贪图方便,将许多的职责都写在用一个方法中,及时将方法的功能进行拆分,降低复杂度,提高代码的可读性和可维护性。
-
写题时对于程序的整体的结构要有一个更加准确的把握,确保方法和对象的使用正确无误。
四、改进建议
给出自己的改进见解,做到可持续改进
代码方面
-
将复杂度太高的方法进行拆分,在不影响整体的功能的情况下,将复杂度尽可能地降低。
-
减少代码中的if判断的次数,有别的方法应该可以代替一些if的作用,来简化程序的逻辑复杂度,使程序的逻辑更加清晰。
-
现在要提前将数组分配好内存才能够使用,考虑使用别的更加灵活的方式。
结构方面
-
简化类间关系,通过类图,发现类间的关系有点复杂,可以通过一些方法来将类间的关系进行一定的拆分。
-
可以尝试将代码进行一些简化,比如将Show类中的一些对象删去,改为调用别的类中的对象。
-
为以后的新的设备或电路的变化预留出足够的空间,保证之后的程序结构不会有太大的变化。
五、总结
本阶段三次题目集的综合性总结,和对教学方面的建议
自己感想
这三次题目集,有一套老的题目的结束,和一套新的题目的开始。
相较于判题程序,电路模拟程序会更加考察类间的关系的设计,同时减少了一些对于正则表达式的运用的考察。
通过对代码的分析,可以感觉到我对设计的理解多少是好了一点,会有意识的去减少一些臃余的代码,使代码的复杂度降低。通过尽量少的修改来使代码可以适应题目的改变,比之前多少是好一点了。
之后会进一步优化现有的代码结构,逐步提升自身的能力,加强对于结构设计的理解。
建议及意见
-
一次只有一道题目不太好,希望不要这样,建议恢复到之前的一个主要的题目,再从别的地方找几道合适的题目的模式。
-
电阻或许可已改为输入设置,就放在有关于变压器的输入下面。
-
既然测试点没有提示,不妨多放出一到两个样例,便于测试,也防止因不明的错误卡太久。
本文作者:cyaytl
本文链接:https://www.cnblogs.com/cyaytl/p/18226794
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步