目录
- homework & class & trainning : 两次上机、三次作业、四周课堂
- code analysis & review : 为什么我没有bug
- 黑盒测试和白盒测试
- OO 设计感言
- Scanning: Creational Pattern & Multithreading
一、作业、课堂、上机总结若干
1. 关于Debug
我对我三次房间的同学的bug都做了详细的文档记录,这里简单的贴一下,很热衷于和同学们分享。
第一次
. 多人删除了首尾的特殊字符
. 多人没有判断指数后面
. 一人没有考虑正则表达式爆栈
. 一人没有考虑对常数求导
第二次
[x] .in for rider TLE ,考虑嵌套,导致超市
[x] .in for saber , 没有考虑输出0
[x] .in for archer WF ,没有考虑格式错误
[?] .in for altergo saber assassin berserker rider UNKNOWN maybe because of sympy, sympy对拍精度问题,使用Wolfram Alpha复查
[?] .in for archer lancer UNKNOWN maybe because of sympy sympy对拍精度问题,使用Wolfram Alpha复查
[?] .in for rider WA UNKNOWN 「fail to debug」 ,没有考虑化简错误
[x] .in for archer WF ^ + ,没有考虑`^ +`类型的错误格式
[x] .in for altergo WA , 化简出现错误 x 表示 是错误数据
? 表示 是可疑数据
第三次
整体错误较少,仅一人出现判错格式。
大佬分享课的收获
1. shh : 优秀的自动机分析
2. cyx :优秀的设计模式思考者
3. dyj :高阶对拍器设计者
4. hdl :优秀的面向对象和工业级设计师
感谢各位同学,我受益匪浅,在分享知识后,我们收获的更多:如何设计测试、如何做良好测试、如何运用设计模式、如何学习面向对象、如何挑战自己的高度。
二、code review & analysis
三次作业以来,我的作业在强测、互测阶段没有发现任何正确性错误、在弱测环节因为正确性产生的commit也非常少。我来总结一下我三次作业的流程、思路、设计、代码实现。先是三张我的设计图。
第一次作业:
第二次作业
第三次作业
从三次的设计图来看,Unit 1对我的提升非常大,可以看到我的设计越来越有整体层次感、对象和接口的封装、多态的函数返回模式、具有自我管理能力的类、Unit 1的设计最后充分体现了我的设计思想逐渐丰富。组合思维的应用让我的程序越来越有设计感,越来越具有可扩展性和良性。
为什么我没有bug:其实是由于我的开发流程在逐步细化:
我的第一次开发流程:
1. 做一个简要的计划
2. 设计对象、画图
3. 写简单的测试用例和测试代码
4. 写代码
5. 小黄鸭调试
6. 运行测试
我的第二次开发流程:
1. 学习递归下降法
2. 第一次代码重新阅读
3. 重构类型清单
4. 一个新的设计计划
5. 设计新对象、做思维导图
6. 写部分代码
7. 重构部分代码,消除硬绑定、做软绑定。
8. 测试代码和测试类
9. 测试数据编写
10. 小黄鸭调试
11. 黑盒运行调试
12. 简单白盒测试
我的第三次开发流程
1. 学习装饰者模式、接口设计
2. 第二次代码重构模块绑定
3. 重构部分清单
4. 表达式树建立
5. 文法和对象模式的逐一对应
6. 写代码「仅40分钟」
7. 做头脑风暴,考察多种测试数据和思路,并完成代码
8. 检查是否存在硬绑定、消除硬绑定、为可行的优化做准备
9. 扩展、将优化和求导均作为装饰者执行。
10. 写代码
11. 测试类和测试代码运行
12. 测试数据构造和覆盖性测试
13. 小黄鸭测试
14. 黑盒运行测试
15. 覆盖式白盒测试
16. 优化及优化测试
17. 性能分析和性能测试
18. 代码回顾和思考
可以看到,在三次作业中,我没有bug完全是因为通过学习、通过和优秀的各位同学在讨论区交流、不断提升自我、提高自己的代码鲁棒性、和建立具有纠错能力的开发模式。我没有bug不完全是运气、但也有不少运气成分、还有很多同学比我做得更好、向他们学习。在三次作业后,我逐渐看清了表达式问题的本质:即,用组合的思维去描述表达式树的形态、用装饰者的行为去描述求导和化简这些可以变化的方法。是设计提升了我的代码质量。可以发现,我的优化也是完全面向对象的松耦合实现!
此外,在讲讲我三次作业的进步
我的第一次作业,代码其实有较高的耦合度。
OCavg | WMC | |
Poly | 3.8333333333333335 | 23.0 |
Main | 5.666666666666667 | 17.0 |
Total | 40.0 | |
Average | 4.444444444444445 | 20.0 |
我的第二次作业,代码的耦合度就直线降低了。
OCavg | WMC | |
Deg | 1.5714285714285714 | 11.0 |
Expr | 2.7142857142857144 | 19.0 |
Main | 1.0 | 1.0 |
Myinput | 2.2222222222222223 | 40.0 |
Myoutput | 3.0 | 6.0 |
Term | 2.1818181818181817 | 24.0 |
Total | 101.0 | |
Average | 2.1956521739130435 | 16.833333333333332 |
我的第三次作业,在扩展之后,依然有较好的扩展性和松耦合。且后两次的耦合主要在Input Handler即递归下降的部分,这部分HansBug学长已经给出了有效的OO风格的指导。
OCavg | WMC | |
Val | 1.0 | 9.0 |
Sin | 2.75 | 11.0 |
Pow | 1.6666666666666667 | 10.0 |
Plus | 2.272727272727273 | 25.0 |
Myoutput | 1.0 | 1.0 |
Myinput | 2.526315789473684 | 48.0 |
Mul | 2.4545454545454546 | 27.0 |
Main | 1.0 | 1.0 |
Cos | 2.75 | 11.0 |
Total | 143.0 | |
Average | 2.1666666666666665 | 15.88888888888889 |
三、黑盒测试和白盒测试
在黑盒测试部分,感谢:牛雅哲、张少昂两位助教的建议和鼓励、感谢林佬@login256,丁总,HugeGun,Nemo陈宇轩,对我的技术支持和指导。
在白盒测试部分,感谢:荣文戈老师的优质教学、感谢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. 检查内部数据结构以确保其有效性
四、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思维和设计模式的大海里面徜徉。