OOUnit4Summary

前三次作业的架构设计

前言

第四单元以uml建模语言为背景,让我们通过已有的模型架构,设计实现类图(顺序图,状态图)解析器;在理解uml整体架构体系的基础上,读懂并熟练运用官方的给的代码,设计有层次化的元素存储架构,本单元作业难度不会很大。

第一次作业

第一次作业只涉及类图的部分,包括类,接口,它们的属性,方法,它们之间的关联,类与类接口与接口之间的继承,以及类与接口的实现。此次作业的难度在于了解并熟练掌握官方代码提供的体系,并涉及出合理的结构管理数据。

本人采用的是层次化的数据组织模式:属性,方法,关联,继承,实现都交给它们属于的类或接口来管,方法参数交给对应的方法来管,宏观操作不直接管理。所以凡是拥有数据的,都单独开一个类进行数据管理,并提供对外的访问方法。

 

为了提高效率,本人几乎所有的查询项目都在模型建立好时就逐一算出,之后只需按需拿取即可,通过map集合,即可方便地实现这一点;然而成也萧何败萧何,由于map结构对于重复key的排斥性,本人在进行递深搜时直接无脑递归,无脑往map里面塞,导致强测有一个点超时;这其实很不应该,因为只要在往map加元素并递归调用前,判断map中是否有这个key即可,这也应当是本人想到的,也应当是本人长期训练以来养成的工程习惯。

第二次作业

第二次作业内容十分轻松,在第一次的基础上加上了对于顺序图和状态图的解析。有利第一次的基础,第二次在理解官方代码上不成问题,再加之顺序图和状态图远远没有类图复杂,此次作业本人完成的比较轻松,也为本人这个不学无术的菜鸡争取到了考期的关键复习时间。

此外,此次作业本人依旧采取层次化的结构体系,底层接口为顶层提供数据的访问方法。

可以看到,这次的类图只是在上一次的基础上加了一些东西。

本次作业强测并未测出bug。

第三次作业

第三次作业在前两次的基础上增加了规则的检查,但并没有检查UML的全部规则,只抽取其中主要的8条。比较有难度的是002的循环继承,003的重复继承,004的重复实现。但作为一个老递归选手,加上本人代码架构较为合理,只要思路清晰,这三条的检查不是很困难。其他的检查十分容易,本人部分检查采用底层检查,顶层汇总的方式(例如类的属性重名就在每个类中开展)。

此次的类图在第二次的基础上只增加了一个规则检查类,这完全是出于担心文件长度超500行的无奈。

本次作业强测并未测出bug。

二、四个单元中架构设计及方法理解的演进

第一单元 多项式求导

由于寒假预习作业的开展,本人对于面向对象编程有利一定的理解,但还是难以摆脱一些面向过程的习惯,对于一些通用的数据和方法,不能灵活的放在一个类进行管理,不能使得代码高度模块化,所以可扩展性也大大降低,所以每次新开作业都是别人迭代开发,我重构开发,尤其是第三次,本人吃了不少的苦头。

第二单元 多线程电梯

本人认为这单元是oo课程最难的一个单元,其刷新了我的认知领域;本单元,本人在理解并熟练应用线程同步互斥机制,有效睡眠防止产生轮询,保证线程安全,防止死锁等方面都遇到了不少的困难,在加上计算机调度线程的随机性,导致了 输出结果的多样性和难复现性,代码的调试工作变得异常困难。但有进步的是,本人吸取了上一单元的教训,深思熟虑并采取了良好的架构,如将调度器与电梯分离开等等,使得本人由单电梯到多电梯再到分类电梯的过渡都十分顺利,不像上一单元通篇重构。

第三单元 JML与人际网络

本单元的重点在于理解规格,架构上没有自己设计的部分;但本单元设计大量的图类操作,也考察了算法的复杂度,让本次作业不是死板地对着规格翻译。

第四单元 UML建模语言

本单元相比于上一单元十分注重架构的设计,在充分理解并熟练运用官方代码的情况下,架构设计甚至是本单元的核心。良好的,层次化的数据组织架构对于前两次的作业影响没有体现出来,层层剥茧和囫囵吞枣都能顺利完成作业,通过强侧,但良好的架构设计体现的是你对于UML体系的理解,也是一种良好的工程习惯,也会使得第三次的规则检查容易实现。

