BUAAOO-Second-Summary
#目录
- homework & class & trainning : 两次上机、三次作业、四周课堂
- code analysis & review : 为什么我没有bug,为什么大家的bug越来越少
- 多线程设计
- OO 设计感言
Scanning: Junit
一、作业、课堂、上机总结若干
1. 关于Debug
非常有趣在上一次的互测中,你由于被 hack 扣分 0 分。这其中包括了 0 个错误,还有 0 个尚未修复。同时,你 hack 他人成功 0 次,得分 0 分。
,这句话与我已经整整一个单元相伴了,因为我总是在无bug零伤亡组,而且我自己也测不出bug,这说明:
- 同学们的学习是有效的,对java的掌握相当熟练,有极强的自我设计思想在里面
- 强大的自动评测造福了若干同学
- 感谢老师和助教无微不至的帮助,预先排除了很多雷
- debug水平提高
2. 大佬分享课的收获
- 感谢王少布大佬,教导我们使用楼层类做优化,感谢他的分享,让我受益,理解了很多之前设计中
- 感谢张大佬,教导我们怎么做多线程任务分析太有趣了
感谢各位同学,我受益匪浅,在分享知识后,我们收获的更多:如何设计测试、如何做良好测试、如何运用设计模式、如何学习面向对象、如何挑战自己的高度。
二、code review & analysis
第一单元三次全无正确性问题,同样本单元三次作业以来,我的作业在强测、互测阶段没有发现任何正确性错误、在弱测环节因为正确性产生的commit也非常少。我来总结一下我三次作业的流程、思路、设计、代码实现。先是三张我的设计图。
第一次作业:
第二次作业
第三次作业
从三次的设计图来看,Unit 2对我的提升非常大,我的设计可以一直使用,而且长期对修改封闭,对扩展开放,我的SOLID原则一直在做,在坚持,在锻炼自己,可以看到我的设计越来越有整体层次感、对象和接口的封装、多态的函数返回模式、具有自我管理能力的类、Unit 2的设计最后充分体现了我的设计思想逐渐丰富。组合思维的应用让我的程序越来越有设计感,越来越具有可扩展性和良性。
甚至可以发现,我的类图框架基本就没有变过,如果不仔细看,三次作业就如同一次作业一样,迭代开发的实力已经可见一般。
为什么我没有bug
其实是由于我的开发流程在逐步细化,我现在的开放模式:
学习相关的模式、接口设计、画流程图 (确定如何发布订阅,确定如何对象的属性)
代码重构、模块绑定、尽量避免重构
重构部分清单
电梯设计文档和策略
设计逻辑和对象模式的逐一对应
写代码「仅40分钟」
做头脑风暴,考察多种测试数据和思路,并完成代码
检查是否存在硬绑定、消除硬绑定、为可行的优化做准备
扩展、将优化的部分和不优化的部分独立进行,随时可以换下优化。
写代码
测试类和测试代码运行
测试数据构造和覆盖性测试
小黄鸭测试
黑盒运行测试
覆盖式白盒测试
优化及优化测试
性能分析和性能测试
代码回顾和思考
个人测试完毕,和同学交流讨论设计相互学习
回顾自己的开发,总结不足,下次再改,不做压线任务。
做代码审查,检查中避免死锁
实验, 故意放慢某个进程做强化死锁测试
理想实验,做并行程序分析图
不写无意义的commit,不做合并式的commit
做无锁化,不需要锁的任务尽量避免锁
做去轮询,避免代码中的轮询,越少越好
可以看到,在三次作业中,我没有bug完全是因为通过学习、通过和优秀的各位同学在讨论区交流、不断提升自我、提高自己的代码鲁棒性、和建立具有纠错能力的开发模式。我没有bug不完全是运气、但也有不少运气成分、还有很多同学比我做得更好、向他们学习。在三次作业后,我逐渐看清了表达式问题的本质:即,用组合的思维去描述表达式树的形态、用装饰者的行为去描述求导和化简这些可以变化的方法。是设计提升了我的代码质量。可以发现,我的优化也是完全面向对象的松耦合实现!
此外,在讲讲我三次作业的进步
我的第一次作业.
class | OCavg | WMC |
---|---|---|
Elevator | 3.8 | 57.0 |
Main | 1.0 | 1.0 |
Myinput | 1.5 | 6.0 |
Person | 1.0 | 6.0 |
Sheduler | 2.5 | 5.0 |
Total | 75.0 | |
Average | 2.6785714285714284 | 15.0 |
我的第二次作业.
class | OCavg | WMC |
---|---|---|
Elevator | 3.4444444444444446 | 62.0 |
Main | 1.0 | 1.0 |
Myinput | 1.5 | 6.0 |
Person | 1.0 | 6.0 |
Sheduler | 2.5 | 5.0 |
Total | 80.0 | |
Average | 2.5806451612903225 | 16.0 |
我的第三次作业,在扩展之后,依然有较好的扩展性和松耦合
class | OCavg | WMC |
---|---|---|
Elevator | 4.071428571428571 | 57.0 |
HaltAll | 2.3333333333333335 | 7.0 |
Main | 1.0 | 1.0 |
Myinput | 1.5 | 6.0 |
Myoutput | 1.0 | 1.0 |
Person | 1.2 | 12.0 |
Scheduler | 11.0 | 22.0 |
Total | 106.0 | |
Average | 3.0285714285714285 | 15.142857142857142 |
有趣的是,为了优化方便,我的三次作业都选择了耦合度较高的电梯,这是由于电梯本身的职责较多造成的,后期我把这部分压力分到了人的上面,这里可以一览我最终版本的设计思路
三、黑盒测试和白盒测试
在黑盒测试部分,感谢:牛雅哲、张少昂两位助教的建议和鼓励、感谢林佬@login256,丁总,HugeGun,Nemo陈宇轩,MountVoom,对我的技术支持和指导。
在白盒测试部分,感谢:荣文戈老师的优质教学、还有偷学一节吴际老师课程的自己、感谢OO课程组老师的优质ppt、感谢何岱岚、叶开辉教导实现junit做测试。
- 黑盒测试:
我的测试环境是: ubuntu 18.04 (Intel Core i7 8Gen) ,java 10 , g++ 7.3.0 , Python 3.6.7,GNU bash 4.4.19,我的测试方法在不同平台和环境下有一定的调整、同学们可以自行调整、大部分内容是跨平台的。
我的测试构造技巧同样可以参考我已经写好的博文。
- 白盒测试:
大量的同学在debug环节是黑盒测试的,即比较其他同学输出和标准输出的正确性,而这样是劳心劳力、费时费资源的一种朴素测试思路,所以需要白盒测试,来弥补难以覆盖的测试环节和情形。我通过单元测试、全路径覆盖的形式保证了:
1. 保证模块中所有独立路径至少被执行一次
2. 对所有逻辑值都会测试TRUE和FALSE
3. 在上下边界及可操作范围内运行所有循环情况
4. 检查内部数据结构以确保其有效性
- 多线程强化测试
- 多线程的不可复现问题
- 将某一个进程故意放慢测试
- 做两个线程的遭遇测试,数据共享测试
- 写log,给trace多线程做准备。
四、OO设计感言
OO设计是充满惊险充满挑战的过程。面向对象的设计思想是从自然界中来的,因为在自然界中,类(Class)和实例(Instance)的概念是很自然的。Class是一种抽象概念,比如我们定义的Class——Student,是指学生这个概念,而实例(Instance)则是一个个具体的Student,比如,Bart Simpson和Lisa Simpson是两个具体的Student。Java学起来很有趣,通过学习Java可以提高自己的逻辑思维能力。在学习Java期间我们做了一些程序,我们班的同学也都积极准备,完成的还不错!因为Java是一种面向对象的编程语言,刚接触Java的人可能会感觉比较抽象 ,不过没关系不用着急,上课的时候认真听老师讲解,一些概念知识慢慢去理解,课后多做练习,认真完成课下作业,熟能生巧,哪怕是你的记性再好,课后不去强化练习也没用,只有多练了,当你在做项目时你才能很熟练的写出你想要代码。
五、Design Pattern & Multithreading
六、鸣谢
鸣谢OO课程组中对OO精心付出的每一位老师同学,希望后续的OO体验会更好。我想在OO思维和设计模式的大海里面徜徉。
BUAAOO-Second-Summary的更多相关文章
- BUAAOO——UNIT2 SUMMARY
本单元的题目为设计电梯,通过这单元的学习,我初步了解了关于java多线程编程及线程之间并发安全性设计等方面的内容.以下为对这三次作业的分析与总结. 作业分析 序号 楼层 电梯数量 可停靠楼层 调度策略 ...
- Summary of Critical and Exploitable iOS Vulnerabilities in 2016
Summary of Critical and Exploitable iOS Vulnerabilities in 2016 Author:Min (Spark) Zheng, Cererdlong ...
- 三个不常用的HTML元素:<details>、<summary>、<dialog>
前面的话 HTML5不仅新增了语义型区块级元素及表单类元素,也新增了一些其他的功能性元素,这些元素由于浏览器支持等各种原因,并没有被广泛使用 文档描述 <details>主要用于描述文档或 ...
- [LeetCode] Summary Ranges 总结区间
Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...
- Network Basic Commands Summary
Network Basic Commands Summary set or modify hostname a) temporary ways hostname NEW_HOSTNAME, b ...
- Summary - SNMP Tutorial
30.13 Summary Network management protocols allow a manager to monitor and control routers and hosts. ...
- Mac Brew Install Nginx Summary
==> Downloading https://homebrew.bintray.com/bottles/nginx-1.10.1.el_capitan.bot################# ...
- Leetcode: LFU Cache && Summary of various Sets: HashSet, TreeSet, LinkedHashSet
Design and implement a data structure for Least Frequently Used (LFU) cache. It should support the f ...
- How to add taxonomy element to a summary view?
[re: Orchard CMS] This caused me scratching my head for days and now I can even feel it's bleeding. ...
- (转) Summary of NIPS 2016
转自:http://blog.evjang.com/2017/01/nips2016.html Eric Jang Technology, A.I., Careers ...
随机推荐
- IDE中使用System.getProperty()获取一些属性
使用环境:一般在项目首页或者项目后端配置中会使用到一些属性获取: package com.liuyc.study.utils; /** * 获取当前操作系统中或者当前环境中的一些默认配置 * @aut ...
- sedlauncher.exe
这个进程很恐怖,屁大点的东西,但会造成磁盘爆满. 首先,这个99%不是病毒,而是win10更新后出现的东西. 关于解释,国内乱七八糟的,我没有搜到,只好在狗哥和微软官网搜了一下. 大多说是 KB402 ...
- 异步 async & await
1 什么是异步 异步的另外一种含义是计算机多线程的异步处理.与同步处理相对,异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程. 2 异步场景 l 不 ...
- Gem install rmagick 报错问题~
本人在CentOS7上在 执行”gem install rmagick“是报错,具体情况如下: 报错如下: [root@localhost ~]# gem install rmagick -v '2. ...
- keytool 错误: java.lang.Exception: 密钥库文件不存在: keystore
通过Android Studio编译器获取SHA1 第一步.打开Android Studio的Terminal工具 第二步.输入命令:keytool -v -list -keystore keysto ...
- linux使用vim打开乱码问题
在windows中编辑好的汉字文本文档,上传到Linux下打开乱码. [root@localhost ~]# rpm -ivh /mnt/Packages/lrzsz-0.12.20-36.el7.x ...
- 并查集 P3367 【模板】并查集
P3367 [模板]并查集 #include<iostream> #include<algorithm> #include<cstdio> #include< ...
- js encode方法
js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 1 ...
- java集合类学习笔记1
一.集合的接口 java集合类库也将接口与实现相分离.首先看一下大家都熟悉的数据结构-队列是如何分离的.队列接口指出可以在队列的尾部添加元素,在队列的头部删除元素,并且可以查找队列中元素的个数.当需要 ...
- Swagger结合mustache模板生成后台接口代码、以及前后台建模代码
之前项目中使用的的thrift来建模,维护前后台模型以及rest接口,前台使用的是angular2: 但是使用thrift只能生成建模,后台的rest接口的Controller文件还是需要手动去写,一 ...