面向对象设计与构造 第四单元总结
本单元作业的架构设计
感觉这个单元和上个单元一样,没有什么架构的。
我的做法大概就是根据需求,设计自己的MyClass
、MyOperation
等类,然后实现需要的功能。对于继承、实现等关系的询问,建出对应的图后暴力解决。
对于\(9\)种合法性检查,建立\(9\)个类分别解决。
这样代码行数可以通过缩行勉强控制在\(500\)行内,但后面想了想,还有可以改进的地方:比如可以再进行进一步的封装,再多一个类图、顺序图、状态图的层次;还有讨论区提到的,异常的层次化处理等,也可以提高代码的复用性。
架构设计思维及 OO 方法理解的演进
第一单元
初识面向对象,在表达式化简这个任务中初步体会了各种面向对象的思想。
比如,加减乘除乘方等运算可以通过实现接口实现;对各种概念的形式化表述本身也体现了面向对象思想,常数、变量、项、表达式因子、表达式等都可看作是对象。
在这一单元也体会到了架构设计的重要性,由于完全没有考虑程序的可拓展性,在第二次作业时进行了重构:递归下降解析表达式,再用类似表达式树的方法进行化简。有了这次的教训,在后面的作业中我再也没有重构过一次。
第二单元
初识多线程,主要学习了一些基本概念,包括几种设计模式(生产者-消费者、观察者等),用wait
、notifyAll
进行简单的线程操作,用synchronized
确保线程安全性。
架构方面选择了看起来比较简单的生产者-消费者模式,调度器作为托盘,与输入请求和电梯进行交互。
在这一单元我体会到,多线程和面向对象是密不可分的,线程可以看做是一个对象,多线程也就是要处理对象间的交互。
第三单元
学习了 JML 规格,一套确保代码实现正确性的语言。
在这一单元中,体会到了确保设计的正确性的重要意义。
第四单元
学习了 UML 语言,一种面向对象式的抽象又直观的描述逻辑。
在这一单元中,我理清了很多一直以来比较模糊的概念,尤其是对象间的各种交互方式,这让我更深刻地理解了面向对象的思想。
测试理解与实践的演进
一开始对测试的理解:测试就是测代码的正确性,写一份正解代码和一份暴力代码,随机生成数据进行对拍。这样的理解是片面的。比如第一、二单元都不能用这样的方式进行测试。
在 OO 课程中,我对测试有了新的理解:
1、测试的内容除了正确性,还有程序的效率、鲁棒性等。比如在第一单元,我就没有注意程序的运行效率导致在强测中超时;在第三单元,需要注意各种极端的图,如一条链的情况是否会导致递归爆栈。
2、测试的方法是多种多样的,也会用到很多不同的工具。比如第一单元大家普遍用 Python 的 sympy 库,第二单元则需要自己写程序判定输出的合法性。
3、测试一定要注意数据的覆盖率,也就是最好保证生成的数据能让程序中的每个语句都有执行的可能,这也是 JML 规格测试时需要注意的:不能只在黑盒层次开展测试,而是需要对类、方法和接口进行测试。
在实践中,我第一单元借助讨论区的教程借助 Python 的 sympy 库进行了测试,第二单元手动对极端数据和随机数据进行了测试,第三单元写了可控制每条指令百分比的数据生成器进行对拍,并手动测试了极端数据,第四单元则没有测试。
课程收获
知识方面
Java 的基本语法、多线程相关知识、JML 规格、UML 语言。
思想方面
用面向对象思维拆解并解决问题的思想、各种设计模式思想、函数式编程思想等。
能力方面:
短时间阅读代码的能力(实验课)、查阅资料解决问题的能力。
具体的改进建议
1、加强中测数据。我觉得中测数据不论数据本身的强弱,至少应该保证覆盖题目给出的全部情况,比如最后一次作业,中测数据应该是包含了 R001~R009 的全部情况,这是比较理想的。而第三单元的某一次作业,我和同学对拍,发现她最小生成树的答案为正确答案的两倍,依然通过了中测,这说明要么没测那个指令,要么答案全是\(0\),感觉这样不太好。
2、在学习多线程的第二单元,多提供一些预习指导或者资料。第二单元是我个人认为难度最大的一个单元,因为多线程对我来说是一个全新的知识体系,当时操作系统也没有没学到多线程的知识,而且它本身也比较抽象,各个线程之间的运行情况也不太好察看,有时候只能靠自己想。我认真听了第二单元的理论课,完成了训练,但还是感觉很迷。希望以后能多提供一些指导。
3、第三、四单元的问题,但具体的建议我也没太想好。第三单元学的是 JML 规格,第四单元学的是各种 UML 图,我总觉得这两个东西都应该注重进行理论学习,而不是写代码。比如第三单元,我感觉 JML 的阅读基本不会成为问题,因为我还没学的时候直接看也基本能看懂个大概,难点是 JML 的书写,但写代码的时候就是大模拟,对写 JML 没有太大的帮助;第四单元同理,应该是要学怎么看和画 UML 图,结果又写了一大堆代码,也是大模拟,没有像一二单元那样,代码比较符合面向对象的特征,而且总感觉第四单元的知识应该放在 pre 学习的,因为 pre 的最后一个任务是画类图,但是那时候完全不懂,所以基本是乱画的,如果在 pre 就学了可能会更好。当然我也理解每个单元的大改都要助教团队、老师团队付出很多时间精力,所以仅发表一些个人看法。