• OO第四单元博客


    一、本单元三次作业总结

    1、第一次作业

      我觉得第一次作业最大的难点其实是对给出的代码的理解,刚开始看到一堆json什么的代码就一点也不理解……直达这个单元结束,对好多官方提供的代码还不是很明白(后来发现主要理解那些elements就可以完成作业,对别的代码也就没有深究)。第一次作业主要是考虑类图的理解,个人感觉在明白那些各种elements中包含的属性有什么、以及这些属性的意义之后第一次作业也就比较简单就可以完成了。因为看到指导书中善良的CPU时间的限制,也就没有进行太多对时间上的优化,暴力的arraylist就可以顺利解决问题。(对于第一次作业各种元素的理解,推荐一个博客https://blog.csdn.net/weixin_43723467/article/details/90718079

      在设计架构上,是按照直观类图中,各种属性或者元素的归属关系来设计的。建树的时候循环遍历,根据元素的类型是什么,来划分它应该属于哪个类里,并加入其中。设计一个MyUmlclass类,里面包括umlclass、父类、属性、操作、关联的类、实现的接口。MyInterface类,里面包含umlInterface、和继承的接口。这种很简单直观的设计,也很容易去完成第一次作业的那几条功能要求。(因为感觉第四单元的作业主要目的是帮助我们理解uml的各种图和一些规则,对代码的性能和实现其实没有那么多的要求,稍稍理解之后也就比较好做了)

    2、第二次作业

      和第一次作业相比主要是加入了顺序图和状态图,看到那些查询的指令,继续按照第一次的思路就可以完成,把应该属于顺序图的东西放到自己新建的顺序图类中,属于状态图的元素放在状态图中。而且这次作业的迭代其实少了很多的压力,因为之前第一次作业的代码不需要什么太大改动,只是在建树的时候加入一些对新的种类元素的归属判断就好。

      新建一个MyRegion类,里面包含umlregion、state和transition。新建一个MyUmlInteraction,里面包含umlInteraction、lifeline和message,因为作业里面的查询指令更多涉及的只是简单的查询,稍稍复杂一点的操作也可以递归解决,同样CPU时间善良依旧。第二次作业的理解很感谢讨论区搬运的贴子,对于理解元素的意义和各种属性有很大的帮助,节约很多精力和时间。第二次作业比较伤人的其实是每个文件中代码行数的限制,超过500行就要checkstyle扣50分,而且import的时候使用*的话也会扣分,不用*的话又会增加很多行数……我就选择新建了一个Method的类,里面主要用于存放在建树的过程中,把各种元素分别加入对应的类中所需要的方法,来减少generalInteraction的行数(但因为传入参数数目的问题和使用*还是被扣掉一些checkstyle的分数,还是我的结构设计方面有缺陷吧,一点菜)。

    3、第三次作业

      第三次作业中主要加入了标准检查的功能,按照高内聚低耦合的设计原理,也是为了避免超过500行的尴尬checkstyle,我选择了新建一个类MyUmlStandardPreCheck类来实现标准检查。在设计的时候我有思考要不要利用之前已经建好的树,把建树之后已经分配好的元素传进这个类里面,再进行判断,但是我发现在检查的功能里面,有一些东西是建树的时候我没有详细考虑的,要是把建树之后的结果传进来就面对着修改之前的很多代码的问题,甚至我之前设计的自己创造的类也要也要增加一些属性,个人觉得可迭代性虽然还可以但是要修改的代码比较多,所以最后就选择把所有的元素再传到这个标准检查的类里面,减少对之前的建树结果依赖,也就不用修改之前的代码,只需要根据这次作业的需要,单独完成就可以,缺点就是要重新进行一下类似建树的工作。在决定这种设计之后,基本就完成了一半的工作,剩下的就是实现相应的检查,对于一些很直接规则的实现就老老实实按照要求去做,对于像R002、R003、R004这种规则,我就选择了比较简单朴素的bfs和dfs算法,还好时间上这单元的作业没有卡我们。

      总结一下这个单元的作业,给我的更多感受就是没有很为难我们,更多的其实是考察我们对uml类图、顺序图、状态图组成的理解和一切标准规则的理解,在代码实现性能和结构方面也没有卡人,还算是很舒服的一单元作业,只是最开始的理解和实现会麻烦一点、花了一些时间,但相应的收获还是值得的,而且经过代码的实现,确实对图和规则的理解有很大的帮助。

    二、四个单元OO方法理解

       第一单元的作业是求导,在第一次作业的时候我的写法就很面向过程,缺少层次化的设计,使得在第二次作业的时候面临很大规模的重构,第三次作业的时候也需要一些重构……花费的时间和精力比较多。在第一个单元的学习中,我学到了工厂模式这个设计模式,也开始对java的 编程语法开始熟练很多,对像是arraylist、hashmap、hashset这种的容器使用比较熟练,对正则表达式有了一定的理解和掌握。更多的是学会继承、多态这种面向对象的结构和构造思维,经过一次次的惨痛重构教训,学到一点怎么让自己的架构可迭代性强一些。

      第二单元是多线程,最重要的点是理解了生产者-消费者的设计模式,在实现的时候会选择设计一个调度器,来为电梯分配任务。通过对多线程和死锁的认识,让我看到线程安全的重要性。通过一次作业的爆炸,让我明白,这种多线程的编程中,更多需要每个层次执行自己的任务,而且线程之间要尽量减少直接的交互,synchronized的控制范围要小心谨慎。需要追求性能和正确性。在第二单元的学习中,更多接触了一些面向对象的思想和原则:Single Responsibility Principle、Open Closed Principle。

      第三单元是JML,我更多学到的是一种契约式编程的思想,通过规格去交代任务,更多离散数学一点,减少了很多的歧义性,任务传达也更加清晰。使我感触比较多的就是在实现规格的时候,不要紧紧盯着规格的方法,要明白表达的意思之后自己进行适当的方法选择,在实现的时候,容器选择对最后的性能有很大的影响,对一些耗时很多的操作,可以通过缓存的思想减少多次查询时候从头遍历所需要的大量时间,最重要的是设计和实现分离,自己去向合适的架构。

      第四单元是UML,我学到了用UML的多种图来表达程序的架构设计,让程序的逻辑更清晰。在实现的时候也感觉自己的层次化架构设计有很大的进步,具体细节之前已经介绍过,不再多说。

    三、测试理解与实践演进

      测试驱动开发,通过自己先想一些测试的样例,决定自己实现代码的细节,再用这些样例反过来测试写好的代码。测试的时候尝试过利用写好的程序自动测试,更多采用的还是手动构造测试的数据。在后两个单元学习了JUnit单元测试,自己尝试利用这个工具测试了一些方法(但感觉junit的测试数据也是自己手动构造)。反观每次自己的bug程序,还是测试不够全面,测试的量太小,测试是从程序构思到完成,一个贯穿始终的很重要环节。

    四、课程收获

      1、提高了自己的代码能力

      2、checkstyle对代码风格有了很大的规范作用,好的编程习惯提高可读性、让思路清晰

      3、从零开始学Java,设计有了很大的层次性的提升,高内聚、低耦合,代码有了更多的可扩展性,层层抽象的思想方法要贯穿始终

    五、课程改进建议

      1、每次实验之后发一下答案或者解析可好

      2、多讲一下第二单元关于线程的调试、debug方法,或者多提供一点点资料

      3、第三单元最后的openjml那些工具感觉并没有在测试中真正起到很大作用(我个人没有太多使用),而且需要花费很多时间,感觉有点无用

    六、线上学习OO体会

      线上学习OO多了很多的自主性,自己选择看网课的时间和速度,线上的研讨课也很生动及时,很好的解决了作业中出现的一些问题情况,也能向很多大佬学到方法。自己感觉线上教学对OO的影响没有那么大,因为讨论区和微信群的使用,很大程度解决了很多的问题,也很及时。(给每个单元最后的活泼问卷点个赞

      最后,感谢老师和助教的付出,OO真的是一门良心好课,至少我很喜欢而且学到很多东西,希望北航OO越来越好!

  • 相关阅读:
    Push UIViewController with different orientation to previous
    shouldAutoRotate Method Not Called in iOS6
    UIScrollView中图片放大后不居中,或居中后移动有偏差解决办法
    iOS7隐藏状态栏 status Bar
    【struts2】Struts2的系统架构
    【struts2】核心概念
    【struts2】struts2的execAndWait拦截器使用
    【struts2】<s:url>标签
    【sql】CHARINDEX
    【js】在js中加HTML注释标签的原因?
  • 原文地址:https://www.cnblogs.com/whitering/p/13155199.html
Copyright © 2020-2023  润新知