OO第四单元总结

UML单元架构设计 

第一次UML作业

这一单元的作业是要求我们对数据之间的联系进行解析,重建数据结构来存储有效信息以方便查询工作。

这一单元我没有像很多人一样,以类为一个单元进行封装,我是以整个类图来进行操作的。因为这次作业只是对类图的查询,所以我用多个hashmap存储类图的信息,在一个类里面完成了所有的操作。我起初以为这样的架构不是很好,但当我做第二次作业的时候,觉得这样以hashmap存储全图信息,也不失为一种很好的封装结构。

第二次UML作业

这次作业是上一次作业的扩展,整体架构思路没有太大变化。我用第一次作业的方法扩展了三个类,分别存储类图、状态图、顺序图的有效信息。类内部实现自身对应的查询操作。

本次作业最难的是实现模型有效性检查。其中让我惊艳的是将类的继承关系,类的实现关系,接口的继承关系,全部以点线的形式存入图中的方法。以某一点为源点,利用dfs算法就可得到一条路径。如果加入的节点在visit路径队列中已经存在,若是源点则是循环继承,否则为重复继承。在没有循环继承以及重复继承的基础上,以类为源点,则其得到的路径中包括他全部继承的类以及他全部实现的接口,以接口为源点,则其得到的路径为其所有的继承的接口。这些数据可以存储下来,可用于类图的相关查询。

OO课程总结

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

OO课程的每个单元分成两到三个阶段,后一个阶段都是在前一个阶段的基础上进行扩展的。因此一开始有一个良好的架构是非常重要的。

好的架构的特点是简洁、清晰、高内聚、低耦合、易维护、可扩展的。他需要我们对作业进行抽象。这抽象的过程可以凭借很多我们生活中的经验数学方面的知识等。比如电梯那一单元,将我们要实现的电梯程序,可一定程度上地映射到现实生活中的电梯:现实中的一个人可抽象为一个请求,每个电梯开关门的控制数据可映射到电梯的按钮,电梯运行的算法也可以联系实际情况中的运行状态。比如JML格式地铁那一单元的第三次作业,它的思路就运用了数学知识,问题的核心在于解决换乘次数的统计(其余新增的问题的根本还是在于换乘统计),通过将一条path连成完全图来表达从该path 上的任意两点间可以直达。直达则只需经过一条边,赋予边权重,计算出两点间的权值则可知两点间的换乘次数。而在这一个图上给边赋予不同的权值,通过相同的计算方法就可以解决不同的问题。不得不说这个模型太巧妙了。由此可见,在生活中我们就需要学会对事物进行层次划分与联系映射,培养自己的抽象能力与思维的逻辑性。再者,对于计算机这门专业,数学有着无可替代的重要性,端正自己对待数学的态度,学好数学是必须的。

2.四个单元中测试理解与实践的演进

OO作业中用到的测试方法基本上可分为三种:

(1)根据程序特性自我设计测试数据;

(2)生成大量随机数据进行测试;

(3)通过OpenJML、JMLUnitNG等工具进行自动化测试。

第一种方法效率比较低,但可以锻炼我们的逆向思维,培养自身逻辑的严密性。这种方法,是我们在编程的过程中自我改进修复常常用到的方法。针对程序的处理过程,我们会意识到哪些地方容易出错,自我检查的同时也可以对他人进行hack。

第二种方法是效率很高的,而且几乎能覆盖到所有情况,但要求能正确编写数据生成脚本。(这都是大佬用的方法,菜鸡不会~)

第三种方法,也是OO课程想培养我们学会的测试技能,即通过JML工具链,自动化地生成测试样例。我对这方面的了解与掌握并不是很深入,只是停留于课程的要求。了解了它的简单操作。这种测试方法的好处在于,测试数据的生成全程自动化,且理论上能覆盖到所有的情况。但它的弱势也是显而易见的:学习成本高,需要花更多的时间在代码中编写JML测试相关的语句,这是有一定难度的。

3.课程收获

这一个学期的OO课程学习,收获还是很多的。

首先,我学会了一门语言,基本掌握了Java的使用。java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

其次,OO结合OS让我对多线程有了较深入的理解。我通过查阅大量的博客自学了很多知识。从完全陌生到慢慢熟悉,基本掌握了多线程间的同步、互斥问题,也了解了一些设计模式的知识。

再者,对图的操作有了进一步的提高。当初学数据结构的时候,图的部分并没有掌握得很好,这学期后两个单元对图的操作很多,是来还债的。学习了很多新的算法,并能根据自己的需要进行自我设计。

然后,还学习了UML和JML的相关知识。JML是基于“契约式编程”的一种规格描述语言,相比于自然语言注释,JML更加严谨和清晰。我们双向地学习了这一语言,即根据需求撰写规格,以及根据规格实现代码。UML通过可视化的图形形式,帮助开发者对大规模、复杂系统进行建模,这对于设计面向对象的架构具有重要的意义。通过对UML文件的解析,我们对UML以及面向对象语言的特性有了更深的理解。

最后,也是最重要的是,这门课让我建立了面向对象的思想。面向对象的程序设计语言必须有描述对象及其相互之间关系的语言成分。这些程序设计语言可以归纳为以下几类:系统中一切事物皆为对象;对象是属性及其操作的封装体;对象可按其性质划分为类,对象成为类的实例;实例关系和继承关系是对象之间的静态关系;消息传递是对象之间动态联系的唯一形式,也是计算的唯一形式;方法是消息的序列。面向对象不仅是一种编程技术,它更是一种思考问题的方式,一种世界观,一种哲学。在这一学期的课程学习中,我对此有了更深入的感悟。

课程改进建议

  1. 希望BUG修复可以挽回强测中一定比例的分数。强测的数据并没有覆盖性,往往强测满分的人互测中也会被找出很多bug,然而因为一个同质错误而强测爆炸的人的分数几乎没有挽救的机会。强测的分数几乎起到了决定性作用。BUG修复可以挽回强测中一定比例的分数,可以适当地提高公平性。
  2. 希望课程组能合理安排实验课时间,让同学们有准备地参加实验课,提高实验课的实际价值与效率。
  3. 希望课程组以后课程安排变动能够提前一定时间在公众平台给出官方通知。不是在鱼塘随口一说,或者等同学问了再说。
原文地址:https://www.cnblogs.com/lzh-blod/p/11076647.html