BUAAOO第四单元总结
---恢复内容开始---
一、本单元两次作业的架构设计
第十三次作业:本次作业我创建了四个类,除去官方提供的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第四单元总结的更多相关文章
- BUAAOO第四单元总结与学期回顾
第四单元架构设计 第四单元要完成的是对给定UML元素的建模/统计/分析,考虑到UML元素的组织是树状的,很容易想到基于树状的数据结构完成 由于UML元素已经由官方接口给出,因此结点类采用wrapper ...
- OO第四单元总结——查询UML类图 暨 OO课程总结
一.本单元两次作业的架构设计总结 作业一.UML类图查询 1. 统计信息图 2. 复杂度分析 基本复杂度(Essential Complexity (ev(G)).模块设计复杂度(Module Des ...
- 2019OO第四单元作业总结&OO课程整体总结
第四单元作业总结 第四单元的作业主题是UML图的解析,通过对UML图代码的解析,我对UML图的结构以及各种元素之间的关系的理解更加深入了. ------------------------------ ...
- linux基础-第十四单元 Linux网络原理及基础设置
第十四单元 Linux网络原理及基础设置 三种网卡模式图 使用ifconfig命令来维护网络 ifconfig命令的功能 ifconfig命令的用法举例 使用ifup和ifdown命令启动和停止网卡 ...
- 北航oo作业第四单元小结
1.总结本单元两次作业的架构设计 在我动手开始总结我的设计之前,我看了其他同学已经提交在班级群里的博客,不禁汗颜,我是真的偷懒.其他同学大多使用了新建一个类,用以储存每一个UMLelemet元素的具体 ...
- OO 第四单元总结
一.总结本单元两次作业的框架设计 1.1. 需求分析 通过分析mdj文件可知,两次作业如果对于时间复杂度没有要求,可以不涉及任何数据结构,直接根据读入的UML_ELEMENT逐个分析得到各个函数的结果 ...
- oo作业第四单元总结暨结课总结
目录 一.第四单元作业架构设计 1.第一次UML作业架构设计 2.第二次UML作业架构设计 二.架构设计和OO方法理解演进 三.测试理解与实践的演进 四.课程收获总结 五.三个具体改进建议 一.第四单 ...
- OO第四单元总结
单元架构设计 本单元OO作业主要涉及两个过程,即先根据输入的elements数组建立UML存储模型,而后基于这个模型实现一系列查询判断功能.汲取上单元的经验,建模过程中模型数据容器的选择依据要求实现的 ...
- 面向对象程序设计第四单元总结(UML系列)
2019面向对象程序设计第四单元总结 前言 本单元是面向对象程序设计课程的最后一个单元了,本单元是和UML模型相关,也就是说,我们需要正确理解UML模型的基础上,对构建出的UML模型进行解析,但是 ...
随机推荐
- WEB安全性测试之拒绝服务攻击
1,认证 需要登录帐号的角色 2,授权 帐号的角色的操作范围 3,避免未经授权页面直接可以访问 使用绝对url(PS:绝对ur可以通过httpwatch监控每一个请求,获取请求对应的页面),登录后台的 ...
- 植入式Web前端开发方法
上一篇,我讲述了植入式Web前端开发的基本情况,本篇就来探究其开发方法.以下假定CMS只能植入前端代码,并且需求规模是任意大小的. 代码形式 HTML代码是直接植入的毫无疑问,但除非植入的代码非常简短 ...
- 聊聊ReentrantLock基于AQS的公平锁和非公平锁的实现区别
ReentrantLock锁的实现是基于AQS实现的,所以先简单说下AQS: AQS是AbstractQueuedSynchronizer缩写,顾名思义:抽象的队列同步器,它是JUC里面许多同步工具类 ...
- 【Sass/SCSS 完整自学中文版教程01】SCSS 官方英文文档翻译整理
Sass 基本介绍 目录 Sass 基本介绍 注释(Comments) 单行注释(Single-line comments) 多行注释(Multi-line comments) SassDoc 特殊的 ...
- AES加密基本原理图解
AES加密 Fright-Moch整理 AES简介 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的).对 ...
- php学习记录,使用script脚本
echo "<script>alert()</script>"; 原来还能这么用,之前以为echo就是普通的用来打印 同时还可以在script标签下使用lo ...
- RestFul的认识与详解
RestFul :是一种软件架构风格,设计风格,而不是标准.提供了一组设计原则和约束条件. 简单概述: REST -- REpresentational State Transfer 直接翻译:表现层 ...
- MapReduce原理深入理解(一)
1.MapReduce概念 1)MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题. 2)MapReduce是分布式运行的,由两个阶段组成:Map和R ...
- 一起学习PHP的runkit扩展如何使用
这次又为大家带来一个好玩的扩展.我们知道,在 PHP 运行的时候,也就是部署完成后,我们是不能修改常量的值,也不能修改方法体内部的实现的.也就是说,我们编码完成后,将代码上传到服务器,这时候,我们想在 ...
- vue实现事件代理(通过事件冒泡实现)
事件代理/事件委托以ul>li来模拟 使用冒泡的用法:使用冒泡的用法来实现事件代理 分离出来 动态根据索引添加类名: