zoukankan      html  css  js  c++  java
  • OO第四单元总结

    一、本单元作业架构设计

     

      本单元涉及的内容较为复杂,在模型建构方面,我就花了较大的功夫,而且代码量也相比之前的几次作业来说有着巨大的提升,极大的考验了我的抗压能力以及将UML模型需要转化成为面向对象语言的能力。

    第一次作业

      在本次作业中我采取的基本思路是对UML类图中的元素进行分类,对能相似处理的元素成立专门的类来保存其中的相关关系。我主要采取hashmap完成类图中的元素关系的建立,例如类中包含的属性、类的继承关系、接口的继承关系以及类/接口之间的关联。在myumlinteraction的构造函数中完成各个类的实例化,完成hashmap的建立,在之后的查询中,只需要查找对应hashmap就可以得到元素间或元素与其属性间的相关关系。这次作业比较复杂的地方在查找类实现的接口,这里我采用了dfs算法进行实现。

    第二次作业

      本次作业是解析顺序图和状态图,我在第一次作业的基础上进行了拓展,本次作业的方法实现起来相比第一次简单。我新构建了StateMachinecontainner和Interactioncontainer分别用于存放状态图和顺序图。同样是使用hashmap进行元素关系的建立。

    第三次作业

      本次作业的任务是实现模型有效性检查,其中较为困难的是重复继承与重复实现的有效性检查。

    针对重复继承我采用了bfs遍历,对已访问过的类或接口建立集合,若之后访问到的元素在集合中出现过,则判定为重复继承。

    针对重复实现我同样采用bfs遍历,对已访问过的类或接口建立集合,先判定将当前类实现的接口是否已访问过,若是则重复实现,若不是,再将当前类的父类及实现的接口全部加入队列中,确保不遗漏父类所实现的接口。

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

    第一单元 - 多项式求导

      一开始,刚刚接触OO的我对于老师与助教不断强调的"架构"的理解懵懵懂懂,而程序设计与分析则更是停留在C语言面向过程的编程思维中。这个单元的内容是表达式求导,其中最重要的一点我认为是正则表达式的合理使用。我第一次作业中几乎所有的代码都集中在一个类中,就是main类,导致这个类非常臃肿,基本上谈不上什么架构设计,还没有摆脱面向过程的思维。然后互测环节和研讨课中听了一些大佬的架构思路, 在第二次作业对自己的程序架构进行了改进,开始尝试继承和多态带来的开发便利,开始为后续作业可能添加的需求留出空间,使用了工厂模式进行设计,并且沿用到了第三次作业。在第三次作业时新增的对嵌套函数的求导,可以说如果没有一个好的架构,是支撑不起复杂的递归嵌套的求解的。在这个单元中,我学到了OO的层次化设计方法,这样使自己的程序更有条理。

    第二单元——多电梯调度

      这一单元的最大收获也是多线程,并发的理解,第一次接触多线程,一路走来可以说是十分享(tong)受(ku)了,我三次作业的整体架构思路是输入-->调度器-->电梯三线程实现。由于本单元作业中CPU运行时间有限,需要添加wait和notify防止暴力轮询导致超时。同时,在实现过程中,我们需要在线程交互中防止出现死锁,并且采用合理的调度策略进行优化。在这个单元中,我感受到通过OO设计思想实现的程序有着很好的可拓展性,每个类就相当于零件,哪里出现问题修改相应的零件就行。通过本单元的学习我才算真正意义的使用了面向对象的思想去解决问题。开始以类为单位来思考架构,以及以多线程资源共享的架构来思考问题,还知道了设计模式的概念,整个单元运用了单例模式,观察者模式,还有生产者-消费者模型等等。同时在本单元中,我对SOLID设计原则有了初步了解。

    第三单元——人际关系网络系统

      第三单元是JML,通过这一单元知道了规格化的方法,也初步体会到了规格的威力,有了规格,无论是写代码也好,测试也好都会变得非常的方便。除了规格的匹配以外,最让人印象深刻的就是算法、数据结构的选取以及架构的设计。为了能够满足时间复杂度要求,必须分析指令的增删改查类型,为对应指令选择最低复杂度的数据结构和算法。通过本单元的作业我对数据结构及算法有了进一步的学习,明白了一个优美的架构好处不仅仅在于其可扩展性,由于模块与模块之间耦合度低,逻辑重合度低,同时规格的引入让我对“抽象”这个词有了更深的认识。调用方法的实质是使用其规格定义的功能,而不关心方法的实现。同时,规格也为设计单元测试提供了全套保证。

    第四单元——UML元素解析器

      第四单元是UML在真正下手之前,先构造一个清晰易懂的UML图,会使得接下来写代码的过程中不会迷茫和混乱。本单元的每次作业都是在原有的基础上添加新的功能,建立一个好的架构,在完成作业时会十分得心应手。

    三、测试理解与实践的演进

    第一单元

      第一单元难点在于对各种WF情况的考虑。在一开始,无论是公测还是互测,我均是在肉眼debug,自己想一些边界数据,或者特殊值,以及自己在写代码的过程中写出的bug所对应的测试数据,主要还是集中在对WF的检测上。

    第二单元

      第二单元是多线程,多线程测试起来非常复杂,主要是因为很多的bug都不能复现,而直接使用idea的单步运行在多线程里就几乎无用了,本单元由于少了合法性检测,就需要制造一些边界条件/特例来查找bug。主要就是看电梯有没有可能上到非法楼层(数组越界)、调度器调度的时候是否漏人、CPU时间是否会超时。所以,bug定位更多地仍然是从分析整个程序运行的逻辑上入手。

    第三单元

      本单元接触到了 JUnit 单元测试,同时也学习到了基于JML的规格检查以及 JML Unit 工具的使用。这一单元的最大收获就是Junit,Junit的体验极好,测试起来非常舒服和方便,简直是为我的测试手段打开了一个新世界。

    第四单元

      老实说,由于本单元数据是基于StarUML的,因而难以生成大量随机数据进行测试,在测试手段上并没有什么突飞猛进,不过倒是对以前掌握的一些测试方法进行了巩固。

    四、课程收获

      一学期的OO之旅终于到了终点,这期间踩了不少坑,但从零基础一路走来,真的能感受到自己的巨大进步。通过这门课,我从一个只会写C代码,毫无架构,随心命名,面向过程的小白初步成长了很多,对代码规范,代码架构,代码测试等都有了非常大的提高.尤其是掌握了面向对象的思维方式,使得我现在的思考问题角度有了很大的扩展。

      每个单元的三次,可以看出的是,我们作业的工程化需求在逐步增加,而在需求不断增加的时候,则要求我们的代码具有较高的可拓展性,否则就面临大规模重构的危险。而对于我们学习的四个单元的作业来说,每个单元相比代码量都有了极大的提升。

      在第一单元,我学会了正则表达式的使用以及OO的基本思想如类,接口,继承等;第二单元则学会了多线程程序的设计,包括线程安全的人为把控,以及SOLID设计原则等,多线程问题需要我们使用合适的设计模式,对各线程间的同步、互斥有深入的理解,全面和仔细地分析协作是如何进行的,这对我们的思维能力也是一种锻炼。第三单元学习java的建模语言,JML是基于“契约式编程”的一种规格描述语言,相比于自然语言注释,JML更加严谨和清晰。在本单元的学习中,我意识到了设计与实现分离的重要性以及必要性。最后一个单元的练习更像是一个总结,不仅是对更广义上的面向对象建模设计UML模型的理解,还是对前几个单元所有学习到的知识的一个汇总,整理以及实际运用,都令我受益匪浅。

      最后,也是最重要的一点,就是对面向对象思想的感悟。面向对象是一种编程技术,但它更是一种思考问题的方式,它不是某一个具体的知识点,但却是贯穿整个OO课程的灵魂。在每次作业的架构设计中,我对于面向对象的理解都有进一步的加深。

      同时,在另一方面,OO课程给我们带来了一种心理上面的提升,即面对如此复杂的作业指导书,我们可以在规定时间内完成,这对我们的信心有着极大的提升,因此,OO这门课程所带给我们的提升是全方面的。

      总之,一学期下来,确实能感受到自己己的能力在稳步提升,也逐渐从面向过程的思维中转变了过来,但我仍然需要阅读通过阅读更多专业书籍,学习更巧妙的设计思想,逐渐形成一套自己的思维体系。

    五、改进建议

    1、课程在一开始的时候可以稍微让同学们更容易接受一些,在学期开始时,我们一些同学才刚刚接触了Java这门语言,对于其中达到一些操作并不是特别的熟悉,而第一单元第三次作业真的算是难度的巅峰,对我而言还是有挺大的困难。

    2、望了解每次上机测试的结果,让我们能从中学到更多。

    3、在每一次作业,尤其是最开始的几次中,可以提供后续作业中可能出现的扩展需求,可以比实际的扩展需求更多或更少,让学生对代码复用和迭代开发的实现有更好的认识。

    本学期的oo课程接近尾声了,感谢老师和助教的辛勤付出,祝oo课程越来越好!

  • 相关阅读:
    异步与同步,阻塞与非阻塞的正确认识
    Go 环境配置
    使用node.js 脚手架搭建Vue项目
    使用HBuilder+MUI+Flask后端服务器框架+Mongodb数据库开发手机APP
    基于百度API+Flask实现网页版和图灵机器聊天
    人工智能-调百度AI接口+图灵机器人
    日期显示格式的修改
    salt软件远程控制服务器
    Django
    孙鑫MFC学习笔记14:网络编程
  • 原文地址:https://www.cnblogs.com/zzzzzzzz0923/p/13162742.html
Copyright © 2011-2022 走看看