UML系列作业设计架构

第13次作业

本单元的第一次作业中,涉及到了类图的解析。在着手做这单元作业的时候,需要将每一种 UmlElement 再封装,并在解析时,用 helper 单例来进行查询处理(可以附带记忆化查询)。

这里可以再细致地说明一下,实际上,在本次作业中,我只再封装以下几类:

UmlClass
UmlInterface
UmlOperation

对于其他的元素,仅提取必要信息 id 并将其加入到相应再封装类的数据结构中,供后续统计使用。

另一方面,由于 Class 和 Interface 的行为很接近,于是我将 Interface设置为Class的继承类。由于Class为单继承,因此需要在子类中改变相应逻辑, 将 Interface的 继承类型改变为“多继承”。

//接口继承“类”,因为 接口对于op和attr的逻辑与 class 几乎相同
public class ExtInter extends ExtEle {
private ArrayList<String> interFathers;
...
}

第14次作业

第二次作业中新增了状态图顺序图的查询,因此,将helper拆分为三个,并将对应的查询指令分配给对应的 helper 。

需要注意的是,对于三个查询规则,他们属于 类图helper 的负责范畴,应交给类图helper处理。

循环继承后继State的逻辑:

判断时,从一个状态(类、接口)出发,查找他们的后继(father),并将所有当次已遍历过的结点序列作为参数传入。如果当前结点已经在序列中,说明已经出现“回环”,此时搜索结束,返回。这保证了不会产生死循环。

检查重复继承(类) //接口检查时逻辑类似
public boolean rotate(String id, ArrayList<String> idList) {
if (getId().equals(id)) {
return true;
} else if (idList != null && idList.contains(getId())) {
return false;
}
ArrayList<String> tmp = new ArrayList<>();
if (idList != null) {
tmp.addAll(idList);
}
tmp.add(getId());
if (fatherFlag) {
return father.rotate(id, tmp);
}
return false;
}

类图:

单元架构设计

表达式求导

第一单元的表达式,第一次接触Java 和面向对象的模式。将factor/term 封装成类,重载相应的求导函数,最终实现了程序。

在这个过程中:

  • 很好地区分开了抽象元素的封装成类
  • 有一定的可扩展性
  • 第三次作业由于元素过多,重构时“缝缝补补”,在优化处理上“做崩了”
  • 对于面向对象模式的使用还没有

多线程电梯

本系列作业中尽可能地降低各个线程所在类之间的耦合(事实上这么做也更方便编程,减少了线程间共享对象),对于泛型和接口的使用(虽然接口最后没用上),简化了不同类型共享队列重复编码。每次增量开发也更加顺手,总的来看,相比第一单元有了很大进步。

本系列作业中重视设计模式和可扩展性,因此没有重构的情况发生,都是“增量式开发”。用了单例模式、生产者消费者、两阶段终止模式,进一步加强了接口和集成的训练。

地图系统

第三单元系列作业开始,从“数据”和“处理”两个方向出发,分别按照 “设计数据结构” 和 “查询实现类helper” 互相促进设计。写代码时先实现查询接口,后根据查询的数据需求实现解析输入。

类似于电梯实现,将路径查询算法独立封装,并实现了算法的复用。

注意到时间复杂度的要求,经历了从 静态数组-> 优雅的“hashmap"-> 结点再映射的静态数组 的架构变化,避免了复杂度超时。

UML解析系统

第四单元则是对第三单元的“经验”的充分使用:将所有的查询分配给对应的helper,将所有的数据封装成合适的数据结构方便helper调用。(很好很清晰)

从这一点看,第四单元的作业其实和第三单元很类似。

测试风格演进

  • 第一单元开始就使用了Junit实现增量开发时的自动化测试。并对After和BeforeALL等用法有了一定的了解。
  • 第二单元,由于模拟了实时输入,因此使用了讨论区提供的魔改包,编写数据生成器,生成随机数据模拟输入。
  • 第三单元,回归使用Junit,实现白盒测试和黑盒测试。对于新增的需求添加Junit测试内容,对于程序整体,编写随机数据生成器,将数据提供给输入并记录输出。
  • 第四单元,“自动测试”不是很方便,回归传统,自己编写特殊mdj文件并添加查询内容,通过黑盒测试检查。

针对压力测试,由于第一单元作业中强测的BUG, 从第二单元起,对每一次作业的测试都用Jprofiler监测CPU时间,在后面很好地避免了相应的问题。

本课程收获

作为一头大三的咸鱼,本学期的OO课,更多的是对自己进入大学来学得的计算机知识的“应用”。面对每个单元不同的作业,在学习新的面向对象思想的同时,实际上相应地复习了学过的知识。

  • 学习了一些测试的方法,黑盒白盒测试,对于以前学过的web开发(rails),理解了其设计的理念。

  • 学习了一些面向对象模式,将其与C++结合起来。

  • 对多线程有了更深的理解,回顾了OS课程。

  • 将一些算法运用到“实际”中,学着去写算法的变式。

  • 将一些思考到的东西应用到自己做OS助教的实际中

