---恢复内容开始---

一、本单元两次作业的架构设计

第十三次作业:本次作业我创建了四个类,除去官方提供的Main和MyUmlInteraction类之外,还有Uclass和Ulinterface分别来储存相应的类和接口。在MyUmlInteraction类中完成新类的生成和对应name和id与这些类的映射。之后将属性、操作、继承等等属性通过映射找到相应的类或者接口然后加入。其中稍难的点是类实现接口,在这一方面我通过接口的自递归填充其所有的父接口,然后再完成类的所有继承从而实现类的所有接口的填充。查询的时候直接找到相应的类和接口调用其内部函数即可。(但是本次作业的MyUmlInteraction有太多生成新类和完成继承的操作使得其中有太多无关查询的函数,我应该将这些生成操作封装在一个新的类之中的)。

Bug:本次作业强测没有错点。

第二次作业:和第一次作业区别不大,无非是添加了状态图和顺序图,因此我新增加了StateDiagram和InteractionDiagram两个大类来管理这两种图的数据结构,然后进行一层层的封装,StateDiagram管理Machine类,Machine管理State类。InteractionDiagram也是同样操作。

而对于三个添加的check,我并没有新增操作,而是直接在实现类的继承和接口的继承那一块直接添加,通过新增循环继承的map和重复继承的map,每当DFS时发现循环继承就添加入map中,发现父类重复就代表重复继承,添加到map中,最后只要通过对这两个map的稍加加工就可以完成check工作。类图如下。

Bug出现:完全没有注意到空指针问题导致WA

二、架构设计和OO方法理解的改进

第一单元:作业一,初学java,连语言都不熟练,更不要说架构了。一股脑一个类,结构也是糟烂,不过对正则表达式使用还算合理,没有使用长正则表达式,而是使用while(m.find){m.group()}的结构对表达式进行拆分判别,从而减少了爆栈的出现。

到后面作业二和作业三能稍微理解分层设计,将数据结构一层层封装,将数据分成Exp、Term、Factor类,并在这三层之间形成递归关系从而完成运算。经过这三次作业,我在代码的层次化,基本架构上有所提高,同时对于程序的鲁棒性也有所理解。

第二单元:第一次接触多线程问题,难点在于同步互斥和数据传递。我的抽象化能力有所提高,看待电梯问题,明确什么是捎带,什么是电梯,捎带就是电梯仍然就是这么去接人,只不过接人的路上可能可以捎带上别人,它的接人方向和放人方向始终没有任何变化,因此我就将电梯的属性做了很大的调整,楼层的概念变得没那么重要,而方向作为主要属性,接人方向,放人方向和接人的极限层(即从接人任务结束的那一层)作为电梯每次开始运作的基础,然后每一层再给它分配任务,而不对这三个属性做任何变化。这是我对电梯的抽象,而在同步控制方面,我使用的是电梯去竞争请求,多部电梯和任务的关系是竞争关系,电梯去竞争任务而不是靠调度器调度任务,对调度器加锁,每次只有一部电梯可以进行调度,其他电梯就得等待。这就使整个多线程问题变的简单,当然在性能上面略显不足。

通过这一单元的学习,我对数据的交互、保护,对线程的同步互斥有了了解,同时对看待问题的抽象能力也有所提高,在架构方面也有了不小的提升。

第三单元:这一单元学JML,它是用于对Java程序进行规格化设计的一种表示语言,也因此,我们有了一个新的视角,即开发者、架构者的角度来看待问题。在这一单元,其实架构并没有引起我们困惑,因为官方包已经大大降低了我们的难度,加上JML语言的指导,其实本次的架构是最简单的,只要在相应的类中添加一些map等数据结构,对某些数据进行建图,运算保存,就可以完成。但是大家都觉得这次作业很简单,我不这么认为,因为我的算法能力实在是有些薄弱,对于建图,迪杰斯特拉这些本应该分分钟秒杀的算法,我却一而再再而三卡住,导致这个单元我的作业分数非常低。

