OOUML系列总结及终章回顾
盼望着,盼望着,OO课程终于结束了,但是,此刻的我却感到一丝失落,甚至想着再来一单元岂不妙哉?
总结本单元三次作业架构
本单元需要在理解UML类图、顺序图、状态图的各种元素以及元素之间关系的基础上解析输入的UML图,进行规则检查以及状态查询。由于第一次作业就面临大量种类元素以及不少的查询方法,因此我在架构方面下了些许功夫,重点在于理清各个Elements之间的逻辑层面上的联系,依据联系来逐层次解析类图。为了便于查询,我包装了个别元素,例如UmlClass->ClassDetail、UmlInterface->InterDetail等等,这些自己设置的类可以持有另一些元素,设置便于上层查询的方法,实际操作下来比较顺畅。
另外,容器的选择非常重要。个人认为自己选的比较好的容器是在查询是否有重名元素时,我使用了Map<String, HashSet<String>>嵌套容器,实际上是name2idset,有重名那么对应名字的set的size就会大于1。空间给的近似无限,本着遇事不决HashMap的原则,我设置了不少诸如id2MyItem、name2Id、id2Umlxxx的Map,实际用的时候也非常方便。
三次作业的UML类图基本一样,主要是第一次作业的涉及十分便于扩展,只需在相应包中添加扩展元素即可。唯一不足的是,在写第三次作业的时候,需要检查重复继承之流,set在此刻不香了,进行bfs/dfs的过程遭遇了许多bug,迫于无奈在很多地方重新添加了List,如此写了20多版才彻底解决问题。
在此列举第三次作业的类图

从类图中可以看到层次性很清晰,交互类与三种图交互,三种图并列,三种图下都有各自被包装的元素类。
四个单元中架构设计及OO方法理解的演进
四个单元一共只经历过一次大重构,那就是第一单元第一次作业到第二次作业。
当时第一次作业丝毫没有摆脱面向过程的思想,直接一main到底,方法全是static,变量也是static模拟全局变量。
经过同学们在讨论区的指点以及理论课的指导,我第二次作业就开始设计架构,将表达式的项抽象出共性,发现只需要设置一个类,存对应系数以及幂次方即可,然后添加求导方法、添加toString方法,即可比较优美的实现本次作业。
合理设计类、抽离共性接口、各司其职的思想在第三次作业达到一个里程碑,每种因子/结合方式(加减、乘、复合)设置类,实现求导接口,继承一个表达式抽象类,具体实现方式遵从求导法则,构建起表达式后直接调用求导方法,整个表达式将会进行链式求导。
自此,接下来的单元都着重关注架构的涉及,意在降低复杂度,避免重构,主要思想是设置必要的类存储一些数据及设置相应方法,需要这些数据的参与者也单独设置类,有时还需要多级流水线数据依赖关系,例如电梯第三次作业。这些思想有时候会和设计模式有所相似,比如生产者消费者模式、workerthreads模式等等。
第四单元的架构我是比较满意的,每个类的行数都严格受到控制,每个方法也尽量避免复杂,属性的设计非常到位,各有各的用处,自交互类向类图类向元素类层层深入,返回结果,十分清晰,最后代码行数虽然创新高--1500行,但是复杂度却迎来新低。

