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>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...
随机推荐
- 「NGK每日快讯」2021.1.25日NGK公链第83期官方快讯!
- linux 安装node和pm2
用yum安装 curl -sL https://rpm.nodesource.com/setup_10.x | bash - yum install -y nodejs npm install -g ...
- Debian 基本使用进阶
系统安装好了我们,迫不及待的想要在Linux系统中肆意翱翔.如果是刚刚接触Linux的系统的话,可能一时间还无法适应Linux的系统环境.对于使用Debian来做服务器的选择,最好的练习方式的就是使用 ...
- DRF 三大认证之身份认证
目录 路由组件补充 三大认证 一.身份认证 1.如何进行身份认证 2.jwt认证规则原理 3.jwt的组成 4.jwt的使用方法 4.1 签发算法 4.2 校验算法 4.3 刷新算法 二.权限认证 三 ...
- 后端程序员之路 36、Apache Kafka
Apache Kafkahttp://kafka.apache.org/ Kafka,很容易就联想到<海边的卡夫卡>,文艺程度和Casablanca有得一拼.Kafka是一个分布式消息系统 ...
- 构造方法和this的作用
一.构造方法概述 构造方法是一个特殊的方法 是创建对象时候调用的方法 方法的名字很特殊:必须和类名保持一致,大小写都要一样 方法没有返回值 方法也没有返回值类型 构造方法无法在外部手动调用 publi ...
- if...else和switch...case
一.位运算 class Demo01 { public static void main(String[] args) { int a = 5; int b = 3; /* 0000 0101 |00 ...
- MySQL注入流程
目录 确认注入点 信息收集 数据获取 提权 写个MySQL注入流程的大纲,类似一份全局地图,能指导下一步工作.MySQL注入流程分为四步: 确认注入点 信息收集 数据获取 提权 确认注入点 参考:ht ...
- 在不使用外延层的同轴半绝缘衬底材料上制作4H-SIC横向双重注入金属氧化物半导体场效应晶体管
在不使用外延层的同轴半绝缘衬底材料上制作4H-SIC横向双重注入金属氧化物半导体场效应晶体管 杂志:日本应用物理杂志 在不使用外延层在同轴的半绝缘SIC衬底上制作4H-SIC横向双重注入金属氧化物 ...
- 10个顶级Python实用库,推荐你试试!
为什么我喜欢Python?对于初学者来说,这是一种简单易学的编程语言,另一个原因:大量开箱即用的第三方库,正是23万个由用户提供的软件包使得Python真正强大和流行. 在本文中,我挑选了15个最有用 ...