UML绝唱 - 2021 面向对象程序设计第四单元总结
UML绝唱 - 2021 面向对象程序设计第四单元总结
第四单元的OO作业也是有一个 共同的主题 —— 即通过实现一个UML图解析器,其中需要实现的接口已经定义好,程序的运行(AppRunner)课程组也已经提供,因此只需要搭配合适的数据结构,以及各种方法调用,就可以完成这次作业。
在本单元还是比较肝的,不过我主要考虑更多的是合适的数据结构存储,以及进行各类查询时的遍历方式,保证逻辑的一致性。
1. 架构设计
这个单元由于自己选课学分过多的原因,临近期末实在是没有很多的时间花在了第四单元,但当周六晚上看见OO题目的时候,源码还没开始读的我就已经意识到了这次可能要无效作业了。胡乱的新建了很多类,写了一些代码,强行使用源码中的各种方法。当时我完全属于鲁莽的写代码状态,毫无框架可言。果不其然,经过了周日挤出来的 8h,作业无效了。后来和同学交流了一下代码,我决定还是规模性重构,更换了架构。
三次作业依然延续前面的风格,总第一单元迭代,这也给我的烤漆雪上加霜,本身时间不富裕,为了赶上末班车写出来的几个小时的代码基本全被换掉,既心疼又无奈。(第一次:类图解析;第二次:时序、状态转移图解析;第三次:各种检查功能)
下面是我的第三次作业架构:
2. 如何理解OO
经过了一个学期的 OO 学习,我从以前对 Java 纸上谈兵,已经晋升到了有一定代码写作能力的小白。由于我对项目组织能力基本之前没有接触过(所有的基础实现停留在 C 语言),而且开学初 3.6 左右才开始学习起了 OO,会写了 “Hello World”,到最后勉勉强强跟上各位大佬的步伐,我个人的这一点点进步已经惊讶到了我。
第一单元
由于 pre 的时候并没有 get 到面向对象的精髓,仅仅是通过了测试,因此 pre 的时候并没有给我留下任何有用的经验,那个代码我现在看来已经不堪入目了,实在是丑的惨不忍睹。
第一单元开始的时候是我开始学习 Java 语法的第 1 周之后的作业,令我重构的非常头疼。我实在是无法想象如何组织起来一个项目,最后导致了无效作业。有一次研讨课,听到同学分享的递归下降的语法分析,自己准备放手一搏,竟在300行左右就写好了递归下降求导分析,并完成了表达式树。OO 的一些设计思想,比如继承、多态、接口等,这些统统被我用进了第三次作业,第一次感觉懂了一些。虽然递归下降的过程依然很面向过程,但最后将一个表达式的各个部分分入不同的有继承关系树的对象中,感觉还是可以理解一点 OO 的意思了。
第二单元
经历了第一单元痛苦的重构,本以为第二单元的多线程稍微好些,结果依然是我的未知领域。自己只在课上听到了生产者消费者模型等等的东西,但我却最后用了一个事件驱动的模型描述电梯运行,导致了电梯赛跑的现象(性能并不差)。
由于第一单元已经基本达到了训练目的,所以这个单元使用第一单元的东西就比较自如了,但却在别的地方出现了问题。我用了一个线程组将正在运行的线程组合起来进行管理,由于直接对线程对象进行管理,虽然电梯的逻辑没问题,但管理的代码出现了严重问题,自己 debug 的时候也没有很好的嗅觉到这个问题,因此出现了很严重的电梯离奇不运行的情况,且不定期触发,这当时让我很摸不到头脑。最后作业被判了无效,强测的时候却有80多分,这就很让人伤心了。
第三单元
经历过前几个单元的轮番轰炸,我这个 Java 初学选手已经完完全全破防了。结果来到了 JML,突如其来的轻松,让我感受到了 OO 的快乐。规格的概念其实之前在 C 语言等地方有用到过,但并没有细细深究每一个函数(方法),不像 JML 这种描述,甚至有的时候写代码的比写 JML 的人写的代码要短很多,虽然提供一定的测试,但当有复杂的逻辑时,这种方法略显鸡肋。
第四单元
这个单元突然肝了起来,描述也是比前三个单元模糊一些。架构选择好了就可以完成这次作业,其余的就是各个结构之间的搭配和遍历查询的代码编写。
总结
我在这学期也在领导一些同学学习 DS,很明显 DS 的学习之前基本没有 C 语言数据结构的概念,他们只会意识到,从前我需要适应 C 语言的各种数据类型,需要符合很多的 C 语言函数调用规范,而如今我可以在 DS 的学习中学会自己组织自己需要的结构,自己需要的函数,各种各样丰富的自定义。
OO 也是这个道理。我们刚开始的时候学习的是 Java 程序设计基础,需要适应 Java 语言特性的 “万物皆对象” 的概念,开始简单的掌握各种各样 Demo 的写作方式,并尝试理解 Java 语言的行为特性。当到了 OO,思维转变到面向对象,我们就需要自我组织所需要的对象,可以用什么样的方式进行对象管理、调用,以及其他的各种操作。
3. 测试与实践
第一单元由于重构的头疼,知道可以使用 sympy 进行测评,但是没有进行实践。
第二单元使用自己的 WSL 进行脚本测评,但由于 WSL 是 Windows 的 API 翻译,不知道是不是被这个坑了一把,导致自己在本地跑和服务器上的不吻合。
第三单元使用了简单的 JUnit,但发现效果并不好,因此后来和同学进行了对拍。但由于第三次作业并不是很困难,所以即使不使用对拍,也可以轻松知道自己的 bug 大概在哪里。
第四单元由于时间实在是紧凑,无奈需要重构,因此测试方面依然交给了对拍进行简单的 debug 工作。
4. 课程收获
我感觉我的课程收获了非常多的东西:速成了 Java 语法,掌握了 Java 面向对象程序(包括多线程)设计方法,支持面向对象语言的通用设计思路等等,IDEA 各种插件、脚本、starUML、Junit 等工具的使用。上述这些东西全部在一个学期内有所涉猎,不敢说自己很精通,但也比开学初的自己强了很多。
难倒人的从来不是困难,而是自己的心烦意乱。那么就请继续坚持下去、不断努力吧,我这么菜都能坚持,你呢?
5. 建议
- 希望实验课可以公布答案和个人成绩,做到得分透明。
- 改变现有弱测的规则,当一个同学中测全部通过时,只有一个没有任何提示的弱测错误的时候被算作无效作业的时候内心是何种绝望,类似这种情况属实不应该按照无效作业处理。
- 单元顺序应该更换一些,不应该是先自己写自己的设计,之后引入规格。而应该是先有规格介绍,后会有更好的 OO 设计效果。我自己上来很懵,前两个难一些的单元各种奇奇怪怪的设计蜂拥出来,自己也不能判断哪个是正确的。