OO第四单元——终章
一.架构设计
这一单元的作业主要是围绕UML来对我们的面向对象思维进行训练,刚开始接触的时候或许因为些许陌生而觉得有一定难度,但随着一次一次的代码阅读再加上思考,逐渐地也变得得心应手了起来。
1.第一次作业
本次作业最终需要实现一个UML类图分析器,可以通过输入各种指令来进行类图有关信息的查询。
在刚下载完官方的源码时,面对规模庞大的代码,我一时也不知道从哪开始读起,便硬着头皮直接开始按循序阅读,结果还没读完几个java文件,我就感觉读不下去了,一是因为有很多语法我并不是特别熟悉和了解,还有就是觉得读完似乎对这次作业的需要完成的代码没有什么帮助,便直接打开需要实现的接口代码,结果发现有很多类都需要我去使用。后来在和同学的讨论下,,原来只需要把element文件夹中的代码都通读一遍就基本上没有什么问题了。
在参考了讨论区后,我便做出了以下的层次设计,首先增加了一个接口TopClass,并创建了两个类MyUmlClass和MyUmlInterface分别实现这两个接口,以便后续的对这两个类的调用,并考虑到方法可能较为复杂,便又创建了一个MyUmlOperation类,用来管理参数。在每一个对应的MyClass中,我都存储了官方包中自带的类,以便于获取ID和name。
2.第二次作业
在第一次作业的基础上,第二次作业要求我们扩展类图解析器,使得可以支持对UML状态图和顺序图的分析,可以通过输入相应的指令来进行相关查询。
其实只要按照第一次作业的思路来进行建构,第二次作业并不是很难,就是增加几个类,恰当地管理存储某些数据。不过为了代码风格和进一步的划分各个类的职责,我又新建了一个ElementAnalyse类,用来将传入的所有的element分辨管理存储好,然后主函数直接调用get方法即可获得处理好的类图,状态图和顺序图的数据,并进行后面的操作。在第二次作业中,因为需要用到状态机,所以我专门创建了一个MyStateMachine类,用来管理UmlStateMachilne,这个类中存储的即是那些需要管理的数据。对于状态图的管理,我同样创建了一个MyInteraction类,其中存储了生命线和各个消息,方便进行统一管理。
3.第三次作业
第三次作业与前两次不一样的是,在上次作业基础上,扩展解析器,使得能够支持对UML顺序图和UML状态图的解析,并对模型进行有效性检查。
所以第三次作业如果是在前两次作业已经有了好的框架之后,便只需要实现一些函数即可,我便是在交互的主函数中实现了那8个接口,并在我自己的管理三个图的类中增加了一些判断的方法,总体的架构和前两次相比较基本没有什么变化。
4.这三次作业的bug情况与反思
对于第一次作业,我刚开始抱着应该很简单的心态,试图在周六最后一天可以完成,结果万万没想到的是,实现起来还是有着一定的复杂度的,所以没有及时的完成,成了我的第一个未提交的作业,但后来在与同学的讨论中,逐渐地完善了自己的架构,这次作业也就算是完成了。而对于第二次作业,因为有个地方没有加上判断是否已经访问过就直接进行访问,导致出现了死循环,对应的强测也就出现了ctle,但在发现问题后及时地改正了bug。至于最后一次作业,或许是因为没有太注意题目的意思和各种特殊情况的讨论,导致在判断rool0的时候忽视了对名字为null的讨论,wa了好几个点,最后在修复的时候加了特判便通过了。
二.四个单元的架构总结
刚开始接触OO的时候,并不太注重整体架构的设计,往往是想好了实现的算法,便直接像数据结构那样,开始了方法的编写,偶尔新建的几个类就像struct一样,一点也没有体现出oo这门课的精髓和思想,在第一次作业中,输入输出中间处理的所有内容几乎都挤在了一个类里,到后来的时候分出来了输入处理和输出处理以及化简的过程,再到后来对每个类都进行精心的设计,或许这就是架构设计的慢慢进步的过程.到第二单元多线程,这时候架构的作用更体现了出来,如果不像老师上课讲的那样设计不同层次的类以及处理类的时候,整个工程可能会变得不堪重负甚至漏洞百出,当然为了提升性能我们不应该只看重算法,更应该仔细想想如何让在结构的设计上让代码的水平更胜一筹.而像第三单元JML,在第一次作业相信大部分同学都犯下了翻译需求的错误,没有重视到整体架构的设计,导致出现了千奇百怪的错误,也就是那次作业,让很多同学的爆0,没有进入互测,所以在接下来的后续两次作业中,我们都开始将重点放在整体的架构设计上,让代码的质量进一步提升.最后一个单元则更是如此,算法的方面其实完全可以被层次设计和架构设计所替代,只要架构设计的够好,算法再差整个工程也不会差到哪里去,这一单元的作业就是完全由我们自己来设计,指导书上并没有给出任何的提升,当然,这次训练也让我们的OO思想得到了极大的升华.
三.四个单元的测试概况
当然,我们学习OO课并不仅仅是学习编程思想,工程思想和那些总体架构的思想,我们的测试水平也需要在OO课的学习中不断地进步.在第一单元的测试中,我完全采用了自己编写java程序创建测试数据随机测试的数据模式,一边计算机在生成数据,一边shell文件在自动测试对比,大量的随机数据总能将bug测试出来.第二单元也是如此,只不过使用pathon生成测试数据要更简单一点,仍然是通过自己编写的自动评测机自己在完成大规模的数据测试.到第三单元时,我开始逐渐地使用起来JUNIT来作为辅助测试,单元测试的话更有说服力,测试的力度更大,范围更广,但是数据仍然需要自己去构造,JUNIT的最大的优点就是所有的代码都能被测试到,不留死角,但需要提前设计好测试框架与环境,这也需要一定的经验和练习.对于第四次作业,同样是采用JUNIT单元测试,再通过构造各种极端的样例来达到测试的目的.
四.课程收获
OO这门课是大二下学期和操作系统类似的大课重课,不仅难度大,需要我们花费的时间也很多,当然,有付出总有回报,在完成这么多作业的设计与编写,我的OO思想和编程思想也有了质的提升,再也不是仅仅拘泥于算法的设计,而是更注重层次化,抽象,与架构的设计.往最差的情况去想,JAVA这门语言也算是被我们熟练的掌握了.这门课带来的收获绝对不止停留在java这个语言上,对信息领域的任何地方都有着不小的帮助,因为不管什么项目都需要设计,设计都会用到这些方方面面的思想,相信在以后的工作和学习中,这门课所教会我的思想将一直陪伴在左右.
五.具体改进建议
(1)第一单元的作业难度对于刚开始接触OO的同学们来说难度可能有一点大,可以在寒假的预习作业中更多地去设计一些相仿的地方,减小同学们学期开始的压力.
(2)研讨课讨论的时候对于有些问题可能是一知半解或者不知道答案,直接找同学回答可能不是什么特别好的主意.
(3)第四单元的第一次作业的指导书上可以增加以下对阅读官方代码的建议与提示,要不然太多的代码对于某些同学来说可能是一个极大的挑战.
六.线上学习感受
感觉OO这门课线上线下的区别不是很大,除了见不着英姿飒爽的老师们和可爱的学长学姐们(似乎没有学姐),其他的没有什么太大的变化,就是在写作业的时候不太方便与同学互相debug与交流,其他的问题都不大.还有就是上理论课的时候并不能直接和老师语言交流,少了一点氛围,但录播课的好处就是可以在不懂的时候看回放,加深理解.
OO第四单元——终章的更多相关文章
- OO第四单元——基于UML的UML解析器总结&OO课程总结
OO第四单元--基于UML的UML解析器总结&OO课程总结 前言:一学期愉快(痛苦)的OO课程学习结束了,OO几个单元作业都各有特色,实验也各有特色,仔细回味起来,不再是单纯的敲代码(但自己还 ...
- 2020 OO 第四单元总结 UML
title: 2020 OO 第四单元总结 date: 2020-06-14 19:10:06 tags: OO categories: 学习 1. 本单元三次作业的架构设计 本单元的代码编写与第三单 ...
- 【OO学习】OO第四单元作业总结及OO课程总结
[OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...
- OO第四单元(UML)单元总结
OO第四单元(UML)单元总结 这是OO课程的第四个单元,也是最后一个单元.这个单元只有两次作业,相比前三个单元少一次作业.而且从内容上讲这个单元的作业目的以了解UML为主,所以相对前三个单元比较简单 ...
- OO第四单元总结及课程总结
OO第四单元总结及课程总结 一.前言 紧张刺激的OO“昆仑课程”接近尾声,经过一个学期的学习,我的收获和感触颇多,借此博客作业的机会,对自己OO这门课程做一个总结.本博客主要有以下五个方面,一是第UM ...
- OO第四单元博客作业
OO第四单元博客作业 BUAA_1706_HugeGun 目录 第四单元作业架构设计 四个单元架构设计及OO方法理解 四个单元测试理解与实践演进 课程收获 一点建议 第四单元作业架构设计 ### 第十 ...
- OO第四单元总结及学期总结
目录 OO第四单元总结及学期总结 第四单元三次作业架构设计 第十三次作业 第十四次作业 第十五次作业 四个单元中架构设计及OO方法理解的演进 第一单元 第二单元 第三单元 第四单元 四个单元中测试理解 ...
- OO第四单元总结暨期末总结
OO第四单元总结暨期末总结 目录 OO第四单元总结暨期末总结 第四单元三次作业架构与迭代 整体感受 HW1 HW2 HW3 四个单元架构设计与方法演进 Unit1 Unit2 Unit3 Unit4 ...
- oo第四单元作业总结暨课程总结
oo第四单元作业总结暨课程总结 一.本单元作业架构设计 本单元需要构建一个UML解析器,通过对输入的UML类图/顺序图/状态图的相关信息进行解析以供查询,其中课程组已提供输入整体架构及输入解析部分,仅 ...
随机推荐
- Cookie&Sission 部分方法
Cookie:创建Cookie:Cookie cookie = new Cookie(String cookieName,String cookieValue); cookie.setMaxAge(i ...
- 第一章-初识AngularJS
完全使用javascript编写的客户端技术.同其他历史悠久的Web技术配合使用,使Web应用开发比以往更简单,更快捷. Angularjs主要用于构建单页面Web应该.它通过增加开发人员和常见Web ...
- [Objective-C] 021 KVC、KVO
写过C#的都知道C#通过反射读写一个对象的属性特别方便,可以利用字符串的方式去动态控制一个对象.其实在ObjC中,我们可以更高级点,根本不必进行任何操作就可以进行属性的动态读写,这种方式就是Key V ...
- Python中出现 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 12-13: truncated \UXXXXXXXX escape
Python中出现 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 12-13: t ...
- Shell脚本 (三) 条件判断 与 流程控制
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 六.条件判断 1.基本语法 [ condition ](注意condition 前后要有空格) 注意:条 ...
- Java实现 LeetCode 773 滑动谜题(BFS)
773. 滑动谜题 在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示. 一次移动定义为选择 0 与一个相邻的数字(上下左右)进行交换. 最终 ...
- Java实现蓝桥杯模拟组织晚会
问题描述 小明要组织一台晚会,总共准备了 n 个节目.然后晚会的时间有限,他只能最终选择其中的 m 个节目. 这 n 个节目是按照小明设想的顺序给定的,顺序不能改变. 小明发现,观众对于晚上的喜欢程度 ...
- Java实现 LeetCode 313 超级丑数
313. 超级丑数 编写一段程序来查找第 n 个超级丑数. 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数. 示例: 输入: n = 12, primes = [2,7, ...
- TZOJ 数据结构实验--静态顺序栈
描述 创建一个顺序栈(静态),栈大小为5.能够完成栈的初始化.入栈.出栈.获取栈顶元素.销毁栈等操作. 顺序栈类型定义如下: typedef struct { int data[Max]; i ...
- Java重置Mysql主键自增长值
MySql 主键自增重置器(统一处理多个表) resetAutoincrement 是一款基于 Java 开发的程序,其功能为重置 mysql 数据库表的主键自增的值为最近的一个. 介绍 开发背景主要 ...