课程建议

  • 实现最后一次作业时,感觉指导书说明不是很详细,对于细则说明缺失很多,给人一种强烈的"出题人摸了"的感觉。相应的,对于测试样例的设计方向,应当在理论课上提供得更明确一些。

  • 理论课的课上重点有时不是很明确,听完一节课有时不知道重点所在,与作业联系不是很紧(前两单元)

  • 上机难度变化略大,前几次上机难度过大。


都结束了!

压力马斯内!

2019.6.19

16231213

By:DorMouse

final,buaa_oo conclusion的更多相关文章

  1. [转][C++ 11]override and final - write clean and maintainable C++ code

    原文: http://arne-mertz.de/2015/12/modern-c-features-override-and-final/ Today I write about a pair of ...

  2. 如何写出优秀的研究论文 Chapter 1. How to Write an A+ Research Paper

    This Chapter outlines the logical steps to writing a good research paper. To achieve supreme excelle ...

  3. AKA “Project” Milestone

    Homework 6 (60 points)Due Thursday, April 25th at 11:59pm (via blackboard) AKA “Project” Milestone # ...

  4. 时间序列预测——深度好文,ARIMA是最难用的(数据预处理过程不适合工业应用),线性回归模型简单适用,预测趋势很不错,xgboost的话,不太适合趋势预测,如果数据平稳也可以使用。

    补充:https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-15-276 如果用arima的话,还不如使用随机森 ...

  5. 加州大学伯克利分校Stat2.3x Inference 统计推断学习笔记: FINAL

    Stat2.3x Inference(统计推断)课程由加州大学伯克利分校(University of California, Berkeley)于2014年在edX平台讲授. PDF笔记下载(Acad ...

  6. Keywords|Result|Final check

    科研论文写作 风格最好是excited,不要过于谦虚. Reference不要过多引用自己的paper,可以多引用本刊物的paper. Acknowledgement:感谢帮助input的人员,可以n ...

  7. java抽象、接口 和final

    抽象 一.抽象类:不知道是具体什么东西的类. abstract class 类名 1.抽象类不能直接new出来. 2.抽象类可以没有抽象方法. public abstract class USB { ...

  8. Java内部类final语义实现

    本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...

  9. Java关键字final、static

    一.final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final ...

随机推荐

  1. asp.net core分块上传文件

    写完asp.net多文件上传(http://www.cnblogs.com/bestckk/p/5987383.html)后,感觉这种上传还是有很多缺陷,于是...(省略一万字,不废话).这里我没用传 ...

  2. centos下svn的ldap认证配置

    前提:完成svn的基本安装 一.安装sasl相关组件 #yum install -y cyrus-sasl cyrus-sasl-lib cyrus-sasl-plain 二.查看SASL版本和提供的 ...

  3. linux 打开FTP 功能

    http://blog.csdn.net/jay285979220/article/details/62216622 今天在linux上安装完了vsftpd后,使用root账号一直无法登陆到服务器上. ...

  4. Spark Mllib里如何将trainDara训练数据的分类特征字段转换为数值字段(图文详解)

    不多说,直接上干货! 字段3 是分类特征字段,但是呢,在分类算法里不能直接用.所以,必须要转换为数值字段才能够被分类算法使用. 具体,见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的 ...

  5. 编写可执行程序,其它程序调用,并返回数据,C#

    有时候在创建临时文件或文件夹,使用完成后,释放失败,删除提示占用,又不能结束主程序,就可以通过别的方法来解决 比如,另外创建一个程序,单独执行任务,完成后结束程序,并返回执行结果,上述问题就能解决. ...

  6. Hibernate框架关系映射一对多双向关联

    直入主题,首先大配置常规配置, 这里住要说关联关系,大配置不多少,而且jar包默认添加好,笔者用的是idea2016. 然后我们知道关联关系主要是在小配置添加节点来配置属性.个人认为关联映射,就是对应 ...

  7. 国内的Jquery CDN免费服务

    Jquery是个非常流行的JS前端框架,在很多网站都能看到它的身影.很多网站都喜欢采用一些Jquery CDN加速服务,这样网站加载jquery会更快.之前火端网络的一些网站都是使用Google的jq ...

  8. Python3实现自动备份

    需求 将重要文件备份到指定目录,存档文件名称为“当前日期.zip”. 前提 1) Windows系统 2) Python 3以上版本 旗舰版 #!usr/bin/python # -*- coding ...

  9. sql中的exsits和not exsits

    select * from table where exsits(sql语句) :  括号中sql语句有数据则返回这些相关id的数据集 select * from table where not ex ...

  10. (五)VMware Harbor 部署之SSL

    转自:https://www.cnblogs.com/Rcsec/p/8479728.html 1 .签名证书与自签名证书 签名证书:由权威颁发机构颁发给服务器或者个人用于证明自己身份的东西. 自签名 ...