OO第四单元总结(UML系列)
第四单元架构设计
第四单元需要设计类图分析器,其中还包括了时序图和状态图。总体而言分为两部分,前一部分是存储,后半部分是统计。对于存储,我使用了一些容器来存储对应的元素,同时建立起元素之间的联系,对于统计问题,我使用了各种方法来进行获取和计算,其中比较需要注意的是继承问题,需要遍历父类、父类的父类等,要着重考虑。下面是主要的类:
可以发现其中包含了Class、Interface、State等类,主要用于存储各类元素,在进行统计获取时,只需要在对应的类中进行统计,然后将结果返回就可以了,比较复杂的是第三次作业的有效性检查,虽然仅仅是多了八个检查的方法,但是在实现时还是会遇到很多的麻烦,比如如何判断循环继承、如何判断是否重复实现了接口等,需要仔细的考虑,要通过对整体结构的把握进行实现。总体而言,本单元的难度处于中等水平,感觉也还好,作为最后一单元,比较符合我们的预期。
课程演进
表达式求导
最开始的内容是表达式求导,这一部分比较具有特色,对于初学面向对象的我而言,难度也是稍微有一点大,特别是第二次作业开始有了括号嵌套之后,之前的合并方法已经不再适用,经过反复的构思,受到各种思想的启发,终于找到了表达式树这一途径,即将符号放入根节点中,而叶子节点存放常数或者类似于x、y这样的变量。于是,只需要对表达式树进行遍历一次,然后再规定各类求导的法则,即可以得到最终的结果。当然这样的方法得到正确的结果不算困难,但是后期的优化却也是个问题,想要做到最大程度的优化,那是无疑要花费很多脑筋的,对于各种合并、去括号,都需要综合考虑,因而本单元的题很具有训练意义,对提高我们的程序水平很有帮助。我也从中收获了很多,这为我后期的几单元作业打下了坚实的基础。
电梯调度
事实上,每次碰到新的一单元的题目,往往感到手足无措,比如这次的电梯调度,涉及到多线程,我也算是第一次接触。之前的一次上机实验中有了关于多线程的程序结构,我仔细的分析探索,发现依然有很多不适用于这次作业的地方,再加上我对notify、wait理解不深,因此遇到了一定的挑战。后来我依然不断探索,掌握了基本的生产者、消费者模型,然后又学会了ALS调度算法,最后结合各方面的线程思考,已经能够顺利的完成了这次作业的架构。这也算是我的思路吧,我一般都是喜欢先做出正确输出,然后再考虑优化的问题,比如这次,对morning、random和night的分析处理是后期需要着重考虑的问题,如何让电梯合理高效的运行,需要我们仔细琢磨。本单元在了解多线程的同时,也进一步强化了我们对算法的认知以及优化的处理,使我明白了解决一般问题的大致步骤,收获颇丰。
JML语言
这单元比较有趣,是根据JML规格明确各方法的含义,从而进行填充写出程序。大部分的规格都比较简单,只有少数几个比较复杂,一方面涉及算法,另一方面对效率的影响也很大。为了实现这样一个社交网络,我们需要整体把握网络的结构,并与我们自己的实际生活联系起来,才能更好的理解其中的含义。其实读懂JML语言并不难,难就难在有几次上机实验中要求我们自己书写JML规格,这就比较头疼了,只能说见多了就会了吧。对于几个重点方法,比如sendIndirectMessage等,需要使用迪杰斯特拉算法来完成,这也帮助我们复习了数据结构中的内容,并且java和C语言两种方式的写法,也增强了我们读各种语言代码的能力。这单元开始引入异常类,让我对try、catch、throw、exception都有了很深刻的理解,总体而言程序水平正在不断提升。
UML系列
最后一单元是统计类图、时序图和状态图的各项指标,同样的,需要我们花费一定的时间去理解,所谓万事开头难,这一步是万万不能省略的。最后形成的想法是,先将各类element对应的存放在各种容器中,有Hashmap、ArrayList等,其中分为了Myclass、MyInterface、MyOperation等各种大的类别,从而建立起来各种元素之间的联系,于是在后续的get方法中,就能够比较方便的进行获取与统计了。这其中需要注意的细节比较多,我们要仔细,特别是最后一次作业的有效性审查,其中有一些概念表述的不是很清楚,需要我们反复琢磨,保证万无一失。
课程收获
学完OO这一学期的课程,我的收获是很多的,对各类算法、编程风格等都有了系统性的理解,同时我的思维能力得到了提升,这对我以后的学习生活都提供了很大的帮助。在这四个单元的逐步推进中,我渐渐的熟悉了面向对象的道理,学会了如何设计架构,如何去优化算法、调整编程风格,尽量符合工程性的设计,以满足未来可能的各种要求。只有经受过挑战,才能真正懂得其中的真谛,才会留下深刻的印象。计算机领域还有很多内容等待我去探索,值得我去研究,就拿java来讲,想要真正设计出一款软件,至少我还得学习一些可视化的东西,这也是比较关键的一个部分,只能等将来在探讨。
体会与建议
体会
本课程的教学模式还比较好,能够很好的提高学生的能力,让学生保持对知识的渴望,像课下作业和上机实验都很能提高学生的能力。但是,平时的理论课和研讨课我感觉作用不大,理论课的课件比较抽象,有点让人不知所云,不够具体,不知道要表达什么意思。对于研讨课,事实上我感觉也没什么必要,平时对于一些架构问题,题目的各种坑点之类的,在课程的讨论区和班级群里面一般都讨论完了,再在研讨课上进行讨论,属于是比较重复低效的行为,如果说是为了锻炼学生的口才,那还可以考虑考虑。
建议
1、对于每次作业,往往存在一些表述上的不严谨或者字面意思不够清晰明了,应当在之后进行改进,以免出现误导学生的现象。
2、对于理论课,建议加入一些实质性的东西,而不是泛泛而谈,否则学生的收获并不大。
3、关于研讨课的内容,建议让学生讲一讲自己对某个特定的方面的独到见解,而不是总览的过一下自己设计的结构、代码,因为每个人都自己设计过,而且事实上别人的设计与自己的一般也没什么大的区别,比如第三单元JML,结构都固定了,各种深度优先遍历、迪杰斯特拉大家也都熟悉,事实上也没必要反复说。可以尝试让学生课下自行探索一个有关面向对象java的其他领域,然后上课的时候给大家做个介绍,这样一方面可以拓宽学生的视野,了解到更多的内容,同时学生们一般对未知的东西问题也比较多,就不会出现很多人都不愿意举手提问的现象。