BUAA-OO-2019 第四单元总结
UML作业架构设计
这一单元的作业本质上是对数据之间的联系进行解析,并重新建立数据结构以方便查询的工作,这就要求我们了解各种UmlElement的结构以及他们之间的关系是如何组织的。
第十三次作业
在这次作业的架构上,首先是建立了MyUmlInteraction
类,实现UmlInteraction
接口,以完成各种查询方法。由于输入数据不保证顺序性,所以不能边读边处理,而是要先将各种元素分类保存在相应的容器中。对于那些后续要通过name
或id
查询的元素,都使用了HashMap
存储以提高查询效率。之后通过一系列build*
方法建立继承、实现、关联等关系,再把各种属性、方法、参数加入到相应的类或接口中。
为了方便类和接口管理他们的数据,我为UML中“类”和“接口”的概念又分别开了相应的类。这样一来,一个类(接口)有什么属性、方法、参数,实现了哪些接口,与谁有关联,就都非常清楚了,而且更能体现一种从属关系。更重要的一点在于,每个类(接口)还可以有一个指向父类(父接口)的属性,形成一种树形的结构,方便遍历访问。
第十四次作业
这次作业是上一次作业的扩展,整体的架构思路没有太大的变化。需要调整的地方在于,这次要支持三种UML图的查询,这些方法的实现不可能都放在一个大的类中,所以理想的架构是对于每种图的查询分别在各自的类中实现,然后集中在MyUmlGeneralInteraction
中实例化,最终将各种查询操作委托给各自所属的类。
在数据存储和管理方面和上一次作业大同小异,都是有什么元素就建立相应的容器,必要时再开新的类,例如图中的State
、StateMachine
、Interaction
。
本次作业我耗时最多的部分是实现模型有效性检查,需要考虑关联、实现、继承的直接或间接关系,在遍历时保证不重不漏。其实从难度上来说并不大,只是一些概念不太清晰,需要想清楚各种可能的情况。
OO课程总结
对架构设计及OO方法的理解
OO课程的每个单元作业都分为两到三个阶段,这与实际开发中逐渐增改需求的情况是相近的。如果一开始的架构是好的,那么后续作业的扩展就相对容易。但于我而言,往往后续的作业会让我意识到之前的架构设计并不理想,有时甚至到了不得不重构的地步。在这一次次的推倒重来中,我会渐渐明白什么样的架构是好的,怎样才能写出好的架构。好的架构的特点是简洁、清晰、高内聚、低耦合、易维护、可扩展,这也是OO方法中很重要的一部分。具体来说,每个类或方法都应只有一个明确的职责,只管理自己该管理的数据。对于有泛化关系的类应采用继承来表现共性中的特性,但也要注意对于没有层次关系的类不应滥用继承。要合理设置属性、方法的访问权限,尽可能将数据隐藏起来并提供相应的访问操作。策略与机制分离,将功能模块化封装,降低依赖性和耦合度,使得更改某一功能的实现不必牵连太多其他代码。诸如此类的设计原则还有很多,总之我的狭义的理解是,能在一次次作业的迭代中保持结构清晰稳固、功能愈发健壮的架构就是好的架构。
对测试的理解与实践
OO作业中用到的测试方法基本上就两种:朴素地生成大量数据进行测试,和通过OpenJML、JMLUnitNG等工具进行自动化测试。
第一种方法,按照数据生成的方式可分为人工手造数据和自动化批量生成数据,前者效率较低且一般只能覆盖到一部分情况,后者效率很高而且几乎能覆盖到所有情况,但要求能正确编写数据生成脚本。无论怎样生成数据,为了尽可能的覆盖到所有的情况,我们需要对输入数据的各部分的各种可能进行组合;另一方面,我们要确保测试数据能让代码中的每个分支都被执行到。此外,按照正确性检验的方式,这种方法还可分为标准答案检验和对拍检验。前者的前提是能通过某种方法事先得到输入数据的正确输出结果,这样能确保判定结果的绝对正确性。如果无法得到标答,那么只能采取对拍的方式,即将两人或多人的答案进行比对,对其中有差异的地方分析出是哪一方的问题。当然不排除会有输出同样的错误结果的可能性,只不过发生这种情况的概率很低。
第二种方法,也是OO课程想培养我们学会的测试技能,即通过JML工具链,自动化地生成测试样例。说实话我对这一方面的了解不是很深,更多是一些实验性质的探索,了解了它能做什么及其基本的原理。这种测试方法的好处在于,测试数据的生成全程自动化,且理论上能覆盖到所有的情况。但它的弱势也是显而易见的:学习成本高,需要花更多的时间在代码中编写JML测试相关的语句,这是有一定难度的。
个人认为,可能在工业界,尤其是那些不容许任何程序错误的场景下(如航空航天、军事领域),使用JML相关工具进行严密的测试是必要的。但在OO课程的作业中,甚至是小团队的实际开发过程中,用最短的时间实现最高的效益可能是选择测试方法时更需要考虑的因素。
然而无论如何,JML是一门值得了解和学习的技术。
课程收获
我在这一学期OO课程中的收获是多方面的。
首先,熟练掌握了基本的Java语言。Java是一门跨平台的面向对象编程语言,在学界和工业界都有着广泛的应用。正所谓“工欲善其事,必先利其器”,要学习面向对象思想,首先必须得打好语言的基础。其实课程中对于Java语言本身的教学内容并不多,后期遇到了问题更多是自己上网查找资料,通过各种文档和博客,逐渐强化了使用Java的功底。从这个角度来看,这门课还培养了我自主学习和独立解决问题的能力。
其次,对于多线程编程有了较深的理解。多线程编程是实际开发中常常会用到的一种技术,学习它我们才能解决多模块协作的问题,充分利用CPU的资源。多线程问题需要我们使用合适的设计模式,对各线程间的同步、互斥有深入的理解,全面和仔细地分析协作是如何进行的,这对我们的思维能力也是一种锻炼。
再次,对JML(Java Modeling Language)有了一定的了解。JML是基于“契约式编程”的一种规格描述语言,相比于自然语言注释,JML更加严谨和清晰。我们从两个方面进行了训练:根据需求撰写规格,以及根据规格实现代码。此外,我们还尝试使用JML工具链自动化生成测试样例进行测试。无论体验如何,学习这样一门技术是有必要的,相信将会在未来的实际开发中使我受益。
从次,还学习了UML(Unified Modeling Language)的相关知识。UML通过可视化的图形形式,帮助开发者对大规模、复杂系统进行建模,这对于设计面向对象的架构具有重要的意义。通过对UML文件的解析,得以深入了解各种元素的结构和组织方式,以及检验模型有效性的原则,在这个过程中对面向对象语言的特性也有了更深的理解。
最后,也是最重要的一点,就是对面向对象思想的感悟。它不是某一个具体的知识点,但却是贯穿整个OO课程的灵魂。在每次作业的架构设计中,我对于面向对象的理解都有进一步的加深。具体的内容我已在前文中有过总结,但它的精髓远不止架构设计这么简单。面向对象是一种编程技术,但它更是一种思考问题的方式,一种世界观,一种哲学。世间万物是普遍联系的,它们之间的关系如此复杂,以至于不能孤立地只用过程式的观点来描述事物如何运作。面向对象通过抽象形成类、层次、继承等概念,为我们提供了一个全新的视角……
改进建议
- Checkstyle中每行最多80个字符的限制我认为不够合理,编写代码时往往硬生生地把一句逻辑连贯的代码拆成多行,仅仅因为属性或方法名较多、较长。个人认为在阅读代码时,莫名其妙的换行比一行稍长的代码体验更糟。建议将每行的字符数上限改为100~120。
- 希望BUG修复可以挽回强测中一定比例的分数。
- 希望课程组能合理安排实验课时间,避免再发生上午刚接触的新知识下午就考的情况。
BUAA-OO-2019 第四单元总结的更多相关文章
- BUAA OO 2019 第四单元作业总结
目录 第四单元总结 总 UML UML 类图 UML 时序图 UML 状态图 架构设计 第十三次作业 第十四次作业 课程总结 历次作业总结 架构设计 面向对象方法理解 测试方法理解与实践 改进建议 尽 ...
- BUAA OO 2019 第三单元作业总结
目录 总 JML规格化设计 理论基础 工具链 规格验证 验证代码 代码静态检查 自动生成测试样例 生成结果 错误分析 作业设计 第九次作业 架构 代码实现 第十次作业 架构 代码实现 第十一次作业 架 ...
- BUAA OO 2019 第一单元作业总结
目录 总 架构 Controller Model 输入处理 代码静态分析 行数 方法复杂度 UML 类图 优点 缺点 坑 输入 非法的空白字符 输入的简并处理 运算 浅拷贝 可变类型与不可变类型 ...
- BUAA OO 2019 第二单元作业总结
目录 总 架构 controller model view 优化算法 Look 算法 多种算法取优 预测未来 多线程 第五次作业 第六次作业 第七次作业 代码静态分析 UML 类图 类复杂度 类总代码 ...
- 北航oo作业第四单元小结
1.总结本单元两次作业的架构设计 在我动手开始总结我的设计之前,我看了其他同学已经提交在班级群里的博客,不禁汗颜,我是真的偷懒.其他同学大多使用了新建一个类,用以储存每一个UMLelemet元素的具体 ...
- oo作业第四单元总结暨结课总结
目录 一.第四单元作业架构设计 1.第一次UML作业架构设计 2.第二次UML作业架构设计 二.架构设计和OO方法理解演进 三.测试理解与实践的演进 四.课程收获总结 五.三个具体改进建议 一.第四单 ...
- 北航OO(2020)第四单元博客作业暨学期总结
一.第四单元架构设计 1.第一次作业 我在本次作业中设置了多个储存结构:Directory,ElementsInName,ElementsInId,Cache. Directory: 顾名思义,这是个 ...
- 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾
「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 目录 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 Part 0 第四单元作业架构设计 架构设计概要 AppRun ...
- 2019年北航OO第四单元(UML任务)及学期总结
第四单元两次作业总结 第十三次作业 需求分析 本次作业需要完成一个UML类图解析器,所需要解析的只有符合UML标准和能够在Java 8中复现的UML类图.查询指令存在两种:仅与所查对象有关的指令,以及 ...
- OO第四次博客作业(第四单元作业及期末总结)
(注意:本文写作顺序与作业要求不完全一致,但涵盖了作业的所有要求) 一学期的BUAA特色OO课程结束了. PART 1 我想先写我这一学期的感想 从第一单元满怀期待地写完多项式求值到最后看着60分不 ...
随机推荐
- 【洛谷P3756】[CQOI2017]老C的方块(最小割)
洛谷 题意: 给出一个网格图类似于这样: 现在给出一个\(n*m\)大小的网格,之后会给出一些点,若某些点相连形成了如下的几个图案,那么就是不好的. 现在可以删去一些点,但删除每个点都有一些代价,问最 ...
- 使用构造函数 Boolean 创造的对象不是布尔值,而是对象,typeof new Boolean(1) == 'object'
注意,使用构造函数 Boolean 创造的对象不是布尔值: 事实上 new Boolean() 返回的是一个 Boolean 对象: typeof new Boolean(1) == 'object' ...
- 洛谷 U87052 一线天
洛谷 U87052 一线天 题目传送门 题目背景 \(JDFZ\)即将举办第一届"一线天"趣味运动会...... 题目描述 "一线天"运动会在\(JLU\)南岭 ...
- CloudCompare打开pcd文件
Ubuntu下CloudCompare稳定版本无法打开pcd点云文件,切换到edge版本即可 $ sudo snap refresh --edge cloudcompare
- hdu1495-非常可乐-(倒水问题bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1495 题解: 1.最少次数?江湖套路,bfs.2.怎么倒?从一个杯子倒到另一个杯子.3.倒多少?因为没有刻度,所 ...
- css样式添加错误导致烦扰
省厅和市州 两个ul 之间切换 分别能显示两者对应的内容 但是在做过程中,出现省厅界面有市州的内容… 找了半天,发现是css的问题 layui-show的多添加 算是把首页内容的任务解决了至于c ...
- vector的基本操作
vector怎么删除元素? #include<iostream> #include<vector> using namespace std; int main() { vect ...
- A1033 To Fill or Not to Fill (25 分)
一.技术总结 是贪心算法的题目,题目主要考虑的问题有几个,是否会在第一个加油站的最近距离大于0,如果是这样那么直接输出答案,因为初始油箱没有汽油: 第二个是如何选定加油站,如果在可到达距离范围类,我们 ...
- Python例题集
例题1:任意输入一组数据比较其最大值并记录输入的数据个数. 源代码: def max(*a): m=a[0] i=0 for x in a: i+=1 if x>m: m=x print('参数 ...
- Linux性能优化实战学习笔记:第四十六讲
一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模块的基本分析.定位思路,并熟悉了相关的优化方 ...