前言
第四单元以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能从容应对,在一步步调试陷入自闭的过程中,锻炼了本人的顽强意志。
- 团结合作,为了能在强测中不拉胯,不得不抱团取暖,和同学交流对于指导书的理解,一起进行对拍,相互帮助,相互成长。
随着博客的完结,这门课也迎来了末尾的钟响,本人收获还是有的,虽然作业不能像大佬那样此次次都拿到满分,但每次都成绩尚可;实验虽然不像大佬那样直接ak,但也是尽心尽力,做到最好了。最后,希望这么课程越来越完善,希望学弟学妹能从中得到收获。