一.架构设计

1.第一次作业

  首先做的就是把所有的Element全部存起来,我把UmlClass和UmlInterface重新用两个新的类来记录了一下,用于更快地找到他们的关联。其实总体思路还是比较简单的,但是在某些不经意的地方还是会有一些小bug。另外,这一单元的数据纷繁复杂,可能会有很多想不到的情况,比如之前就根本没考虑过自关联,又是这样那样的各种花里胡哨的诡异数据。提交第一遍的时候着实吃了不少亏。

2.第二次作业

  到了第二次作业,经过了第一次的基础,自己想的东西也多了起来,首先是建立一个新的类,继承了第一次作业的Last,为了简化代码量,将Last类变成抽象类,

  一次继承之后,加入了状态图的所有操作,期间也考虑了重名、自环、多环、终止起始等状态的各种可能出现的问题。

  接下来是顺序图,和之前的继承相同的操作,顺序图其实也很好统计,就是单纯的数数而已。

  同样的,为了减少代码量,变成抽象类,在检查002,008,009时使用可实例化的class

  在check002时,一种较为简单的方法是,遍历寻找每个Association的end和另一个end所对应的class中的attribute,查看是否重名。

  在check008时,我是使用删除入度或出度为零的点,这样一次次重复删除下去,剩下的就一定是个环了。

  而check009基本上和008相同,只需要再附加查找一次看看父类(或接口)是否在环上即可。而另一种更加方便编程的方式就是无脑DFS,对每个节点都遍历一遍,当父节点又出现一次时显然就GG了。

  总之这两次作业并不是很难,但最大的问题是,需求模糊不清难以把握。很多要求都是在代码写完了之后突然说有更改,或者本以为不需要考虑这方面的内容,突然又加上了限制条件。可能这就是当代程序员的现状吧。↓

二、总结四个单元的设计架构

  个人感觉除了第一单元把代码重构了之外,后续的几个单元设计架构还是比较容易扩展的。

  电梯单元整体上第一次和第二次就是改了个楼层,第三次也只是稍微加了一些调度。

  JML和UML其实架构设计体现的更加明显,毕竟方法都已经给好了,要说重构的话也只能是说修改了数据存储的类型,从链表到映射二维数组,大的框架结构并没有发生变化。个人感觉这可以算是OO课下来最大的收获之一了。毕竟没人愿意每一次作业都重构。

三、测试方法的演进

  第一二单元时,我是采用最简单但最出力不讨好的测试方法,手动构造数据测试,而到了第三四单元,我开始构建自己的数据生成器,进行大规模的测试,同时偶尔利用Junit进行测试。后期除了完整的数据生成器,还编写了输出的比较器,能很好地找到输出的不同以及相关的输入,更精准的定位到bug。

四、课程收获

1.第一个收获肯定就是Java相关知识了。

  之前从来没有使用过正则表达式,OO第一单元就让我掌握了正则表达式的使用;第二单元让我接触了神奇的多线程;第三单元JML的相关知识、Junit自动化测试;第四单元UML的使用……

2.更快的写巨多代码。

  从第一次作业到第十四次作业,每周一次的作业让我有了更多编程经验,也有了完成大规模编程的体验。

3.不断优化的思想。

  之前的c语言课程、数据结构课程我根本没考虑过CPU时间或者是实际运行时间的优化,我在意的是怎么把我的代码写得更简短。而经过了OO的练习,我才发现,不同的程序对性能的评价是不同的,比如电梯,要是想要精简代码,其实只需要很少的代码量就能完成,但是电梯强调的是响应时间(作业中是最后送达时间)。因此,对于不同的要求,还是要用不同的思路和算法去实现,不能单纯的图程序员的简单。

4.耐心。

  之前网上流传着这么一句话:一杯茶、一袋烟、一个bug改一天。简直深有体会,关于各种稀奇古怪的数据,不为人知的weak5和middle5总是能够卡住一群人,这时候就需要耐心去完成了。经过这么多次作业,我觉得在这方面我还是有很多提升的。

5.居安思危。

  尽管过了中测,但可能还是会有bug;尽管CPU时间没炸,但强测很可能还是会TLE,总之,这么多次OO下来,我已经开始了解到程序安全性的重要。某些你想不到的输入可能就真的会出现在你的程序输入中。因此要不断的找自己的bug,居安思危。

五、几个建议

1.每次做作业都会觉得指导书不够明确,在某些地方会有很多情况需要考虑,但指导书根本不够详细,或者甚至在讨论区、在水群里对作业进行解释,令人头秃。

2.上午刚讲完某些知识,下午实验课就要考,还要现下载相关的软件,非常不友好。尽管有的时候可能助教是在水群里通知过了,但转眼间99+的消息,根本就不能保证每个人都通知的到。

