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 ...
随机推荐
- vscode小程序代码高亮
vscode无法识别wxml,wxss语法: wxml文件设置: (1)任意打开一wxml文件,点击下方语言模式选择,这里已关联wxm所以当前显示wxml.默认关联为纯文本或者html或其他语法,点击 ...
- node获取当前路径的三种方法
node提供了3种获取路径的方法 ,在当前目录下,运行node const {resolve} = require('path') console.log('__dirname : ' + __di ...
- Linux下/proc目录的作用
文章是摘抄过来,方便自己查阅! 1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在 ...
- 记字符串转bigDecimal的一个坑
项目中一个地方用到了bigdecimal,之前是字符串转Double,处理之后再转成String,看着麻烦,给改成用bigdecimal计算字符串,但是偶尔会出现如下异常. 很是诧异,加了非空校验,怎 ...
- Tomcat笔记 #01# WEB应用管理工具简介
索引 查看JVM以及SERVLET/接口的情况 动态管理WEB应用 Tomcat自带了一个基于网页的web应用管理工具,可以帮助我们监控&管理部署上去的WEB APP,特别方便!恰好之前碰到的 ...
- 根据RadioButtonList动态显示隐藏Div
使用场景 今天在写项目的时候遇到一个需求,注册页面,用户先选择类型继而填表单,所以需要根据选择切换表单,使用的前端框架是MiniUI,但是在实现这个功能的时候mini.get()方法无法得到div元素 ...
- 【Alpha】Scrum Meeting 8
目录 前言 任务分配 燃尽图 会议照片 签入记录 困难 前言 第8次会议在4月12日21:00进行微信会议. 交流确认了任务进度,对下一阶段任务进行分配.时长15min. 任务分配 姓名 当前阶段任务 ...
- ASP.NET Core开发总结
1.关于浏览器缓存,修改CSS文件和Javascript文件后调试,浏览器不更新问题,解决办法是在link标签和script标签引用的文件名后面添加版本信息如下: <link rel=" ...
- 富文本编辑,xss攻击
富文本编辑 KindEditor 在线HTML编辑器 http://kindeditor.net/doc.php 下载成功,解压放到项目中去 查看官方文档进行操作 xss攻击 XSS攻击全称跨站脚本攻 ...
- go 笔记
Go 语言的变量声明格式为: var 变量名 变量类型 返回类型. 匿名变量不占用命名空间,不会分配内存.匿名变量与匿名变量之间也不会因为多次声明而无法使用. func GetData() (int, ...