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>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...
随机推荐
- input support upload excel only
input support upload excel only demo https://codepen.io/xgqfrms/pen/vYONpLB <!-- <input placeh ...
- Flutter 设置input边框
example 1 import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp ext ...
- NGK Global莫斯科路演:关注内存暴涨和Defi新项目-Baccarat
此次路演由莫斯科演讲师Andrew首先致辞.首先安德鲁回顾了NGK近些年发展的整体情况,表示,NGK技术团队一直在认真的做事并将更加注重技术方案的改进,为行业提供更好的技术解决方案是NGK的愿景,NG ...
- flex图片垂直居中
html <view class="person_info_more"> <image class="more" src="/ima ...
- Golang 实现 Redis(9): 使用GeoHash 搜索附近的人
本文是使用 golang 实现 redis 系列的第九篇,主要介绍如何使用 GeoHash 实现搜索附近的人. 搜索附近的POI是一个非常常见的功能,它的技术难点在于地理位置是二维的(经纬度)而我们常 ...
- (嘎吧)--微软的 C# , IL,CLR, Cup 之间关系以及扩展联想
还是啰嗦下:文章短并不代表文章质量不高.我最喜欢用干货性的以及总结性的语言 让大家明白文章要表达的内容.这一切,都是来自多年对.NET 的一些领悟以及一些理解. 不长篇大论,一本人也没时间,二本人也不 ...
- Redis 内存淘汰机制详解
一般来说,缓存的容量是小于数据总量的,所以,当缓存数据越来越多,Redis 不可避免的会被写满,这时候就涉及到 Redis 的内存淘汰机制了.我们需要选定某种策略将"不重要"的数据 ...
- 看动画轻松学会 Raft 算法
由于 Paxos 算法过于晦涩难懂且难以实现,Diego Ongaro 提出了一种更易于理解和实现并能等价于 Paxos 算法的共识算法 - Raft 算法. 因为 Raft 算法清晰易懂越来越多的开 ...
- PAT-1150(Travelling Salesman Problem)旅行商问题简化+模拟图+简单回路判断
Travelling Salesman Problem PAT-1150 #include<iostream> #include<cstring> #include<st ...
- POJ-3281(最大流+EK算法)
Dining POJ-3281 这道题目其实也是网络流中求解最大流的一道模板题. 只要建模出来以后直接套用模板就行了.这里的建模还需要考虑题目的要求:一种食物只能给一只牛. 所以这里可以将牛拆成两个点 ...