盼望着,盼望着,OO课程终于结束了,但是,此刻的我却感到一丝失落,甚至想着再来一单元岂不妙哉?

总结本单元三次作业架构

本单元需要在理解UML类图、顺序图、状态图的各种元素以及元素之间关系的基础上解析输入的UML图,进行规则检查以及状态查询。由于第一次作业就面临大量种类元素以及不少的查询方法,因此我在架构方面下了些许功夫,重点在于理清各个Elements之间的逻辑层面上的联系,依据联系来逐层次解析类图。为了便于查询,我包装了个别元素,例如UmlClass->ClassDetailUmlInterface->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系列总结及终章回顾的更多相关文章

  1. C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.)

    前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 本系列,终 ...

  2. 史上最简单的 SpringCloud 教程 | 终章

    https://blog.csdn.net/forezp/article/details/70148833转载请标明出处:http://blog.csdn.net/forezp/article/det ...

  3. 实战SpringCloud响应式微服务系列教程(第二章)

    接上一篇:实战SpringCloud响应式微服务系列教程(第一章) 1.1.2背压 背压是响应式编程的核心概念,这一节也是我们了解响应式编程的重点. 1.背压的机制 在生产者/消费者模型中,我们意识到 ...

  4. Cobalt Strike系列教程第五章:截图与浏览器代理

    Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...

  5. Cobalt Strike系列教程第四章:文件/进程管理与键盘记录

    Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...

  6. SpringCloud 教程 | 终章

    错过了这一篇,你可能再也学不会 Spring Cloud 了!Spring Boot做为下一代 web 框架,Spring Cloud 作为最新最火的微服务的翘楚,你还有什么理由拒绝.赶快上船吧,老船 ...

  7. Cobalt Strike系列教程第七章:提权与横向移动

    Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...

  8. Cobalt Strike系列教程第六章:安装扩展

    Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...

  9. 《Entity Framework 6 Recipes》中文翻译系列 (11) -----第三章 查询之异步查询

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...

随机推荐

  1. Python算法_三种斐波那契数列算法

    斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列&qu ...

  2. 【SVM】kaggle之澳大利亚天气预测

    项目目标 由于大气运动极为复杂,影响天气的因素较多,而人们认识大气本身运动的能力极为有限,因此天气预报水平较低,预报员在预报实践中,每次预报的过程都极为复杂,需要综合分析,并预报各气象要素,比如温度. ...

  3. Android 开发学习进程0.28 腾讯TBS接入和相关问题

    TBS 的接入和使用 TBS 的接入 腾讯TBS是X5内核的升级版,可以当作webview 来打开 网页,可以以用来打开docx doc pdf 等文件,这里主要使用的是文件功能. 依赖接入 api ...

  4. Docker-compose封装mysql并初始化数据以及redis

    一.概述 现有一台服务器,需要部署mysql和redis.其中mysql容器,需要在第一次启动时,执行sql文件. redis保持空数据即可. 关于Docker-compose的安装,请参考连接: h ...

  5. 【图像处理】使用OpenCV进行图像处理教程(一)

    OpenCV是进行图像处理的工具,也是计算机视觉领域近十几年不断发展和完善的产物.面对这个已基本成熟的开源库知识体系,我们新生代有必要不断地总结.回顾,以新的视角快速融入计算机视觉的奥秘世界. 从这篇 ...

  6. 追洞小组 | 实战CVE-2020-7471漏洞

    出品|MS08067实验室(www.ms08067.com) 本文作者:守拙(Ms08067实验室追洞小组成员) 一.漏洞名称: 通过StringAgg(分隔符)的潜在SQL注入漏洞 二.漏洞编号: ...

  7. C# 基础 - 堆栈跟踪使用

    使用一:可用于捕获报错时. using System.Diagnostics; ... StackTrace st = new StackTrace(true); string stackIndent ...

  8. addEventListener的第三个参数详解

    示例代码 element.addEventListener("mousedown", func, { passive: true });  element.addEventList ...

  9. SPOJ D-query 【主席树】

    一 题目 D-query 二 分析 主席树的运用. 这题首先应该考虑的是,如何分出种类数?再就是考虑如何维护区间信息? 最开始想的是直接离散化后用权值线段树建主席树,发现不行,因为假如$ [l,r] ...

  10. 十分钟学会Scratch图形化编程

    一.概要 Scratch是麻省理工学院开发的供儿童或者初学者学习编程的开发平台.其通过点击并拖拽的方式,完成编程,可以使儿童或者成人编程初学者学习编程基础概念等.Scratch是一款积木式图形编程软件 ...