2019 - OO第四单元作业总结&课程总结

一、第四单元架构设计

  • 在第一次仅针对类图的作业中,我虽然正确实现了功能,但是整个架构的设计并不好,没有按照各个元素的层次关系建立各种类,而是把所有的元素信息以HashMap的形式都存到了一个类中,导致整体代码风格不佳,阅读体验不能令人满意。

1615425-20190620165710126-593253025.png

  • 第二次作业在上一次的基础上增加了状态图和顺序图以及三种规则的判定,情况变得更加复杂,如果这时还继续把这些功能向类里添加的话会让整个程序十分冗长,不仅不利于阅读与纠错,还会违反CheckStyle的规定。所以我决定在第二次作业对上一次的代码进行重构,尽量使层次清晰起来,让各个部分合理地耦合,这样代码读起来也清爽一些。

    这里我将Class等等的构成整个图的因素都放到了一个名为factor的包中,在构造方法里把所有进入的元素按照其层次关系保存起来。同时,第二次新增功能的类MyUmlGeneralInteraction应继承MyUmlInteraction.

1615425-20190620165727542-200447665.png

1615425-20190620165747249-242834864.png

二、架构设计及OO方法理解的演进

  • 第一单元的主要内容是多项式求导。作为面向对象课程的第一个单元,我认为比起建立面向对象的思想,它更加倾向于使我们尽快掌握Java语言的运用方法,所以对于面向对象仅仅只是给了我一个初步的印象,而并没有重点去考察对于面向对象思想的理解。尽管如此,这个单元完成起来其实并不轻松,尤其是第三次作业,算法的实现十分复杂。首先需要学习正则表达式的一整套概念,才能正确识别多项式;然后,把一整个式子按照元素的不同种类(比如正弦函数项、常数项、幂次等等)、不同层次(比如单项式、多项式等等)保存下来,这里就用到了面向对象思想,因为如果想要层次鲜明地把一串多项式保存下来,需要建立各种类并使他们耦合。然后则是计算与化简,这里主要涉及的是算法,选择一个高效的算法是性能分得分的关键。
  • 第二单元的主要内容是有关电梯调度,这也是我收获最多的一个单元。首先,我认为这个单元对我深入理解面向对象思想的帮助是最大的,比起上一单元作业的关键是算法,我认为这一单元的关键真正扣在了“面向对象”上,因为这次作业十分注重“消息在对象间的传递”这一课程要点;其次,我在这一单元收获了最多的十分有用的新知识,比如多线程,比如生产者-消费者模式,而这些知识对于Java语言来说是非常重要也是非常有必要去学的。从架构设计角度上说,这个单元基本上就是一个固定的模式,程序中有四个类:Main、InputRequest、Scheduler、Elevator。其中InputRequest不断把输入进来的请求传给Scheduler,保存在请求队列中;对于Elevator,每执行完一条请求就向Scheduler拿一条新的请求,直到输入结束且请求队列为空。这里主要体现了多线程的设计思想,因为电梯是有多部的,每一部在调度上略有不同,但它们可以共用一个调度器。总体来说,这个单元有一定难度,但好在条理清楚,模式相对固定,所以完成起来比较舒服。
  • 第三单元的主要内容是JML语言的学习以及根据给出的JML语言逐步完成一个图的建立,最后完成简单的地铁系统。这个单元的层次在于由点到边再到路径最后生成一个图,而这里我们应该对每个层次的元素都分别建立一个类并通过引用产生它们之间的逻辑关系。在运用JML语言以及面向对象思想的同时,这一单元还涉及到很多关于图论和数据结构的内容,因此需要我们对之前学习过的课程进行回顾与复习。
  • 第四单元的主要内容是实现UML模型。从完成这一单元的难度上来说并不大,但是前提是必须要读懂源代码才能清楚其中涉及的各个类的含义。UML从应用角度上来说比JML的使用范围更广,所以可以从网络上找到丰富的资料来学习,并且还可以使用软件StarUML来生成简洁清晰的可视化类图结构,这就大大降低了难度。在架构设计上我第一次作业的架构不是很好,没有体现出UML图的层次感,所以我在第二次作业时进行了重构。分别建立了MyClass、MyInteraction等类并通过引用关系明晰了各个元素之间的层次关系,虽然各个函数的实现方法并没有本质上的区别,但是这样的代码看起来更加清楚明白,也更加利于扩展和维护。

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

  • 第一单元的测试我先是自己编了一些针对某些重点的多项式,通过直接的判断来比较,这个方法的缺点就是式子太短导致复杂的情况考虑不周,而且直接看结果纠错效率较低。后来向同学学习了自动化生成测试数据的方法,从而大大提高了效率。
  • 第二单元由于涉及到在不同时间投放指令,测试难度比较大。我只尝试了自己控制,在某个时间输入一条指令,但这样对于边界条件的测试明显不足,不过好在这次作业对边界条件的要求并不高,所以在这部分出错的可能性也比较小。我测试的重点在于看执行结果与指导书中对电梯的要求是否有出入。
  • 第三单元测试重点主要在最短路径上,我的实现方法是数据结构中常见的Dijkstra算法。只要这个算法的实现没有什么问题,那么代码也就基本正确了。而在第三次作业时LEAST_TICKET_PRICE、LEAST_UNPLEASANT_VALUE这两条查询指令的增加使得需要对Dijkstra算法做出一些变动,因此在测试时也需要特别注意。
  • 第四单元的测试数据生成十分方便,不需要自己构造数据生成器,只需要针对测试要点在StarUML中构造出相应的图,再使用给出的方法生成即可。我在这个单元就自己构造了许多图用来测试,也在与同学的交流中获得了很多测试点覆盖更全面的测试用例,并且最终通过这种方法找出了很多Bug。在学会测试的同时我还学习到了如何使用StarUML这个软件,这也是我本单元的一大收获。

四、课程收获

我在面向对象这门课程中学习到的不仅仅是Java语言,还学习了许多设计模式,这是我在这个课程里最大的收获。面向对象作为一个十分现代化的学科与其他传统学科不同,它不是早已被时代的洪流冲刷的老旧的学科,而是一门在当下被实实在在地广泛应用在计算机科学的各个领域的学科,因此我对它的评价是“有用”。正门课程被分为三部分:课上讲授、上机实验、课下作业。作为一门占用学时并不长的课程,我从中学习到的知识却一代也不少,并且还同时掌握了好几种软件的使用方法。从完成作业的角度上来说,课上讲的内容也许不是每一部分都能在课下用上,但是我认为那些扩展性的知识都是当下计算机领域十分重要的内容,所以也给予了一定程度的重视。总的来说,虽然一个学期下来时常对作业难度有所抱怨,但是我最终还是感觉一切都很值得,因为我收获了满满的“干货”。

五、课程改进建议

  1. 希望课上的课件可以提前下发便于预习;
  2. 理论课和实验课时间挨得太近,导致课上有些知识还没能完全理解吸收就匆匆进行实验,完成的结果并不理想,希望能够有所调整。
  3. 某些作业的设置上可能重点有些偏,与“面向对象”思想的联系不够紧密,望改善。

转载于:https://www.cnblogs.com/lsw-CS-2019/p/11059816.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值