OO Byebye
一.架构设计
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的更多相关文章
- GLUT的简洁OO封装
毕业设计用到了OpenGL,由于不会用MFC和Win32API做窗口程序:自然选用了GLUT.GLUT很好用,就是每次写一堆Init,注册callback,觉得有点恶心,于是对他做了简单的OO封装.记 ...
- Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结
Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结 1. Sql语言应该得到更大的范围的应用,1 1.1. 在小型系统项目中,很适合存储过程写业务逻辑2 1.2. 大型 ...
- OO中,先有对象还是先有类?
就是问,在面向对象思想里,先有对象还是先有类,乍一看和先有鸡蛋还是先有鸡是一类问题,其实不然!这个问题,在lz考研复试的时候被面试官问过,一模一样,如今又在一个笔试题里看到了类似的题目,眨一下,有人会 ...
- OO方式下,ALV TREE和ALV GRID的不同之处
作为大部分报表程序的基础,ALV GRID差不多是每个ABAP开发者必须了解和掌握的内容,因此网上也不乏相关资料,而ALV TREE的应用相对较少,中文资料也就比较少见了.实际上,ALV TREE和A ...
- 从人类社会的角度看OO(独家视角)
引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的"社会"关系,从而让我们抛弃书 ...
- 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 ...
- lua下的简单OO实现
笔者学习了当前(文末各文献)lua下的各种OO实现方法.略作笔记. 也提出了一些自己的想法.主要还是记录供将来着之参考. 1.概述 首先[2]PIL第二版中给出了OO的基于table的实现方式 ...
- OO的五大原则是指SRP、OCP、LSP、DIP、ISP。
OO的高层原则,面向对象设计的基本原则 设计模式之六大原则--开闭原则(OCP) 设计模式之六大原则--迪米特法则(LoD,LKP) 设计模式之六大原则--接口隔离原则(ISP) 设计模式之六大原则- ...
- OO.A.D.P
OO/A/D/P 对象和类 三大特征 对象: 对象是面向对象语言的一个极为重要的特点,所有的面向对象语言都有对象的共性. 1. 职责(单一) 2. 属性(数据.可改变的) 3. 函数(行为.方法.业务 ...
随机推荐
- ubuntu中安装和卸载apache2
1. 安装apache2 安装命令: sudo apt-get install apache2 启动/停止/重启apache2: service apache2 start/stop/restart ...
- 转载:Cubic interpolation
https://www.paulinternet.nl/?page=bicubic Cubic interpolation If the values of a function f(x) and i ...
- 数据库之一、数据库简介及SQL概要
1.数据库简介: 数据库(Database,DB)是一个长期存储在计算机内的.有组织的.有共享的.统一管理的数据集合.简单来讲就是可以放大量数据的地方.管理数据库的计算机系统称为数据库管理系统(Dat ...
- Linux就该这么学(第一天)
原文地址:https://www.linuxprobe.com/chapter-01.html 最近想着要发布原来做的一个javaweb小项目 域名 云服务器都买好了,然后很尴尬,不会在云服务器上搭建 ...
- 洛谷P1433 吃奶酪
#include<iostream> #include<math.h> using namespace std ; ; int n; bool st[N]; double x[ ...
- 牛客多校第二场H Second Large Rectangle 单调栈or悬线法
Second Large Rectangle 题意 给出n*m的01矩阵,问由1组成的第二大的矩阵的大小是多少? 分析 单调栈(or 悬线法)入门题 单调栈 预处理出每一个点的最大高度,然后单调栈每一 ...
- 事务:Transaction详解
1.事务概念: 一组sql语句操作单元,组内所有SQL语句完成一个业务,如果整组成功:意味着全部SQL都实现:如果其中任何一个失败,意味着整个操作都失败.失败,意味着整个过程都是没有意义的.应该是数据 ...
- python 让异常名称显示出来
一 try: pass except Exception as e: print(e) 二 import sys try: pass except: print(sys.exc_info()) 下面有 ...
- Vue中引入静态JS文件(爬坑)
前言(背景介绍) 开发的项目需要与Threejs的3D项目结合在一起,需要静态引入,jquery.js,stats.js,three.js,ThreeBSP.js等静态文件.开发环境是iview-ad ...
- webpack4.x基本配置
在学习vue的时候,需要进行打包操作,视频看的是webpack3的踩了好多坑,所以在记录一下,方便后续复习.有错误请指出. 新建项目文件 在项目文件下 执行npm init -y,进行初始化,生成pa ...