本单元的作业对我来说就是个算法作业,在架构方面我学到了JML语言的严谨和对实现代码的帮助巨大,当然更学到了算法的重要性和基础性,很菜很真实。

第四单元:本单元引进了UML类图、顺序图、状态图,本单元对架构能力的锻炼应该是最好的。我们需要先理解UML各个元素的关系,其在数据方面的关系的表达,我们对数据的提取、存放、查找,这些都是很锻炼我们架构能力的。

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

第一个单元完全靠理解代码架构和实现方法来看逻辑是否有误,再附加一些自己造的数据来适当测试完成测试环节。其实第四单元的第一次作业我也是这么测试的,当然这种测试方法很危险,无法覆盖,出bug率很高,而且对一些很细微很愚蠢的bug会视而不见,比如有一次作业我的equal写成了==导致了错误,最后也是靠不断地数据测试,再定位找到的。

在后面几个单元,由于代码结构的庞大,代码量的增加,纯靠眼看代码是不可取的。对拍器也是我所采用的一种测试方式,虽然暴力但是有效,暴力的覆盖测试还是对于我们这些一千行不到的代码最有效的测试方法。

Junit测试,这种测试本应该很有效,但是由于懒得构造数据造成我没怎么使用过这个方法

四、课程收获

学到的不仅仅是JAVA这个语言的规范,更多的是对整个设计流程的理解,包括对问题的抽象化,如何构建数据结构,对数据的保护和传递,等等在设计方面需要我们考虑的因素。而在课程之外,还学到了心态别崩,google百度,看待一个问题要留一手,要持有怀疑态度,这些也是其他很多普通课程不曾带给我们过的。总之,OO课不是一门普通的课,它锻炼我们的脑子,锻炼我们的思维方式,更锻炼我们的心态。这是一门十分有趣、有挑战、令人回味的课程。

五、课程意见

1.关于实验课,感觉本学期实验课并不能学到很多东西,时间安排有些问题,同时部分内容也不是很好,或者说让我有些懵。有次关于继承和实现的实验内容很好,但是时间不够,之后也就不了了之。

2.作业难度应该循序渐进,开头难度有些过高,让大家对于架构的思考太少。

3.关于架构能力的指导可能还是少了一些,理论课上讲的某些东西还是过大或者说过高于我的水平,是否能提供一些更接地气的指导,提供更多的架构实例和讲解让我们更能一步一步的理解架构。

