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思维和设计模式的大海里面徜徉。