OO Byebye的更多相关文章

  1. GLUT的简洁OO封装

    毕业设计用到了OpenGL,由于不会用MFC和Win32API做窗口程序:自然选用了GLUT.GLUT很好用,就是每次写一堆Init,注册callback,觉得有点恶心,于是对他做了简单的OO封装.记 ...

  2. Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结

    Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结 1. Sql语言应该得到更大的范围的应用,1 1.1. 在小型系统项目中,很适合存储过程写业务逻辑2 1.2. 大型 ...

  3. OO中,先有对象还是先有类?

    就是问,在面向对象思想里,先有对象还是先有类,乍一看和先有鸡蛋还是先有鸡是一类问题,其实不然!这个问题,在lz考研复试的时候被面试官问过,一模一样,如今又在一个笔试题里看到了类似的题目,眨一下,有人会 ...

  4. OO方式下,ALV TREE和ALV GRID的不同之处

    作为大部分报表程序的基础,ALV GRID差不多是每个ABAP开发者必须了解和掌握的内容,因此网上也不乏相关资料,而ALV TREE的应用相对较少,中文资料也就比较少见了.实际上,ALV TREE和A ...

  5. 从人类社会的角度看OO(独家视角)

    引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的"社会"关系,从而让我们抛弃书 ...

  6. HDU5288 OO’s Sequence

    Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number o ...

  7. lua下的简单OO实现

    笔者学习了当前(文末各文献)lua下的各种OO实现方法.略作笔记. 也提出了一些自己的想法.主要还是记录供将来着之参考.   1.概述   首先[2]PIL第二版中给出了OO的基于table的实现方式 ...

  8. OO的五大原则是指SRP、OCP、LSP、DIP、ISP。

    OO的高层原则,面向对象设计的基本原则 设计模式之六大原则--开闭原则(OCP) 设计模式之六大原则--迪米特法则(LoD,LKP) 设计模式之六大原则--接口隔离原则(ISP) 设计模式之六大原则- ...

  9. OO.A.D.P

    OO/A/D/P 对象和类 三大特征 对象: 对象是面向对象语言的一个极为重要的特点,所有的面向对象语言都有对象的共性. 1. 职责(单一) 2. 属性(数据.可改变的) 3. 函数(行为.方法.业务 ...

随机推荐

  1. java.awt.Font

    显示效果 Font mf = new Font(String 字体,int 风格,int 字号);字体:TimesRoman, Courier, Arial等风格:三个常量 lFont.PLAIN, ...

  2. [CF]Round511

    这场比赛我及时的参加了,但是打的时候状态实在是太烂了,只做出来了Div2的AB题. A Little C loves 3 I 直接构造就行. B Cover Points 应该很容易就看出来这个等腰三 ...

  3. Python之旅第四天(列表、元祖、字典和习题)

    第四天,感觉时间还是过得很快,今天内容确实有点多,关于list的方法实在是太多了,元组tuple感觉有点鸡肋,可能得到后面才知道他的作用吧,然后是字典,看了很多关于字典的介绍,但是这货到底是干啥用的一 ...

  4. HTML备忘

    a标签事件 a:link {color: #000000} /* 未访问的链接 */ a:visited {color: #d90a81} /* 已访问的链接 */ a:hover {color: # ...

  5. 在EF中使用原生SQL,首先要创建上下文对象

    using (var db = new Entities()) { //数据操作 } 新增 string sql = "insert into UserInfo values('zhangs ...

  6. Java-POJ1014-Dividing

    多重背包问题的特点是物品数量可以大于1但是有限制.状态定义与01背包一致. 多重背包的解法有多种,复杂度也各不相同. 对于物品数Ci较大的数据,可以采取二进制数进行优化(就是这样,别问就是baidu! ...

  7. MySQL中int(11)的意思

    参考文献:https://segmentfault.com/a/1190000012479448 int(11)中的11代表的是字符的显示宽度,在字段类型为int时,无论你显示宽度设置为多少,int类 ...

  8. AcWing 4. 多重背包问题

    朴素 数据范围小 //数据范围小 #include<iostream> #include<algorithm> using namespace std ; ; int n,m; ...

  9. zabbix4.2配置邮件+脚本报警:以QQ邮箱为例

    一.邮箱配置:开启smtp服务和授权 开启smtp选项后,系统会生成一个授权,你需要记住这个授权码,后面需要写入配置文件. 二.配置管理mailx: (1)安装mailx:[root@zabbix-s ...

  10. HTML5学习(5)实体字符

    HTML   Entity 实体字符通常用于在页面中显示一些特殊符号. 书写方式: 1. &单词; 2. &#数字; 常用实体字符: <  < litter than &g ...