BUAAOO第四单元总结的更多相关文章

  1. BUAAOO第四单元总结与学期回顾

    第四单元架构设计 第四单元要完成的是对给定UML元素的建模/统计/分析,考虑到UML元素的组织是树状的,很容易想到基于树状的数据结构完成 由于UML元素已经由官方接口给出,因此结点类采用wrapper ...

  2. OO第四单元总结——查询UML类图 暨 OO课程总结

    一.本单元两次作业的架构设计总结 作业一.UML类图查询 1. 统计信息图 2. 复杂度分析 基本复杂度(Essential Complexity (ev(G)).模块设计复杂度(Module Des ...

  3. 2019OO第四单元作业总结&OO课程整体总结

    第四单元作业总结 第四单元的作业主题是UML图的解析,通过对UML图代码的解析,我对UML图的结构以及各种元素之间的关系的理解更加深入了. ------------------------------ ...

  4. linux基础-第十四单元 Linux网络原理及基础设置

    第十四单元 Linux网络原理及基础设置 三种网卡模式图 使用ifconfig命令来维护网络 ifconfig命令的功能 ifconfig命令的用法举例 使用ifup和ifdown命令启动和停止网卡 ...

  5. 北航oo作业第四单元小结

    1.总结本单元两次作业的架构设计 在我动手开始总结我的设计之前,我看了其他同学已经提交在班级群里的博客,不禁汗颜,我是真的偷懒.其他同学大多使用了新建一个类,用以储存每一个UMLelemet元素的具体 ...

  6. OO 第四单元总结

    一.总结本单元两次作业的框架设计 1.1. 需求分析 通过分析mdj文件可知,两次作业如果对于时间复杂度没有要求,可以不涉及任何数据结构,直接根据读入的UML_ELEMENT逐个分析得到各个函数的结果 ...

  7. oo作业第四单元总结暨结课总结

    目录 一.第四单元作业架构设计 1.第一次UML作业架构设计 2.第二次UML作业架构设计 二.架构设计和OO方法理解演进 三.测试理解与实践的演进 四.课程收获总结 五.三个具体改进建议 一.第四单 ...

  8. OO第四单元总结

    单元架构设计 本单元OO作业主要涉及两个过程,即先根据输入的elements数组建立UML存储模型,而后基于这个模型实现一系列查询判断功能.汲取上单元的经验,建模过程中模型数据容器的选择依据要求实现的 ...

  9. 面向对象程序设计第四单元总结(UML系列)

    2019面向对象程序设计第四单元总结 前言 ​ 本单元是面向对象程序设计课程的最后一个单元了,本单元是和UML模型相关,也就是说,我们需要正确理解UML模型的基础上,对构建出的UML模型进行解析,但是 ...

随机推荐

  1. Appium问题解决方案(6)- Java堆栈错误:java.lag.ClassNotFoundException:org.eclipse.swt.widets.Control

    背景 运行脚本出现 SWT folder '..\lib\location of your Java installation.' does not exist. Please set ANDROID ...

  2. AntDesign VUE:上传组件自定义限制的两种方式(Boolean、Promise)

    AntD上传组件 AntDesign VUE文档 第一种方式 beforeUpload(file) { let isLt = true if (filesSize) { isLt = file.siz ...

  3. Spring全自动AOP和项目加入jar包

    一.jar可以引进项目中,复制到路下后,要add as library,加载到工作空间中才能引入: 也jar包放在硬盘的项目目录外面,可以多个项目引入共用: 二.xml配置 1.aop全自动配置 2. ...

  4. 地址栏url中去掉所有参数

    1.地址栏url中去掉所有参数,这个是纯前端解决,很多时候页面跳转时候会选择在url后面带参数过去,(使用?&),方便传也方便取,但是我们要做的是不要让页面的一些请求参数暴露在外面 正常项目工 ...

  5. 线程调用BeginInvoke

    线程异步调用 Thread objThread = new Thread(new ThreadStart(delegate             {                 Dispatch ...

  6. 【PHP数据结构】线性查找与二分查找

    欢迎来到查找的世界,在学习完各种数据结构之后,总算走到了这一步,不知道大家有什么感想呢?反正我是边学边忘,现在让我去说说图的那几个算法还是在蒙圈的状态中.不过学习嘛,就是一步一步的来,暂时搞不懂的东西 ...

  7. Linux系列(4) - 目录处理命令(1)

    前言 linux中一切皆文件.目录为目录文件,普通文件用来保存数据,目录文件用来保存文件 建立目录:mkdir mkdir -p [目录名] -p 递归创建目录,例子:mkdir -p LinuxTe ...

  8. python学习笔记(九)-函数2

    交换两个变量的值 a = 2 b = 1 b = 1 a = 2 #方式一: b,a = a,b #交换两个变量的值 print(a,b) #方式二: a = a + b #3 b = a - b # ...

  9. 关于spring cloud项目搭建问题

    spring cloud 是基于spring boot搭建,父项目中引入依赖时候一定要将spring boot和spring cloud 的版本号对应起来,要不然jar包报错,项目也启动不起来!!!下 ...

  10. Hibernate 的 <= 出现问题

    问题模拟 select new map( e.name as name , e.salary as salary) from Emplpyee e where e.salary <= :sala ...