原来用不到画图工具啊——OO第四单元UML总结

一、本单元两次作业的架构设计  


 1>. 第一次作业

2>. 第二次作业

 3>. 架构分析

  首先这两次作业只需要实现规定好的接口(而且就一个)。所以结构方面变化性不打,也没有什么必要弄的很奇怪。

  所以第一次作业只写了一个类MyUMLInteraction,第二个类写了一个MyUmlGeneralInteraction,然后看上去还有一个类SixHundredLinePatch,其实只是为了避免超过六百行CodeStyle扣分而已(x)。

  然后由于这次没有什么效率代码优化超时限制,所以并没有很精细地去优化,其中有极大量的重复代码,本来可以提出一个通用的方法减少代码量,但是对效率也没什么帮助,大不了多写几个行数补丁类。所以上图中出现了大量红色数据。

4>. bug分析

  第一次弱测5和中测5卡了一天,然后最后发现是两个异常写反了。

  第二次中测5又卡了一天……然后发现是传入了两个参数s和s1,使用的时候用反了……

  然后强测没问题。下面是一些测试过程中出现的错误:

  • 经常会出现NonePointerException,具体错因遇见过两种。第一种是常见的ArrayList越界,指向Null,
    第二种出现在第二次作业的查重方法:checkForUml002();
    此方法要求查询每一个类的属性和对端的name是否有重复。
    但是对端会有无名的情况,这时候这个对端的name即为null,然后调用xxxx.getName()方法时得到null,再进行比较实用xxxx.equal()方法的时候就会报错。
  • 有一次出现了TLE超时,后来发现是死循环,在for循环的结尾不正确地使用了i--;
  • 之外便是各种细节,对指导书没有理解清楚。比如上述查重checkForUml002();方法。
    开始以为是属性的名字查重一次,对端的名字查重一次,后来发现是放一起对所有name一块查重。

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


 

第一单元——

  本次作业,需要完成的任务为简单多项式导函数的求解。

  基本作用是强行从面对过程编程的思路转化到面向对象的角度。
  第一次作业完全和之前面向过程的思路没有区别,一个主函数写下来,不是,一个Main类一个main方法写下来。到第二次分出几个类比如单项、求导辅助类等等,到第三次疯狂递归判断已经和第一次的结构有了极大的不同,但可能由于每次都强行继承上一次已有代码没有重构,导致越来越复杂,历史遗留问题严重,bug极多de了一年。

  另外主要掌握了正则表达式的应用(并没有掌握)。

第二单元——

  本次作业,需要完成的任务为多线程傻瓜调度(FAFS)电梯的模拟

  主要是对多线程编程的学习,已经习惯了面向对象的思想。第一次作业单线程也能完成,但是也让人大体理解了线程的思路,然后对编译器的使用理解更加深刻(x)。
  到第二次作业虽然仍然是单部电梯但是单线程已经无法运行,开始了多线程的代码。

  至于第三次多部电梯就完全要使用多线程的思想了,其中最重要的大概是多线程抢夺问题,线程安全开始考虑。

第三单元——

  本次作业,需要完成的任务为实现容器类接口,学习目标为JML规格入门级的理解和代码实现。

  这次开始就不是自己从零开始构建程序了,

  从第一次开始就是根据已有的接口和JML语言说明来实现具体功能,自由度较低,

  但是到第二次第三次虽然仍是实现已有方法,但具体实现过程自由度就很高了,并且开始考虑程序性能问题,

  主要思路包括选取正确的容器储存数据、明确各个类的使用频率然后将复杂的处理过程放到调用率低的输入输出方法中,尽量简化查询类方法。

  个人的理解是可能开始考虑多人合作完成大项目的问题了,故而学习JML语言。

第四单元——

  本次作业,需要完成的任务为实现一个UML类图解析器,

  学习目标为UML入门级的理解、UML类图的构成要素及其解析方法

  仍然是在已有开源库上进行接口实现。不考虑UML的话两次作业也没什么区别,都是在对开源代码和UML图充分理解的基础上完成目标方法。

  主要目的是处理数据,如何使用各种方法处理复杂的大量数据。

  从UML的角度便是如何将一张UML图以数据的形式存入程序并进行各种操作,

  第一次作业仅仅是类图,第二次增添了顺序图和状态图的相关数据与方法。


三、自己在四个单元中测试理解与实践的演进以及课程收获


  总体说来,首先是掌握了面向对象编程的思想,然后和别人合作完成一个较大项目的流程,对大量数据的储存与处理,对代码性能如何提升以及提升的重要性。
  分别分析的话。
  第一单元作业的话,多项式求导逐渐增添功能的过程中越来越复杂,
第一次体会到了面向对象的感觉以及大量代码互相协调的情况,以及对已有程序不断扩展的舍取。以及正则表达式真的神奇。
  第二单元作业,多线程电梯问题让我意识到了安全性的重要,
死锁自环什么的,如何安全又有效率地安排各线程的调度策略,生产者消费者的冲突与协调,对已有资源的充分不冲突利用。
  第三单元作业,表面上是学习JML语言,如何严谨的满足规格限制,如何把需求转化成严谨的JML语言。
但这些并没有什么难度,明显不是真正的主题,更重要的大概是代码优化问题,如何安排代码结构是程序更高效稳定,同时保证正确性。
  第四单元作业,是对 UML图的学习,但同样感觉也并不是主题……
因为就算没有把UML学习地很透彻仍然可以完成这两次作业,所以我觉得更大的作用是如果处理大量的复杂的数据,然后是如何将复杂的东西数据化。
也就是说对非数据信息如何编写程序进行分析。

 

四、给课程提三个具体改进建议

  1. 取消弱测最后一个点的隐藏数据。感觉未知的bug可以限制一定的分数,
    但不应该完全使此次作业无效,因为有时候因为一点小问题全部清零有些过度,就算多扣点分也更合理感觉。
  2. 讨论区对无效帖的判定应该更宽松一些,因为不同的人有不同的理解,
    各别的人有特殊的理解也存在合理性,耐心指出然后坟贴比较好,因此限制了讨论区的活跃性得不偿失。
  3. 指导书对于各种杂事应该更清楚地写出来,不要默认大家都知道怎么弄,比如外部导入包、类图分析什么的,
    虽然讨论区有同学写了教程,但仍然不是很清楚,其次明确此次作业如果想要完成需要自学什么内容,有什么建议额外学习扩展方向。

posted on 2019-06-24 21:05  曦芒  阅读(183)  评论(0)    收藏  举报

导航