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 ...
随机推荐
- MAVEN简介之——pom.xml
maven构建的生命周期 maven是围绕着构建生命周期这个核心概念为基础的.maven里有3个内嵌的构建生命周期,default,clean和site. default是处理你项目部署的:clean ...
- Javascript基础语法(一)
一.Javascript简介 1. 定义 基于事件和对象驱动,并具有安全性能的脚本语言. 2. 出现背景 上世纪90年代,在美国有出现,当时有上网的环境,并且有网站服务在运行. 注册服务 上图涉及的问 ...
- Ping 命令实战小结--TCP/IP协议学习
2011-12-22 22:38:49 图1 图2 一,环境说明 硬件连线.PC与2440开发板直接用网线连接. PC的ip地址:192.168.0.107.2440开发板的ip地址:192.168. ...
- CCF CSP 201312-2 ISBN号码
题目链接:http://118.190.20.162/view.page?gpid=T4 问题描述 试题编号: 201312-2 试题名称: ISBN号码 时间限制: 1.0s 内存限制: 256.0 ...
- SQL大数据查询优化
常写的SQL可能主要以实现查询出结果为主,但如果数据量一大,就会突出SQL查询语句优化的性能独特之处.一般的数据库设计都会建索引查询,这样较全盘扫描查询的确快了不少.下面总结下SQL查询语句的几个优化 ...
- 清除Windows 10的文件夹浏览痕迹
windows 10有一个功能就是在快速访问时显示“最近访问的文件”,“常用文件”.如果是一台共用电脑,这个功能会经常暴露自己的“行踪”. 可以在“文件夹选项”-“隐私”中去掉勾选,并点击“清除”来清 ...
- NI_NUMERICHOST" is not exported by the Socket module "getaddrinfo" is not expo
[root@Server3 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf "NI_NUMERICHOST" is no ...
- 使用session和cookie实现用户登录:一个登录页面,一个servlet,一个登录成功页面
文件目录 1.登录页面 <%@ page language="java" contentType="text/html; charset=utf-8" p ...
- jquery的优良继承方法
说一下好处:这个封装函数可以可以实现子类继承父类原型对象里面的所有方法和属性,但是也留了第二条路,去继承父类构造函数的里面的东西. 两个参数分别是子类的构造函数,后面是父类构造函数 $.inherit ...
- GHSpro多数据库连接
GHSpro多数据库连接 文章 1 数据连接 XXX.Application.Web -> XmlConfig -> database.config <connectionStrin ...