oo第四单元及课程总结
一、第四单元作业总结
第四单元有两次作业,第十三次作业是实现一个UML类图解析器,可以通过输入一些查询指令来查询一些类图的信息。程序的主干部分已经提供,我们的任务就是实现给出的接口,过程并不繁琐。第十四次作业在十三次作业的基础上增加了对UML状态图和UML顺序图的解析以及UML模型合法性判断。
1、 第十三次作业
架构思路:
对于需要存储相关信息和参数的UML对象各开一个专门的类来实现,例如UMLClass,UMLInterface,UMLOperation。同时在第一步识别UMLElement时率先存入容器,其他Element在之后进行分类存储。
除了少数功能可以直接查询得到之外,其他的函数大多需要整合计算的过程,因此尽量在查询开始之前进行处理并且把信息保存,避免多次查询多次计算。
类图:
图中可以看出构造方法的复杂度最高,原因是大部分的初始操作都在构造方法中,完成,导致在其中有大量的遍历过程和对容器的操作过程。此外还有一些需要遍历图找到父类的操作复杂度也较高。
Bug分析:
此次强测因为未考虑接口可以继承多个接口的情况,强测情况较惨,修复过程不复杂。
2、 第十四次作业
架构分析:
类图部分与上次作业完全相同,不再赘述。
状态图部分,新增了stateMachine类来存储状态图的相关信息和数据。前两个函数较为直观,可以直接查询得到。第三个指令查找可达的状态需要层次查找,我使用了图遍历方法,得到状态的可达矩阵并存储。
顺序图部分,新增了类来存储顺序图的相关信息和数据。三个指令的较为简单直观。
规则检查部分,R001通过简单的比较可以实现。R002我使用弗洛伊德算法得到类和接口的可达矩阵,能够自己到达自己的就是成环。R003可以通过直接遍历所有的类和接口并且比较所有的继承的接口来判断是否有重复继承,但是此方法复杂度较高。
若是把所有的方法和操作都放在一个类里面会造成类的冗余繁杂,因此在设计时把大部分初始操作,存储操作等放在父类中,子类中放置实现的接口函数。
类图:
可以看出复杂度主要集中在了父类中。
Bug分析:
强测中没有出现错误。
二、四个单元中架构设计及OO方法理解的演进
第一单元:在写第一单元的作业是并没有对面向对象方法的概念,程序还是基本按照C程序的写法面向过程,第一次第二次作业因为格式固定要求较低直接莽过去,但是在第三次作业几乎全部推翻重构,花费了许多的时间和精力,但是写法依然不太美观,仍旧是针对作业要求而强行使用类来替代结构体实现了函数。这三次的作业可扩展性都非常差,但是当时我还是没有意识到oo方法的重要性,在互测阶段对比其他同学的清晰优秀的代码感受到了明显的差距。
第二单元:第二单元是电梯系列的作业,要求我们对多线程有了解,编写逻辑和调试难度还有架构方式与第一单元有很大的差别,不能再次通过强行面对过程编写。我更加注重代码的架构,思考如何降低类与类之间的耦合性,以达到方便调试和扩展的目的。我在作业中独立出了乘客,调度器,电梯一个个实体,各司其职,尝到了oo方法的方便之处。这一单元还加深了我对进程同步互斥的理解,对加锁的条件和要求也有了使用经验。
第三单元:第三单元是JML代码规格系列的作业。在这个单元中的作业我们只要考虑根据需求完成每一个函数,但是第三单元的作业有时间限制,所以需要考虑算法结构以免运行超时,对架构设计的需求更高了。经过前两个单元的训练,我每次作业会综合考虑所有接口函数提取出共同需求再进行设计,与之前相比有了长足的进步。
第四单元:第四单元还是对接口函数的实现,与之前的作业相比第四单元作业难度其实有所降低,相对而言完成的比较轻松。但是因为放松了对性能的要求以及临近考试,设计上其实并没有尽力追求,只是写了方便直观的算法以实现作业。但是能够明显感受到自己对于oo方法的适应。
三、四个单元中测试理解与实践的演进
第一单元时测试的时候主要想的是两种,一是能否识别出格式错误,二是能否正确求导。我主要思考边界数据和复杂数据,但是总是有所疏漏,自己的思考不够全面,出现的bug总是一些细小的条件未考虑,基本一两行代码就可以补充完整。
第二单元多线程作业,测试难度大大增加,因为线程访问时间和先后的不确定性同样的样例测试结果也可能不同,对bug的定位难度大大增加。需要的是对代码逻辑的仔细思考以找到其中的漏洞,而不是构造各种样例测试。
第三单元和第四单元的因为有整体上的架构需求,一旦出现bug很有可能就需要整体架构的调整,因此bug的修复困难很多。这两单元的测试使用了对拍器,通过与同学结果的对比可以很快地找到bug并且定位。
四、课程收获
1、 对Java语言的熟悉和使用。
2、 对多线程程序设计的经验。
3、 代码风格规范。
4、 面对对象的程序设计思想。
5、 诸多实用工具的使用
五、改进建议
1、 上午讲课的内容下午上机直接开始考,让人难以适应。
2、 上课时能够多讲点作业架构设计的方向。
3、 希望能有课上讲讲优秀的架构设计以供学习。
oo第四单元及课程总结的更多相关文章
- oo第四单元暨课程总结
第四单元架构设计总结 第一次作业 单独写了MyUmlClass.MyUmlInterface.MyUmlOperation三个类对应UML中相应元素,在UML图中这几个元素包含一些下级元素,如Clas ...
- oo第四单元与课程总结
Part1 本单元三次作业架构设计总结 1.组织结构 由于官方代码中已经给我们提供了许多零散的类元素,如UmlClass``UmlAssociation``UmlParameter等,因此我首先将某些 ...
- 【OO学习】OO第四单元作业总结及OO课程总结
[OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...
- OO第四单元总结及课程总结
OO第四单元总结及课程总结 一.前言 紧张刺激的OO“昆仑课程”接近尾声,经过一个学期的学习,我的收获和感触颇多,借此博客作业的机会,对自己OO这门课程做一个总结.本博客主要有以下五个方面,一是第UM ...
- OO第四单元——基于UML的UML解析器总结&OO课程总结
OO第四单元--基于UML的UML解析器总结&OO课程总结 前言:一学期愉快(痛苦)的OO课程学习结束了,OO几个单元作业都各有特色,实验也各有特色,仔细回味起来,不再是单纯的敲代码(但自己还 ...
- oo第四单元作业总结暨课程总结
oo第四单元作业总结暨课程总结 一.本单元作业架构设计 本单元需要构建一个UML解析器,通过对输入的UML类图/顺序图/状态图的相关信息进行解析以供查询,其中课程组已提供输入整体架构及输入解析部分,仅 ...
- OO第四单元总结与课程总结
OO第四单元总结与课程总结 第四单元作业架构设计 总体分析:本单元作业的需求集中于对UML类图进行查询.对于查询操作来说自然的想法是提前预见到需要查询的内容,在一开始就采用适当的数据结构将必要的信息进 ...
- OO第四单元与全课程总结
OO第四单元与全课程总结 一.作业代码架构设计 1.第一次作业 作业类图如下: 具体架构设计: 第一次作业的全部查询工作都是和类图有关,需要解决的主要问题就是如何解析原有UML类图数据的结构,并形成自 ...
- OO第四单元(UML)单元总结
OO第四单元(UML)单元总结 这是OO课程的第四个单元,也是最后一个单元.这个单元只有两次作业,相比前三个单元少一次作业.而且从内容上讲这个单元的作业目的以了解UML为主,所以相对前三个单元比较简单 ...
随机推荐
- Echarts 折线图y轴标签值过长 显示
参考: https://blog.csdn.net/dandelion_drq/article/details/79270597 改变Y轴单位:https://www.cnblogs.com/cons ...
- Windows驱动开发-r3和r0通信
用户部分代码: int main() { HANDLE hDevice = CreateFile(L, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ...
- 关于C++中vector<vector<int> >的使用
1.定义 vector<vector<int>> A;//错误的定义方式 vector<vector<int> > A;//正确的定义方式 2.插入元素 ...
- HiBench成长笔记——(1) HiBench概述
测试分类 HiBench共计19个测试方向,可大致分为6个测试类别:分别是micro,ml(机器学习),sql,graph,websearch和streaming. 2.1 micro Benchma ...
- 第3节 sqoop:7、通过java代码远程连接linux执行shell命令
数据库的数据同步软件sqoop 数据同步 关系型数据库到大数据平台 任务:sqoop 是批量导入数据太慢,如何做到实时的数据同步 实时的数据同步工具: canal 阿里开源的一个数据库数据实时同步的软 ...
- Android拷贝工程不覆盖原工程的配置方法
http://www.2cto.com/kf/201203/125131.html 在Eclipse中改包名的时候选择refactor-->rename,勾选Rename subpackages ...
- jpa自定义sql语句
/** * 查询还没生成索引的帖子 * @return */ @Query(value = "SELECT * FROM t_article WHERE index_state=0" ...
- 从零开始学C++(2 字符串、向量和数组)
可以说string和vector是C++标准库中最重要的两种类型,string支持可变长字符串,而vector表示可变长的集合. string 头文件:<string> 定义在命名空间 s ...
- es6 中的 Promise
var promise = new Promise( function( resolve, reject ){ function onServiceSuccess( data ...
- Spring Boot2(006):关于配置类(Configuration Classes)和配置(Configuration)
一.配置类(Configuration Classes) Spring Boot 支持基于 xml 的配置,但更偏向于使用基于 Java 的配置,通常建议使用定义有 main 方法的主 @Config ...