前言
本阶段面向对象程序设计又进行了三次PTA训练,第一次(总第四次)还是接续上轮训练的试卷判分系统的程序设计,后两次都是新的电路设计训练题目。相对来说,第二次电路设计的第一次练习最为简单,第一次和第三次相对复杂。在这个阶段,我已经适应了PTA训练的题量和训练模式,并且设计起来更加得心应手。对于我来说,阶段性的总结确实有助于我在设计和编码能力上的提升。
知识点
- 类的设计;
- 数组、链表的使用;
- 封装、继承、多态面向对象的技术的使用;
- 抽象类和接口的使用;
- 正则表达式的使用;
题量
第一次:作为上一个题目的最后一次迭代,代码量最大,但是有之前做的基础,其实要修改的没那么大,最多的就是加一些内容;
第二次:新题,最开始要设计和写的量比较大,但是整体难度不大;
第三次:因为与上一次的输入等多种处理存在较大差异,所以改动比较大,新加了很多,写完达到了1200行代码,但是提交了两次就通过了所有测试点,也算是比较顺利。
难度
整体来说,新题的难度相较于原来的判题系统还是简单了许多。而且,现在更加注重了设计,因此迭代起来更加容易,更加得心应手。
设计与分析(第四次PTA)
类图:
设计:
本次设计17个类:
- InputMatching:对字符串进行匹配;
- ParseInput:对输入字符串进行切割和处理;
- QuestionMessage:题目的抽象类
- BasicQuestion:基本题类;
- ChoiceQuestion:选择题类;
- FillInQuestion:填空题;
- EmptyQuestion:空题;
- DeleteNum:删除的题号;
- WrongFormat:错误信息类;
- TestPaper:试卷号和判分的组合;
- Paper:试卷类;
- StuAnswer:答卷中一道题的答案
- Student:学生类;
- AnswerPaper:答卷;
- LastPaper:试卷、答卷、学生、学生答卷的组合体;
- DataStore:数据仓库;
分析:
从分析结果来看,存在以下问题:
- 整体来说,借鉴了老师之前的设计,让自己的设计更加合理了;
- 主函数中的函数许多可以分解到各个类中,但是堆在主函数之中就会代码的复杂度大幅度的提升,复杂度最高的点应该也存在于此;
- 在整体设计之中,并没有很好的使用接口和行为类,因此在很多类中的很多方法都显得很累赘;
SourceMonitor模拟:
- 最大复杂度超出了合理范围,问题主要在于有部分函数的复杂度太高,代码的MVC没有做好;
- 平局注释字句达到了8.9,大部分来自于自己写代码时的理解和对后期的规划,这是我编码上的进步,也是代码复杂度提升后的必然改变;
- 存在写了的代码最终没有去调用的僵尸代码,这是后期在规划时候需要对代码合理度进行求证;
较于上一次的进步:
- 是代码的清晰度,自己有着更加合理的规划了;
- 在编码的时候,有对自己的代码进一步拓展进行准备和合理设计;
设计与分析(第五次PTA)
类图:
设计:
本次设计类的数量较多:
电器类我用图的形式来展示关系:
- creator类:讲连接信息转化成一个一个的对象并且连接和存储起来;
- Adjustor类:遍历所有的调整信息,并且将调整落实到每个对象;
分析:
- 参考了之前学习的一些设计模式,将建造的过程和调整的过程交给一个单独的类;
- 将电器和调整信息的分类加以细化,运用多层抽象类,为了满足程序后期的扩展;
- 但是从后面的迭代来看,其实改动还是挺大;一方面,整体的框架是没有发生改变,这是一个可以庆幸的方面;另一方面,自己在设计的时候图方便并没有去考虑并联出现的问题,所以在后面改动的时候容器有了较大的变化,可能也是最初设计不合理导致的;
SourceMonitor模拟:
- 主要在计算电压和调整每个电器的相关参数的本分复杂度较高,这两个部分应该可以进一步职责分解
- 输出部分,运用了大量的if-else语句,代码的简洁度不够,可以在后期进行改进;
- 从调用的角度来看,其实代码中还有部分僵尸代码,这是最开始设计的时候存在的弊端,可以删去的部分;
- 在注释方面,有较大的进步;
设计与分析(第六次PTA)
类图:
设计:
本次电子元件和信息的框架和上次变化不大,最大的变化来自最终容器的变化:
这是一个电路类,设计目的是兼容并联电路:
首先电路是由干路和支路来组成的,我的想法就是将干路和支路都定义成Circuit类它主要有以下几个好处:
- 干路电路既可以存储干路中的电器元件,又可以存储一组并联支路;
- 支路相对独立,可以单独计算自己的电阻,可以单独判断自己是不是被断开;
- 支路的总电阻可以单独计算;
- 可以兼容后期的多重并联、多次并联,充分考虑可扩展性;
分析:
- 因为题目输入在上次的基础上改动较大,所以整体的代码变化也较大;
- 在使用Circuit类的时候,因为这个类包含自身,在存储的时候没有考虑周全,存储的层次存在问题,导致调用的时候语句繁杂,代码有失简洁性;
- 1200行代码,代码行数与很多人相比肯定是太多了,说明自己的解决思路和语句还是不够精简,还有提升空间;
SourceMonitor模拟:
- 总体上来看,虽然题目变难了,整体的复杂度还降低了,说明相对于前几次来说MVC做的更好了,整体的设计更加合理了;
- 可以注意的是,主方法的行数依然很多,自己检查后发现,将计算电压的部分放在主方法中依然是一个相对不太合理的设计,后期应该考虑将计算电阻和电压的部分交给另外一个类;
- 输出的部分我采用的方法是将所有的电器重新装进一个新的容器再依据类型进行排序和输出,输出的部分我认为是可以进一步简化的;
踩坑心得:
- 在编写需要迭代的程序的时候不仅需要考虑需要迭代的部分,还应该充分考虑和预测会变化的部分,将会发生的变化映射到代码上的变化降到最低;
- 容器的设计不仅需要考虑容器自身的性质,还应该考虑容器中东西的如何去储存,不要让容器成了累赘;
- 结果的输出不要图一时的快,应该更加考虑如何降低复杂度和运行时间
改进建议:
- 在实体类中有大量方法的时候,多想想是不是可以运用操作类来简化并且让代码更加清晰;
- 对于我来说,完成三次PTA最大的心得在于一定要做好设计再进行coding
- 阅读完所有的测定样例后再开始设计;
- 在设计的时候,尽量将类的用处分的更细,来完成SRP;
- 运用不同的容器、了解不同容器的性质可以让数据存储更加合理;
- 尽量让主函数的代码量降低,降低主函数的复杂度可以在迭代的时候改动更小;
- 减少main函数中的语句,尽量做到MVC,降低类之间的耦合性
总结
知识点:
- 类的设计;
- 数组、链表的使用;
- 封装、继承、多态面向对象的技术的使用;
- 抽象类和接口的使用;
- 正则表达式的使用;
建议和意见:
- 给出一些比较重要的测试点的测试内容,可以很大程度降低同学们修改程序的时间。