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中一般只会创建刚开 ...
随机推荐
- OpenFOAM——圆腔顶盖旋转驱流
本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL008: Flow Inside a Rotating Cavity 腔体顶盖以1 ...
- MySQL 自动插入、更新时间戳
在 MySql 中,要做到自动出入当前时间戳,只要在定义表格时将字段的默认值设置为 CURRENT_TIMESTAMP 即可. 如: create table if not exists my_tab ...
- Multi-Agent Reinforcement Learning Based Frame Sampling for Effective Untrimmed Video Recognition
Multi-Agent Reinforcement Learning Based Frame Sampling for Effective Untrimmed Video Recognition IC ...
- 安装Rancher容器化管理平台
卸载已有的避免冲突 yum remove docker docker-common docker-selinux docker-engine 安装需要的软件包,yum-util 提供yum-co ...
- python带参数的类装饰器
# -*- coding: utf-8 -*- # author:baoshan # 带参数的类装饰器(和不带参数的类装饰器有很大的不同) # 类装饰器的实现,必须实现__call__和__init_ ...
- SQLite添加新的字段
通过alter添加新的字段SQL语句 "ALTER TABLE 'DiHKChatMessage' ADD 'phoneNum' varchar"; 但是如果这个字段已经存在的话, ...
- Spring cloud微服务安全实战-7-5配置grafana图表及报警
先过一下grafana的配置文件 grafana的配置文件. 右键服务的地址.发信人 账号 和面等 配置要连到prometheus上. 登陆的密码是多少,第二行是不允许用户注册. dashboard. ...
- bat curl 定时请求
@echo off :loop call:sleep 30 ::调用方法call:sleep [毫秒] (1秒=1000毫秒) curl https://stage.coolfen.com/suppl ...
- [LeetCode] 218. The Skyline Problem 天际线问题
A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...
- LeetCode:缺失的第一个正数【41】
LeetCode:缺失的第一个正数[41] 题目描述 给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3示例 2: 输入: [3,4,-1,1] ...