UML回顾暨课程总结
本文作为OO的最后一次博客作业,主要回顾了第四单元的架构设计和本学期的心路历程。
本单元架构设计
UML1
第一次作业的主要内容是解析mdj格式输入,记录特定数据并支持针对类、属性和方法等的查询功能。
我按照层级关系为类、属性和方法等对象设置了类,在UMLInteraction中解析输入的UML element元素,首先解析类和接口,以id为key,MyClass/MyInterface对象为value将它们组织在HashMap中,再依次解析其他元素将它们存入已有的MyClass/MyInterface实例中。对于关联关系,在MyClass中设置了一个assoList用来存储关联的对端的id。对于继承关系,在MyClass中有一个MyClass的引用指向该MyClass的父类;在MyInterface中有一个HashMap记录接口继承的全部接口。
这样组织数据结构使得大部分方法的实现可以通过递归来实现:先在类中查询,当父亲不为null时递归调用父类的查询方法。
此外,为了处理同名类、同名属性的异常,我在MyClass和MyAttribute等类中都使用了HashMap记录各名称出现的次数,并在查询时进行核对。
值得一提的是,在类/接口中设置指向父亲的引用,是后来受人点拨才有的改进。一开始我想把类设置成类与类之间互不透明的,全部跨类的操作都需要在UMLInteraction中进行。其实里的“低耦合,安全性”并无太大必要:父类的大部分数据,子类是可以进行访问的。此外,这样还增加了类的存储空间占用:一个类必须存储自身的和继承来的全部属性和关联,存在同一数据被存储多次的情况。
UML2
第二次作业增加了对状态图、顺序图和检查规则的处理。
对于状态图的处理,我采用了类似组织MyClass的方式:解析stateMachine—解析Region—解析state—解析transition。状态数、转移数可通过对stateMachine中的相关类进行计数来实现,后继状态数则需要使用广度优先算法,判断从当前状态出发能到达的状态数。
对于顺序图的处理类似:建立MyInteraction的列表-解析LifeLine-解析Message之后再进行查询。
三个检查规则是本次作业中较难的部分。对于规则001,只需统计属性和关联对端中所有名称出现的次数即可,当存在名称出现次数大于1时,需要抛出异常,传递所有重复出现的名称。对于规则002,需要考虑类继承和接口继承中成环的情况。我使用了深度优先算法得到类和接口的继承链,当下一个节点已经在链中存在时,停止搜索并返回继承环。对于规则003则采用深度优先算法得到所有继承的对象及其出现的次数,当某个类/接口继承的对象中有对象出现次数超过两次时,返回该类/接口。
为了使层次结构更清晰,我对上次实现的数据结构和方法(与本次功能独立)进行了封装。
架构设计和OO方法理解的演进
1)架构设计
架构设计方面的演进主要体现在类数量的增多、类复杂度的降低以及更多地采用设计模式。
第一单元结束后,我学会了按层级组织类,将复杂的功能分解为类与类之间的协作。第二单元则让我尝到了设计模式的甜头,working-thread模式让我不必为线程安全问题而烦恼。第三单元图的处理,由于新增功能与原有功能独立,我开始更多地进行封装,并做了继承的尝试。面对第四单元大量的数据类型,我开始更加有条理的组织类和类之间的协作关系。
2)方法理解
OO的三大原则说起来很简单:继承、封装和多态,但是真正理解这几个字眼,是要靠动手实践的。
我对OO方法的理解,一开始是“封装相似功能的数据结构”,于是乎前几次作业我写的程序类内部复杂度都很高,类间关系主要是调用关系,相当于还是从前C语言的思路,只是把同一类的函数封装出去成为类了。我还大量使用了static方法以方便我的“函数调用”。
到了第一单元的最后一次作业,由于过程非常复杂,我决定用递归处理函数求导问题,所以很现实的问题就是我必须按层级组织不同的对象:表达式、项、因子。在这样组织的过程中,我领会到了“将复杂步骤分解为数个较为简单的对象之间的协作关系”这样的思想。
第二单元的电梯则让我对OO的理解更进一步,由于担心自己乱写会产生线程安全问题,我谨小慎微地采用了课程组推荐的设计模式,输入处理—调度器—电梯的架构成为了我写作业的指导思想。在实现这一架构的过程中,我意识到OO的设计思想,是先分离出设计要求中的逻辑对象,再按对象之间的协作关系组织程序,而不一定是先把复杂的步骤分解成对象之间的作用关系。
第三单元、第四单元,程序的数据类型和功能都很多,这使得我写作业的出发点不再是“程序要怎么做完这件事”,而是“需要哪些对象?实现功能需要哪些对象之间协作?”我开始认识到需要按程序逻辑组织对象,并先规定接口,随后实现。
测试理解和实践的演进
阶段一:手造数据
此阶段包括第一、二单元手造数据测试自己和其他人的代码,也包括第一单元仔细阅读其他人的正则表达式然后精心构造反例。
手造数据的问题是效率太低,且不能有效暴露自己代码的问题。
阶段二:黑盒测试
此阶段主要是靠数据生成器和对拍,利用随机数据暴露出程序问题。优点是生成数据更全面、高效,缺点是可能无法暴露代码的所有问题,且无法预料非法输入是否被正确处理。
我在第二、三单元基本上处在阶段二。
阶段三:UML检验
此阶段可采用OpenJML直接从形式上验证程序正确性,比测试更能暴露问题。缺点是对JML的书写有一定要求,且OpenJML语法略微不方便。
阶段四、单元测试
使用过一次,相比黑盒测试针对性更强,组织条理清晰。在分支全覆盖的情况下能保证代码正确。
课程收获
- 代码风格优化
- 架构设计更清晰、层级分明
- 开始以面向对象的思想设计程序
- 程序工具的自学能力
- 多线程编程与调试
- 了解和参与规格化设计
git使用技巧- 自动化测试工具、单元测试
课程建议
1)
有时强测炸了但是一次合并修复就修好了(当然可能是因为犯了比较基本的错误),建议进一步改进强测评分标准,或者增大强测数据集随机性。
2)
研讨课实际体验不佳,分享同学讲的快/笼统,学不到什么东西;台下反馈少,让人感觉如果拿不出干货就会被鄙视;如果本单元表现不是非常出色,完全不敢报名。
综合体验:“热闹是他们的,我什么都没有”。
希望能改变研讨课的现有模式。
3)
建议提升授课内容,制作更精良的PPT。现在的课件有点像概念的堆砌(缺少注释),实际可读性一般,感觉和作业的关系也不大。此外,在第三单元第四单元(尤其是第四单元),理论课内容和作业内容有一点点分离。
UML回顾暨课程总结的更多相关文章
- oo第四单元作业总结暨课程总结
oo第四单元作业总结暨课程总结 一.本单元作业架构设计 本单元需要构建一个UML解析器,通过对输入的UML类图/顺序图/状态图的相关信息进行解析以供查询,其中课程组已提供输入整体架构及输入解析部分,仅 ...
- oo第四单元暨课程总结
第四单元架构设计总结 第一次作业 单独写了MyUmlClass.MyUmlInterface.MyUmlOperation三个类对应UML中相应元素,在UML图中这几个元素包含一些下级元素,如Clas ...
- OO_Unit4_Summary暨课程总结
初始oo,有被往届传言给吓到:oo进行中,也的确有时会被作业困扰(debug到差点放弃):而oo即将结束的此刻,却又格外感慨这段oo历程. 一.单元架构设计 本单元任务是设计一个UML解析器,能够支持 ...
- BUAAOO第四单元总结与学期回顾
第四单元架构设计 第四单元要完成的是对给定UML元素的建模/统计/分析,考虑到UML元素的组织是树状的,很容易想到基于树状的数据结构完成 由于UML元素已经由官方接口给出,因此结点类采用wrapper ...
- Java和计算机科学课程的关系
翻译人员: 铁锚 翻译时间: 2013年11月20日 原文链接: Java and Computer Science Courses 一个好程序员不仅要知道如何编程来完成特定任务,还要了解为什么要这样 ...
- webpack4入门到进阶案例实战课程
愿景:"让编程不在难学,让技术与生活更加有趣" 更多教程请访问xdclass.net 第一章 webpack4前言 第一集 webpack4入门到进阶案例实战课程介绍 简介:讲述w ...
- BUAA_OO_2020_Unit4_总结博客
BUAA_OO_2020_Unit4_总结 2020年春季学期第十六周,OO第四单元即最终章落下帷幕,本单元是利用Java进行UML类图的解析,完成对类图.顺序图.状态图的内部查询操作与简单的规则判断 ...
- [对对子队]事后总结Beta
设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 要做一个游戏,定义的很清楚,实现出来的效果贴近定义,对用户和场景有清晰描述 我们达到目标了么(原计划的功 ...
- 李洪强iOS经典面试题129
1. 怎么解决缓存池满的问题(cell) ios中不存在缓存池满的情况,因为通常我们ios中开发,对象都是在需要的时候才会创建,有种常用的说话叫做懒加载,还有在UITableView中一般只会创建刚开 ...
随机推荐
- D3.js的v5版本入门教程(第七章)—— 比例尺的使用
D3.js的v5版本入门教程(第七章) 比例尺在D3.js中是一个很重要的东西,我们可以这样理解d3.js中的比例尺——一种映射关系,从domain映射到range域(为什么会是domain和rang ...
- (转载)golang 整数常量INT_MAX INT_MIN最大值最小值
转载地址:https://blog.csdn.net/bdss58/article/details/78388858 在C语言中,有标准库limits.h定义了一些最大最小值常量,例如int类型的最大 ...
- bat批处理 取得当前路径 %CD%
在DOS的批处理中,有时候需要知道当前的路径.在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量的用法和代表的内容一般是不同的. 1. %cd% 可以用在批 ...
- Ingress-nginx 部署使用
Ingress-nginx 部署使用 一.Ingress 简介 在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的.为了使外部的应用能够访问集群内 ...
- 【E2EL5】A Year in Computer Vision中关于图像增强系列部分
http://www.themtank.org/a-year-in-computer-vision 部分中文翻译汇总:https://blog.csdn.net/chengyq116/article/ ...
- PHP 发送 POST 值到任意 url
以下方法可以实现将 POST 值发送到 url,并获取返回值 $url = 'http://www.someurl.com'; $myvars = 'myvar1=' . $myvar1 . '&am ...
- 《你必须知道的javascript(上)》- 2.this与对象原型
1 关于this 1.1 为什么使用this 随着你的使用模式越来越复杂,显式传递上下文对象会让代码变得越来越混乱,使用this则不会这样.当我们介绍对象和原型时,你就会明白函数可以自动引用合适的上下 ...
- 图像基础知识之YUV
一.YUV常用格式 YUV是编译true-color颜色空间(color space)的种类,Y'UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠.“Y”表示明亮度(L ...
- LD SCore计算基因多效性、遗传度、遗传相关性(the LD Score regression intercept, heritability and genetic correlation)
这篇文章是对之前啊啊救救我,为何我的QQ图那么飘(全基因组关联分析)这篇文章的一个补坑. LD SCore除了查看显著SNP位点对表型是否为基因多效性外,还额外补充了怎么计算表型的遗传度和遗传相关性. ...
- [LeetCode] 384. Shuffle an Array 数组洗牌
Shuffle a set of numbers without duplicates. Example: // Init an array with set 1, 2, and 3. int[] n ...