OO完结篇-第四单元小结
OO第四单元小结
一.作业架构分析。
1.第一次作业
本次作业需要完成UML类图查询。
难点在于初次接触UML,需要对UML进行一定程度的学习和理解。
思路主要是根据每个传进来的element获取其type然后进行分类以及层次化处理,由上而下,先找到所有的接口和类,构建Myclass和MyInterface,来管理类和接口的下层元素以及继承实现关系等信息。由于查询考虑到继承,所以还需要进行适当的信息建模,以便进行记忆化递归搜索。
具体架构如图:
2.第二次作业
本次作业需要完成UML顺序图和状态图的查询,检测三个规则。
难点在于三个规则的查询以及新的两个图的建模。
首先根据在第一次作业基础上,新建一个类来检查有效性,考虑使用离散化建模后来进行循环继承的查询。其余的思路同第一次作业,从上往下建模。
具体架构如图:
二.四个单元中架构设计与OO方法理解的演进
第一单元:多项式求导
第一次作业现在看来虽然简单,但是对于当时仅达到了解基本语法水平的我还是比较困难,主要是在于类之间的数据交互以及层次化地设计。但是第一二次作业我都使用了大正则来进行错误格式的判断,以及没有将各种多项式运算组合分散开,导致第三次作业完成得非常困难。但是完成第三次作业之后,发现之后的作业在层次化、基本架构有了较高的提升,代码复用性也慢慢变好。
第二单元:电梯
第二单元是非常有特色的也是发挥上限很高的一个单元。三次作业基本架构都是输入流、调度器、电梯三个线程一起,三者的同步互斥是重点和难点。输入流与调度器共享等待队列,调度器和各个电梯又共享新的待执行队列和单例化后的第二部分指令队列。正确性比较容易完成,但是优化有一定的难度。
完成电梯单元后,对各个对象之间的数据共享的同步互斥有了一定程度的理解,加深了对对象之间的交互、依赖的理解以及进一步提高了自己层次化设计的水平。
第三单元:规格化设计
第三单元我觉得是比较简单的一个单元,原因有二:官方包的提供极大简化了我们的代码设计;之前的训练让自己有了一定的提升。在读懂JML规格后,要做的事情就是:传入数据,离散化建模,统一算法。算法主要使用的是floyd算法,简单高效。层次主要就是path图和path内的节点列的管理。
这个单元的三次作业的代码复用性都明显比前两个单元的好很多,我认为这就是规格化设计的能力和魅力,严谨明确,让自己提前和规范设计的能力有了一定的提升。
前两个单元自己并没有多次使用继承和多态的特点,而这个单元的训练,对OO独特的继承、多态的方法有了更深层次的理解。
第四单元:UML解析
UML类图、顺序图、状态图主要是为了锻炼我们工程化设计的能力,这个单元主要在于对UML各个元素内部要素的理解以及对元素之间层次化的树的关系的理解。理解完成后,就要综合前三单元学到的知识,来对元素分类、层次化设计、设计适当的查询算法。完成这个单元的过程中,我对层次化的设计、对象之间的交互、共享数据的保护、各个类和各个方法的分工等工作的完成流畅度和明显好于前三个单元,可见经过前面三个单元的训练,不知不觉地我们在OO道路上已经前进了不少。
三.四个单元中测试理解与实践的演进
测试的目的一直都是来确认程序的正确性和性能优劣。
我一个学期以来都采用了比较low的测试方法:手动捏数据。根据自己在代码过程中的bug数据,自己总结的一些极端情况的数据以及室友提供的部分大测试数据,来进行自测和互测。
尽管一直都是手搓数据点,但是从第一二单元bug重重到第三四单元bug较少的情况来看,一是随着训练的推进自己的代码水平有了一定提升,二是测试数据的构造思路有了一定的改善,能更快的发现哪里容易有坑,也能较快地对之进行修复。
四.课程收获
自动化测试主要是用于代码的覆盖测试和高效测试,虽然我自己实践不足,所以只有在代码思路设计方面多下功夫。几乎每一次作业我都会在动手写代码之前写一份简要的思路设计,这样做的好处我觉得主要是有:方便自己将一个大问题分成若干小问题,逐个解决;从设计上就杜绝了大部分可能会出现的bug。随着训练的推进,我发现这种方法越来越好用,并且代码时间越来越短,bug出现的概率越来越小,同时也能加深对面向对象方法的理解,提升代码的设计能力。
四个单元,11次代码作业,这一路走来跌跌撞撞,但是也学到了很多很多东西:无论是从面向过程到面向对象,还是从一main到底到多个类的层次化设计,亦或是从艰难几十行到顺利完成千行工程代码,从OO这门课程学到的知识是良多的,但更重要的是在这修罗道路上前进的同时,自己变得更加坚强了。
五.一些建议
1.第一单元建议先来一次较为简单的JML规格作业,能够快速地帮助我们理解层次化设计和OO特点。
2.我认为互测是OO这门课的一大特色以及在助教的努力下,其进步是明显的。但是实际上,我们对互测的热情从第一单元到第三单元是递减的(可能数据体现不出来),或者说几乎没有看别人代码,而是盲狙或者自动化测试,似乎与互测的目的背道而驰,或许互测机制需要更好地完善。
3.说实话,实验课的体验很不好,主要是上完新课下午就去实验,一开始难度太大,后来是现场自学,希望实验课降低分数比例或者改进实验课。
OO完结篇-第四单元小结的更多相关文章
- 北航oo作业第四单元小结
1.总结本单元两次作业的架构设计 在我动手开始总结我的设计之前,我看了其他同学已经提交在班级群里的博客,不禁汗颜,我是真的偷懒.其他同学大多使用了新建一个类,用以储存每一个UMLelemet元素的具体 ...
- OO第四单元总结及学期总结
目录 OO第四单元总结及学期总结 第四单元三次作业架构设计 第十三次作业 第十四次作业 第十五次作业 四个单元中架构设计及OO方法理解的演进 第一单元 第二单元 第三单元 第四单元 四个单元中测试理解 ...
- 【OO学习】OO第四单元作业总结及OO课程总结
[OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...
- BUAA OO 2019 第四单元作业总结
目录 第四单元总结 总 UML UML 类图 UML 时序图 UML 状态图 架构设计 第十三次作业 第十四次作业 课程总结 历次作业总结 架构设计 面向对象方法理解 测试方法理解与实践 改进建议 尽 ...
- 第四单元博客总结——暨OO课程总结
第四单元博客总结--暨OO课程总结 第四单元架构设计 第一次UML作业 简单陈述 第一次作业较为简单,只需要实现查询功能,并在查询的同时考虑到性能问题,即我简单的将每一次查询的结果以及递归的上层结果都 ...
- OO第四单元作业小结
一.本单元两次作业的架构设计 1.第一次作业 整体思路:以class为核心,建立MyInterface.MyAttribute.MyOperation.MyAssociation四个类分别储存每个类的 ...
- OO第二单元小结
OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...
- OO第四单元总结——查询UML类图 暨 OO课程总结
一.本单元两次作业的架构设计总结 作业一.UML类图查询 1. 统计信息图 2. 复杂度分析 基本复杂度(Essential Complexity (ev(G)).模块设计复杂度(Module Des ...
- Appium+python自动化(四十二)-Appium自动化测试框架综合实践- 寿终正寝完结篇(超详解)
1.简介 按照上一篇的计划,今天给小伙伴们分享执行测试用例,生成测试报告,以及自动化平台.今天这篇分享讲解完.Appium自动化测试框架就要告一段落了. 2.执行测试用例&报告生成 测试报告, ...
随机推荐
- 4.Docker 操作容器
启动容器 所需要的命令主要为 docker run.例如,下面的命令输出一个 “Hello World”,之后终止容器. docker run ubuntu:16.04 /bin/echo 'Hell ...
- BZOJ3932 CQOI2015 任务查询系统 - 主席树,离散化
记录下自己写错的地方吧 1. 区间可能有重复 2. 没有出现的坐标也要计入version (因为询问里可能会有) #include <bits/stdc++.h> using namesp ...
- 使用饿了么el-date-picker里及如何将后台给的时间戳js转化为时间格式
首先代码是这个样子的,使用v-model <el-date-picker v-model="formData.createTime" :disabled="true ...
- numpy 生成数组
可以看这个博客 https://www.cnblogs.com/td15980891505/p/6082858.html import numpy as np 建立数组并初始化数组 np.zeros( ...
- SIFT算法原理(3)-确定关键点的主方位,构建关键点描述符
介绍官网:https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_sift_intro/py_sift_intro.html ...
- 0003 配置完整的url访问路径
本文本以OrgsAndUser APP为例,每增加一个url都需要做以下步骤: 1 创建模板 在OrgsAndUsers/Templates目录下创建一个名为org-home.html的文件,内容如下 ...
- 题解【AcWing178】第K短路
题面 经典的 \(\text{A*}\) 算法例题. 我们可以把估价函数 \(f(i)\) 设置成当前点 \(i\) 到终点 \(t\) 的最短距离,这可以建反图使用 \(\text{Dijkstra ...
- Linux - Shell - 算数表达式 - 位运算
概述 shell 中基于 $(()) 的 位运算 背景 复习 shell 脚本 凑数吧 准备 环境 os centos7 1. 位运算 代码 #!/bin/bash # 位运算 arg1=2 arg2 ...
- 【PAT甲级】1117 Eddington Number (25分)
题意: 输入一个正整数N(<=100000),接着输入N个非负整数.输出最大的整数E使得有至少E个整数大于E. AAAAAccepted code: #define HAVE_STRUCT_TI ...
- [一本通学习笔记] 最近公共祖先LCA
本节内容过于暴力没什么好说的.借着这个专题改掉写倍增的陋习,虽然写链剖代码长了点不过常数小还是很香. 10130. 「一本通 4.4 例 1」点的距离 #include <bits/stdc++ ...