- OO 第四单元
- 一、第四单元架构设计
- 1.作业一
- 2.作业二
- 3.作业三
- 二、四个单元中架构设计 & OO方法理解的演进
- 1.第一单元
- 2.第二单元
- 3.第三单元
- 4.第四单元
- 三、四个单元中测试理解与实践的演进
- 1.第一单元
- 2.第二单元
- 3.第三单元
- 4.第四单元
- 四、课程收获
- 五、改进建议
- 六、线上学习体会
- 一、第四单元架构设计
OO 第四单元
UML——还算圆满的结局
一、第四单元架构设计
1.作业一
首先最顶层我创建了MyModel类,代表整个模型,在交互类中实例化一个MyModel。MyModel中分层构建模型。比如说最顶层的UmlClass,直接挂在MyModel下边,也就是说MyModel中有从ID和name到UmlClass的Map. 而像UmlOperation或者UmlAttribute是挂在UmlClass下边的,但是UmlClass本身没有提供存储这些内容的容器。这时候就可以用到第一次实验课的适配器模式了,创建MyClass类,里边除了存一个UmlClass之外,还可以存自己需要的内容,MyModel里的Map存这些MyClass。其他的类也是类似的,比如说UmlOperation下边要挂UmlAttribute,就也相应地创建一个MyOperation.
2.作业二
作业二新增了顺序图和状态图,这两种图从解析的角度和类图也没啥本质区别,关键点还是合理分层。我在这次作业中主要是扩展了MyModel的功能,把顺序图和状态图都加到了里边,但回头再看,其实可以把三种图分成三个类,层次关系更加明确。
3.作业三
作业三新增了合法性检查,我在MyModel里新增了相应的八个方法,MyModel类达到了490行左右,可以说已经有些臃肿了。把三种图分成三个类,每种图对应的检查规则放在对应的类里边会更好一些。
二、四个单元中架构设计 & OO方法理解的演进
1.第一单元
第一单元首先是强化了一下Java语言,为OO打磨好了工具。然后我印象比较深的一点就是性能和可扩展性的平衡。前两次作业如果采用比较一般化的方法,第三次作业就只是扩展,但是性能上可能会很难优化。前两次作业如果使用比较针对性的方法,到第三次作业就需要大规模重写。在实际应用中可能需要根据对未来需求的判断来做出选择。
2.第二单元
第二单元引入了多线程,是全新的体验。这个单元我认为蕴含的主要架构问题和OO思想就是信息的传递。像一些线程的控制机制,其实都是线程之间互相传递信息的过程。如果信息传递合理系统就能正常运行,不到位系统就会出故障。这个单元的最后一次研讨课上也讨论了更多的关于信息传递的内容,以后还需要进一步实践,加深理解。
3.第三单元
第三单元我认为强调的是大局观。表面上只要照着JML写就可以,但实际上容器和算法等的选择,需要先对问题有一个整体的认识,才能得到比较好的方案。
4.第四单元
第四单元我感觉是彻头彻尾的层次化。UML本身是层次化地描述一个模型,而我们又用层次化的OO设计方法去解析UML. 进一步说,就是哪些东西应该放在一起,哪些应该分开,哪些应该建立联系,建立何种联系。这些是一个设计、一个架构中最最根本的东西。
三、四个单元中测试理解与实践的演进
1.第一单元
第一单元主要采用了黑盒测试。我认为这是比较基本而且有效的测试方法。这类方法主要可以分为三个部分,数据生成,程序运行,结果比对。我利用python和shell搭建了一个简易评测机,也确实测出了自己和别人的一些bug.
2.第二单元
第二单元由于感觉多线程这块理解起来比较困难,在测试上花的功夫相对少了一些,采取了手搓数据,肉眼评测这种低效但容易实现的方法。经过最后一次研讨课上同学的分享,我意识到其实当时应该考虑和其他同学一起开发测试系统,通过合作来弥补时间上的不足。
3.第三单元
第三单元引入了Junit这种测试方法,但是我对Junit的使用还停留在熟悉和尝试的阶段,使用Junit测一些简单的手搓数据,算是对大规模黑盒测试的一种补充。
4.第四单元
第四单元数据生成稍微有些麻烦,所以尝试了新的“测试”思路——和舍友互相讲自己的实现逻辑,互相挑可能出问题的地方。我认为这是个还不错的办法,可以有效减少需求理解上的偏差。
四、课程收获
最大的收获是初步理解了面向对象的思想。只有在面对需求的时候,我们才能真正理解为什么要层次化,为什么要封装。尤其是在挂掉强测,并且发现面向对象思想贯彻得不好要背一部分锅的时候,感受会更加深刻。
副产品还有学会了Java语言的基本用法;体会到了测试的重要性和方法;学会了一些工具的使用(git, markdown, shell脚本等);感受到了设计模式的重要性。
五、改进建议
-
多线程和之前接触过的程序设计跨度比较大,刚上手可能会觉得不太适应,可以考虑在预习阶段增加一点多线程的内容。
-
对于我们要用到的工具可以发一些基础性的讲解。诚然全靠自己探索可以加深我们的理解,但是同学们的时间是有限的,课程组稍微引领一下,更有利于同学们去探索深层次的用法。
-
实验课体感不太好,如果在实验后持续开放题目,并公布评测结果和参考答案学习效果可能会更好。我猜测课程组是为了保护题目才没有提供这些内容,所以我有一个建议是大幅下调实验课在总成绩中的占比(仅占5%或10%),并且对于实验课采取参加即给分的规则,这样就算有同学从上届要来答案也没什么意义,引导大家抱着学知识的态度去参加实验课。这部分分数可以放到平时成绩(鼓励大家积极参加讨论)或作业(鼓励大家更认真地设计和测试)中,都是不错的选择。此外,实验课内容一般是作业的预热,从这个角度来看,把实验课的分数放到作业上是合理的,如果实验课不好好弄就会在作业中还债,对实验课摸鱼可以起到抑制作用。
六、线上学习体会
我认为OO是所有课程里,对线上学习适应得最好的一门。OO开设了研讨课促进大家的交流,理论课后老师也会在群里引导大家讨论,在此感谢课程组的投入。
当然,OO也会承受一些共性的问题,主要是失去了课堂的氛围,还有和老师同学的交流成本比较高。对我而言,我还是更喜欢以前的教学模式。