前言
本阶段面向对象程序设计进行了两次PTA训练,两次都是关于电路设计的迭代。迭代次数越多难度越大,后期事情较多,作业和考试任务重、题目的难度也较大,所以没有拿到每次作业的满分,但是都根据题目的变化对自己的设计进行了一定的改变和优化。
知识点
- 类的设计;
- 数组、链表的使用;
- 封装、继承、多态面向对象的技术的使用;
- 抽象类和接口的使用;
- 正则表达式的使用;
题量
这两次迭代因为之前的设计不适用,都做了较大的改变,因此对我来说代码量很大,但是最后一次迭代的时候也是找到了一个方法可以适应各种电路变化,也算是在方法上解决了问题。
难度
两次迭代改变难度逐渐变大,到最后如果设计不合理,也是很难应付;但是总体来说,也是需要很多时间去合理改进和修改。
设计与分析(第七次PTA)
类图:
设计:
本次设计类的数量较多:
电器类我用图的形式来展示关系:
大部分与上次相同,具体请参照第二次blog,此处仅介绍新加部分:
- Curtain部分:自动窗帘类的抽象类;
- S:题目给出的自动窗帘设计的类,通过总亮度来控制自己的值;
- MutexSwitches:互斥开关的一半,控制和开关相同,存在闭合和断开的状态;
- MutexSwitchesControler:其中有两个MutexSwitches的对象,通过遍历来寻找匹配的两个对象,通过这个类将两个互斥开关的小部分进行区分和统一变化;
分析:
- 参考了之前学习的一些设计模式,将建造的过程和调整的过程交给一个单独的类;
- 新加部分用电器,在互斥开关这种需要统一变化的,采用设计一个整体的控制器,化解了存储的问题;
- 本次迭代的问题主要还是在于设计的电路和遍历、存储方式没有扩展性,没有办法在电路变复杂的情况下继续使用,并且没有将控制器当作一个用电器,导致需要单独存储,不是很方便;
SourceMonitor模拟:
- 主要在计算电压和调整每个电器的相关参数的本分复杂度较高,在当时并没有做较好的优化,没有计算很复杂,循环很多,职责也不单一;
- 输出部分,运用了大量的if-else语句,代码的简洁度不够,可以在后期进行改进;
设计与分析(第八次PTA)
类图:
设计:
本次电子元件和信息的框架和上次变化不大,最大的变化来自最终容器的变化(因为上次设计的容器已经不能胜任这次的迭代了,所以进行进一步的设计):
设计了两种电路:
此外,每new一个新对象,就把他放进两个不同的容器,一个用于调整状态和遍历,一个用来计算电路,降低了后面的遍历的难度;
- 并联电路:含有串联电路的集合;
- 串联电路:含有电器和并联电路的总集合;
- 干路电路既可以存储干路中的电器元件,又可以存储一组并联支路;
- 支路相对独立,可以单独计算自己的电阻,可以单独判断自己是不是被断开;
- 支路的总电阻可以单独计算;
- 可以兼容后期的多重并联、多次并联,充分考虑可扩展性;
分析:
- 首先是在设计电路的时候,整体兼容性更强了;
- 其次,在遍历求电阻电压电流的时候,运用了递归的方法,使整体的难度和难度大幅降低,代码量大幅降低;
SourceMonitor模拟:
- 总体上来看,虽然题目变难了,整体的复杂度还降低了,说明相对于前几次来说MVC做的更好了,整体的设计更加合理了;
- 求电阻电压电流的过程复杂度大幅度降低;
踩坑心得:
- 在编写需要迭代的程序的时候不仅需要考虑需要迭代的部分,还应该充分考虑和预测会变化的部分,将会发生的变化映射到代码上的变化降到最低;
- 容器的设计不仅需要考虑容器自身的性质,还应该考虑容器中东西的如何去储存,不要让容器成了累赘;
- 如果一个部分用普通的循环十分复杂,需要考虑其他的方法,而不是一味的堆砌代码复杂度;
改进建议:
- 在实体类中有大量方法的时候,多想想是不是可以运用操作类来简化并且让代码更加清晰;
- 对于我来说,完成PTA最大的心得在于一定要做好设计再进行coding
- 阅读完所有的测定样例后再开始设计;
- 在设计的时候,尽量将类的用处分的更细,来完成SRP;
- 运用不同的容器、了解不同容器的性质可以让数据存储更加合理;
- 尽量让主函数的代码量降低,降低主函数的复杂度可以在迭代的时候改动更小;
总结
知识点:
- 类的设计;
- 数组、链表的使用;
- 封装、继承、多态面向对象的技术的使用;
- 抽象类和接口的使用;
- 正则表达式的使用;
建议和意见:
- 整体来说,pta的测试确实提升了同学们的设计和编码能力,是一个有力的工具,确实需要沿用;
- 其次,希望后期的作业也可以考虑同学们的时间安排,有时候有考试需要准备的话就没什么时间去完成pta作业,因为pta确实是花费时间的。