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>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...
随机推荐
- subline3 如何设置es6高亮
步骤: 1.操作Ctrl+Shift+P , 然后在弹出的框内输入Package Control: in,2.选择Package Control: install package,3.等待再次弹出输入 ...
- USDN代币的特点
USDN是NGK公链发行的算法型稳定币,采用智能合约发行,通过智能合约的透明化,能够让市场USND持有者获得算法稳定的背书.USDN是一种锚定全球通用的代币,更是连接全球数字经济的通用数字代币.USD ...
- 负利率时代,NGK DeFi是否会推动资本向加密货币迁徙?
2020年,全球经济危机持续,贸易战争以及天灾人祸使得全球各国的经济雪上加霜,为了挽救低迷的经济,美国.欧洲.日本各国央行竞相放水,全球正在滑入负利率时代. 负利率下,资本加速从法币向数字货币迁徙,因 ...
- WPF 如何修改button圆角(经典)
本人想设置Button为圆角,奈何搜索百度,找到的全是坑爹答案,现总结如下: 1. 需要添加button 的template. 2. 设置border的时候,必须要设置background, 否则会提 ...
- Java之HTTP网络编程(一):TCP/SSL网页下载
目录 一.简介:HTTP程序设计 1.HTTP系统设计 2.HTTP客户端工作过程 3.HTTP服务端工作过程 二.基于TCP Socket的HTTP网页下载 三.基于SSL Socket的HTTPS ...
- Docker安装开发环境
目录 Docker Docker 安装 Mysql Docker 安装Redis Docker 安装Zookeeper Docker Docker 安装 Mysql Docker 查看可用Mysql镜 ...
- kali msf6 更新及bug处理
问题描述 Metasploit 漏洞库更新,利用msfupdate命令更新,出现已停止该命令更新,出现如下提示: 利用一句话安装更新,命令如下,安装过程中有部分警告出现 curl https://ra ...
- docker+compose+nginx+php
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 我用docker做什么? 快速搭建开发所需环境,测试实验新 ...
- ES6学习笔记(1)- 块级作用域
1. var声明变量和变量提升(Hoisting)机制的问题 在JS中通过var关键字声明的变量,无论在函数作用域中亦或是全局作用域中,都会被当成当前作用域顶部的变量,和就是所谓的提升机制(Hoist ...
- 2019HDU多校第一场 6582 Path 【最短路+最大流最小割】
一.题目 Path 二.分析 首先肯定要求最短路,然后如何确定所有的最短路其实有多种方法. 1 根据最短路,那么最短路上的边肯定是可以满足$dist[from] + e.cost = dist[to] ...