四个单元中测试理解与实践的演进
四个单元共12次代码作业,我都是白盒+黑盒测试,黑盒测试没什么好说的,就是随机轰炸
白盒测试十分重要!!!,原因是在第四单元第一次作业,由于太过相信自己的datamaker而导致ctle了一个点,其实如果datamaker数据强度上一个数量级能发现,但是其实自己低估了出数据的助教以及懒得造一个全连接图导致的败北。
第一单元:这单元随机测试用的是python的sympy以及xeger库,这单元作业需要保证程序的鲁棒性,白盒测试就尝试覆盖wf的各种情况,以及手造一些多嵌套的数据防止tle。
第二单元:电梯单元主要是随机测试,正确性检验主要是靠指导书的正确性判定规则书写判定代码,投放数据主要是python的subprocess。
第三单元:这单元白盒主要依靠强大的Junit4,书写完代码后先进行初步功能性测试,进而通过随机测试与同学们进行对拍保证正确性。
第四单元:这单元datamaker有点难做,最后直接模拟通过官方接口导出的数据形式来造数据,结合一些自己手绘starUML得知的规则,最后可以造出正确的数据,甚至第三次作业覆盖了大部分规则包括符合所有规则的数据。前面说到随机不可信,所以后两次作业也召集了小伙伴手造数据,防止再被诸如菱形图这样的数据卡。
课程收获
我开始着手撰写此次博客,也就意味着伴随一学期的OO课程也迎来了结束,回顾这16周每周一次代码作业/博客作业,还是不由得感叹咱们课程制度的新颖、充实、富有挑战。
经历了这一学期OO的洗礼,我认为自己写代码的能力有了一定程度的提高,同时感觉以前程序设计和数据结构白学了,以前写代码毫无章法,面向过程属实让人有些摸不着头脑,面向对象程序设计确实更加符合咱们的思维方式。
我认为最大的收获在于,我学会了层次化设计、多线程程序设计以及抽象化设计,课程组的作业设计让我在这三方面都得到了历练。至少,我认为自己以后编程,看问题不再是一个平面,将会依据题面描述进行抽象,根据抽象划分层次,另外,我认为多线程设计十分重要,提高程序运行效率,保证程序运行安全性都是十分有意义的锻炼。
三个具体改进建议
第三单元的实验有些摸不着头脑,尤其是GC那次作业,看代码就花费了大量时间,给的资料针对性不高,找错对我确实有不小的难度,可能我太菜了
理论课的小测考的太过理论,课堂讨论讨论积极性不高,可以加一些考验实操方面的题目,如第四单元,可以出一些诸如如何画xxx,xxx元素的xxx标签是什么意思,第三单元的补充jml、找错可以先在小测里预热等等。
研讨课最好给定一些主题,并且最好保证一下研讨同学的PPT,尽量讲干货,有的没的就少讲,某些研讨听的味同嚼蜡。
线上学习oo课程的体会
线上学习OO还是有一定的好处的,比如可以借机骚扰助教,不会体会到面对面的尴尬,另外,理论课是录播,可以提前听完,同时有遗忘也可以快速找回。在此还是十分感谢老师助教们,理论课视频更新飞快,助教们解决问题的速度也十分迅速,多人暴乱运动没怎么见到,正是这样的OO,吸引着我,让我也萌生了当助教的想法,但愿能顺利成为助教并且有能力承担这份责任。
最后照例祝愿OO越来越好!!
OOUML系列总结及终章回顾的更多相关文章
- C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.)
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 本系列,终 ...
- 史上最简单的 SpringCloud 教程 | 终章
https://blog.csdn.net/forezp/article/details/70148833转载请标明出处:http://blog.csdn.net/forezp/article/det ...
- 实战SpringCloud响应式微服务系列教程(第二章)
接上一篇:实战SpringCloud响应式微服务系列教程(第一章) 1.1.2背压 背压是响应式编程的核心概念,这一节也是我们了解响应式编程的重点. 1.背压的机制 在生产者/消费者模型中,我们意识到 ...
- Cobalt Strike系列教程第五章:截图与浏览器代理
Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...
- Cobalt Strike系列教程第四章:文件/进程管理与键盘记录
Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...
- SpringCloud 教程 | 终章
错过了这一篇,你可能再也学不会 Spring Cloud 了!Spring Boot做为下一代 web 框架,Spring Cloud 作为最新最火的微服务的翘楚,你还有什么理由拒绝.赶快上船吧,老船 ...
- Cobalt Strike系列教程第七章:提权与横向移动
Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...
- Cobalt Strike系列教程第六章:安装扩展
Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (11) -----第三章 查询之异步查询
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...
随机推荐
- img图片默认的3px空白缝隙解决方法
img{display:block;} 表示将img标签,即图片标签由行内元素变成一个块级元素. 一般在制作轮播网页或使用到img图片时,我们都会对图片设置img{display:bolck}.因为i ...
- 如何将文件夹取消svn关联
随便在什么目录新建一个文本文件,文件名随便,将文本文件打开,将下面的文字复制到文本文件中: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHI ...
- 「TcaplusDB知识库」概念(表、键、记录、索引)
TcaplusDB作为一款NoSQL数据库,语法与传统的SQL关系库有所差异.本文将详细介绍TcaplusDB表.记录.索引这三个数据库中常用术语在TcaplusDB中的概念与意义. 术语\概念 ...
- Java基础语法:包机制
为了更好地组织类,Java 提供了包(package)机制. 这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class).接口(interface).枚举(enumerations)和注释( ...
- 零基础学Python:数据容器
1.常用操作 列表常用操作 在 ipython 中定义一个 列表,例如: l= list() 输入 l. 按下 TAB 键, ipython 会提示 字典 能够使用的函数如下: 可以到官方网址查询使用 ...
- 基于docker快速搭建hbase集群
一.概述 HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文"Bigtable:一个结构化数据的分布式存储系统".就像Bigt ...
- JUnit5学习之八:综合进阶(终篇)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 微信小程序弹出框滚动穿透问题
1.在你的遮罩层最外层加 catchtouchmove="noneEnoughPeople" 里面是你的方法名2.noneEnoughPeople: function () { c ...
- ReactElement源码笔记
ReactElement 源码笔记 ReactElement通过 createElement创建,调用该方法需要 传入三个参数: type config children type指代这个ReactE ...
- pytorch(11)模型创建步骤与nn.Module
模型创建与nn.Module 网络模型创建步骤 nn.Module graph LR 模型 --> 模型创建 模型创建 --> 构建网络层 构建网络层 --> id[卷积层,池化层, ...