三、四个单元中测试理解与实践的演进

 本人在测试方面其实做的很不到位,这也是因为本人较菜,不像一些大佬一样,直接自动生成测试样例+自动运行+文本比较或正确性验证。

第一单元:本人采取的是十分原始的手动生成样例+自行求导计算并人工比较正确性,数据生成上,其实随机生成的数据远没有自行设计的有针对性和边界性的数据好,但正确性验证这一块本人还是有提升空间,事实上,指导书已经为我们提供了思路,将多组x的值代入进行计算;但是写计算代码对于本人这种学渣又是一个挑战(其实不是不会而是懒),遂放弃。而且本人查找到了关于表达式自动规整化的在线工具网站,直接把输出结果输入进去,再进行对拍。

第二单元:本单元本人写了一个验证输出的逻辑合理性的程序,相比上一单元有所进步,但数据构造上,本人要么自行手搓,要么copy上一次得到强测数据。事实上,本单元的错误大多在于线程安全,死锁造成的tle,逻辑上的错误只有看错指导书上的要求才有可能错,所以验证正确性意义不是很大。

第三单元:本人任然采取原始的方法进行测试,对拍;此外,本人还尝试使用Junit进行自动化测试,但效果不是很好。

第四单元:由于官方下发了由mdj文件生成数据的jar包,这给本人的测试工作带来了极大的方便,画出测试图,并直接手搓数据要方便的多。此外,虽然本人没能掌握随机生成数据的高科技,但却掌握了自动对拍的科技,在hw15的时候,一次性跑完hw13+hw14的所有强测数据,并且和同学对拍结果一致,这种安全感是无与伦比的。

四、课程收获

  • java编程能力的提升,能一晚上写出几千行代码;
  • debug能力的提升,能熟练运用各种已有的资源和技巧进行调试,有时甚至简单分析了数据后便能大致定位到bug的地方;
  • 学习能力的提升,由于本人较菜,有时候不得不在讨论区寻求答案,有时候还得参考大佬的博客,学习相应的算法,通过查阅互测人员的代码,也能从中学到东西。
  • 心态的提升,面对困难和bug能从容应对,在一步步调试陷入自闭的过程中,锻炼了本人的顽强意志。
  • 团结合作,为了能在强测中不拉胯,不得不抱团取暖,和同学交流对于指导书的理解,一起进行对拍,相互帮助,相互成长。

五、改进建议

以下建议仅为个人观点,采不采纳,都已经与本人无关了,但还是想提出,毕竟学弟学妹们并不是人均大佬,还是有我这种水平低下又希望得到游戏体验的人

1.提高中测的强度,每次作业中测的强度远远不够,虽然课程组也是希望通过此来激励我们自行测试以保证正确性,但有些作业的中测对于某些关键的部分居然直接不测,这是不可理喻的。当然课程组也有降低有效作业的门槛的考虑,但大多数人都是希望在强测中取得好成绩,而不是止步于有效作业,课程组应当考虑多数人的利益。

2.调整研讨课内容,据我所知,老师曾许诺过研讨课会邀请一些权威来进行讲座,但也许因为疫情原因,没能实现。虽说同学的分享也是否精彩,也十分有价值,但本人更倾向于前者的内容,同时希望学弟学妹能享受到我享受不到的更好的学习体验。

3.反馈实验结果,没有反馈的训练,效果是打折扣的,是事倍功半的,所以每一单元结束前都会有一次博客总结,但是每次实验的正确结果都没能得到反馈,如果是希望通过此提高实验试题的可复用性那我也没话说,但教学是与时俱进的,测试题目也也应当是与时俱进的。

六、线上OO课体会

由于本人没有体验到线下oo,所以应当为oo课体会。

不管怎样,oo课程让本人吃力不少苦头,几乎每周都有一两天要写代码写到很晚(没办法,本人实在是太菜了,不能像大佬那样瞬间秒杀),但oo课程体系还是十分完善的,理论课,讨论,作业中测强测互测bug修复一条龙,实验课,研讨课,一环扣着一环,环环相映。

随着博客的完结,这门课也迎来了末尾的钟响,本人收获还是有的,虽然作业不能像大佬那样此次次都拿到满分,但每次都成绩尚可;实验虽然不像大佬那样直接ak,但也是尽心尽力,做到最好了。最后,希望这么课程越来越完善,希望学弟学妹能从中得到收获。

posted @ 2020-06-15 03:05  mrqy  阅读(106)  评论(2编辑  收藏  举报