一、第四单元设计架构
这个单元除了要学习一些UML的知识外,基本和第一单元的作业比较像,算是一个比较朴素的面向对象的项目了。这个单元的代码量不小,但事实上我们所做的只是对UML解析的一小部分,大部分的工作和规范还是课程组帮我们完成了。
这次作业专注于UML类图的解析,笔者针对每个需要扩展的UML类图元素都进行了设计与维护。
此外对于各个元素所包含信息的特点,实现了从name到id的映射,以及从id到element的映射,这样不管是依据name还是id,都可以准确的查询。
这次的架构设计从可维护性、扩展性等方面来看应该是比较成功的。不过因为是从头开始解析UML,所以构思时花的时间比较多,这次作业的代码量也比较大,写了将近一千行,好像是这学期代码量最多的一次作业了(大概也反映了之前的作业做得不够好)。
不过这次作业对于某个要求理解有误,以及在对接口继承的查询算法上过于暴力,导致挂了几个点。
第二次作业
第二次作业增加了对UML状态图与时序图的解析,所要查询的信息都比较简单,量也比较少,所以依据第一次作业的经验,直接对原项目进行扩展,增加对Statemachine, Interaction, LifeLine, State这几个元素类的扩展与维护,完成得也比较快了。
第三次作业
这次作业基于之前对UML图的解析,要完成UML规则的有效性检验。
因为之前的架构还不错,比如在之前的解析中,笔者按照一定方式了类、接口之间泛化、关联关系;还有各个状态的后继状态也维护在了自己扩展的State类中。所以稍微修改一下就可以进行Rule004 ~ Rule008的检验。
不过前三条规则基本还是重新解析与检验。
同时为了避免又要对Element进行划分、解析时所带来的重复性的繁杂工作,以及减少时间复杂度,笔者设计的StandardPreCheck类直接与CollaborationInteraction, ClassModelInteraction, StateChartInteraction进行耦合,其中所需要使用的类直接从这三者中引用(需要特别注意,在使用的时候不能进行修改)。
(甚至笔者自己都觉得这个单元的架构设计非常美)
这次作业中测时和不少同学一样,一度卡在了Middle5,这也逼着笔者不得不反复检查,最后侥幸以一次满分作业完结了整个OO课程。
(太感动了)
二、四个单元架构设计与OO方法理解的演进
第一单元的多项式求导一方面在预习作业的基础上让我们进一步熟悉Java语言,同时在正课与讨论课上了解了一些设计模式,更重要的是理解面向对象的思想。通过这个单元狼狈、疲惫的三次作业体会到了架构设计的重要性。“高内聚,低耦合”可以说是印在脑子里了。
第二单元进行多线程的学习,大概也是因为学院课程的用心安排,OS也差不多在这段时间里进入到了进程与线程的学习,除了对Java语言中相应的工具进行学习和使用外,对各个线程间工作的协调配合有了比较深刻的理解。防止死锁可以说是多线程问题中的重中之重。
此外,对于应用到磁盘调度中的电梯算法在这个单元也进行了比较深入的学习、理解与使用。
第三单元很快就转到了JML建模语言的研究上来了。对JML的阅读和理解能力是这个单元所培养的基本功,正确的理解可以满足功能性需求,但对于非功能性需求——性能、维护性等等,则需要我们基于对算法的研究来完成准确、高效的任务实现。
也正是在这个单元,可以比较深刻地体会到:非功能性需求的重要性可能远远高于功能性需求。
这个单元也附带学习了连通图的相关问题。。。
第四单元在经过大半个学期面向对象的学习后又回到了针对面向对象的综合考察与锻炼。在这个单元,UML不仅是我们所研究的问题,更是在一方面促进了我们对架构的思考与面向对象的优化设计。课程组的安排真的是良苦用心了。
从整体到局部,再从局部到整体,面向对象的理解可以说在这个单元达到了巅峰。综合与抽象能力在这个单元得到了比较好的检验与提升。
三、四个单元测试的理解与实践的演进
刚开始第一单元时是比较兴奋,但同时也是各方面都非常不足的。最开始完全手动构造数据,这种方式虽然原始,但其实并不是不可取,因为很多边界条件、极端情况可能还是需要设计者自己来考虑。之后也学会了一些自动化检验的方法。后来又学习了快捷、高效地JUnit测试方法。不过到后来因为各课的工作变得越来越繁重,有的作业也没有认真地在课下进行自我评测了。
对于课程组的公测而言,在数据设置上不仅全面而且有梯度,部分测试点采用黑箱测试,这对于学生debug能力的培养还是不错的。而互测的安排可以说是本课程最具特色的一点了(褒贬不一吧,但总的来说应该还是好的)。
这里着重提一下第二单元的多线程问题的测试。多线程(进程)在测试、运行的时候往往具有不稳定性,很多问题可能不太容易复现。所以在测试的时候也需要把握互斥同步关系与各线程间的协调。
四、课程收获
首先,第一次发现原来学习一门新的编程语言还是比较快的。因为笔者寒假过于摸鱼,导致开学前两周才开始自学Java、做Pre作业,中间又花了四天去美赛打个酱油。大概十天不到的时间基本了解了Java语法。(以后对于预习作业还是认真完成吧。。。)
第二,对面向对象的理解当然是这门课的核心。
第三,代码能力应该是得到了比较显著的提高(事实上,上学期的计组也显著提高了笔者的代码能力)。但这里的代码能力不是说达到了一天五百行代码的成就,而是写代码前的问题分析能力、架构设计能力、综合与抽象能力、后期维护扩展的能力以及阅读代码的能力。
五、不负责任的建议
1、综合考虑所有同学,合理安排ddl,不要突然变化。
其实整个课程的ddl安排还是非常合理的,但Pre作业在开学前几天突然加ddl,以及第四单元博客ddl丝毫不考虑高工同学的烤漆情况,这两个问题还是挺让人糟心的。
2、预习作业增加一些指引。
印象中Pre作业里有一些不太清楚的地方,特别是第一个练习大家很多方面都还不太熟悉,摸索起来比较费劲。
3、预习作业更加有针对性与衔接性。
预习作业最好能和第一单元有一个衔接与过渡,这样会让同学们的体验更加;另一方面,第一次课上实验很多同学没提交上去,印象中这次作业的提交情况和预习作业里并不一致,这也给很多同学带来了麻烦,希望课程组能注意这一问题。
六、线上OO课程学习体会
整体上来说,OO课程应该是我这学期所有课程中体验最好的一门课了。一方面体系十分完善,不管在校还是在家,课程安排基本不变;另一方面收获非常多,这里就不再赘述了。
作为线上课程,每个学生可以根据实际情况调整播放速度,同时也可以进行回看,这对课程学习是非常有利的。
但不好的地方当然也有,一是对于课程中不理解的问题可能无法得到比较有效的讨论与解答;二是作业的完成过程中不方便与同学探讨问题、交流经验。当然讨论区以及水群的重要性就凸显出来了。
(顺便打一波广告)
欢迎关注微信公众号“开同学”,督促开同学定期给大家讲故事~。