#目录

 

  • homework & class & trainning : 两次上机、三次作业、四周课堂
  • code analysis & review : 为什么我没有bug,为什么大家的bug越来越少
  • 多线程设计
  • OO 设计感言
  • Scanning: Junit

    一、作业、课堂、上机总结若干

1. 关于Debug

非常有趣在上一次的互测中,你由于被 hack 扣分 0 分。这其中包括了 0 个错误,还有 0 个尚未修复。同时,你 hack 他人成功 0 次,得分 0 分。,这句话与我已经整整一个单元相伴了,因为我总是在无bug零伤亡组,而且我自己也测不出bug,这说明:

  1. 同学们的学习是有效的,对java的掌握相当熟练,有极强的自我设计思想在里面
  2. 强大的自动评测造福了若干同学
  3. 感谢老师和助教无微不至的帮助,预先排除了很多雷
  4. debug水平提高

2. 大佬分享课的收获

  

  1. 感谢王少布大佬,教导我们使用楼层类做优化,感谢他的分享,让我受益,理解了很多之前设计中
  2. 感谢张大佬,教导我们怎么做多线程任务分析太有趣了

感谢各位同学,我受益匪浅,在分享知识后,我们收获的更多:如何设计测试、如何做良好测试、如何运用设计模式、如何学习面向对象、如何挑战自己的高度。

二、code review & analysis

  第一单元三次全无正确性问题,同样本单元三次作业以来,我的作业在强测、互测阶段没有发现任何正确性错误、在弱测环节因为正确性产生的commit也非常少。我来总结一下我三次作业的流程、思路、设计、代码实现。先是三张我的设计图。

第一次作业:

第二次作业

  

第三次作业

从三次的设计图来看,Unit 2对我的提升非常大,我的设计可以一直使用,而且长期对修改封闭,对扩展开放,我的SOLID原则一直在做,在坚持,在锻炼自己,可以看到我的设计越来越有整体层次感、对象和接口的封装、多态的函数返回模式、具有自我管理能力的类、Unit 2的设计最后充分体现了我的设计思想逐渐丰富。组合思维的应用让我的程序越来越有设计感,越来越具有可扩展性和良性。

甚至可以发现,我的类图框架基本就没有变过,如果不仔细看,三次作业就如同一次作业一样,迭代开发的实力已经可见一般。

为什么我没有bug

其实是由于我的开发流程在逐步细化,我现在的开放模式:

  1. 学习相关的模式、接口设计、画流程图 (确定如何发布订阅,确定如何对象的属性)

  2. 代码重构、模块绑定、尽量避免重构

  3. 重构部分清单

  4. 电梯设计文档和策略

  5. 设计逻辑和对象模式的逐一对应

  6. 写代码「仅40分钟」

  7. 做头脑风暴,考察多种测试数据和思路,并完成代码

  8. 检查是否存在硬绑定、消除硬绑定、为可行的优化做准备

  9. 扩展、将优化的部分和不优化的部分独立进行,随时可以换下优化。

  10. 写代码

  11. 测试类和测试代码运行

  12. 测试数据构造和覆盖性测试

  13. 小黄鸭测试

  14. 黑盒运行测试

  15. 覆盖式白盒测试

  16. 优化及优化测试

  17. 性能分析和性能测试

  18. 代码回顾和思考

  19. 个人测试完毕,和同学交流讨论设计相互学习

  20. 回顾自己的开发,总结不足,下次再改,不做压线任务。

  21. 做代码审查,检查中避免死锁

  22. 实验, 故意放慢某个进程做强化死锁测试

  23. 理想实验,做并行程序分析图

  24. 不写无意义的commit,不做合并式的commit

  25. 做无锁化,不需要锁的任务尽量避免锁

  26. 做去轮询,避免代码中的轮询,越少越好

    可以看到,在三次作业中,我没有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. 检查内部数据结构以确保其有效性

  • 多线程强化测试
  1. 多线程的不可复现问题
  2. 将某一个进程故意放慢测试
  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的更多相关文章

  1. BUAAOO——UNIT2 SUMMARY

    本单元的题目为设计电梯,通过这单元的学习,我初步了解了关于java多线程编程及线程之间并发安全性设计等方面的内容.以下为对这三次作业的分析与总结. 作业分析 序号 楼层 电梯数量 可停靠楼层 调度策略 ...

  2. Summary of Critical and Exploitable iOS Vulnerabilities in 2016

    Summary of Critical and Exploitable iOS Vulnerabilities in 2016 Author:Min (Spark) Zheng, Cererdlong ...

  3. 三个不常用的HTML元素:<details>、<summary>、<dialog>

    前面的话 HTML5不仅新增了语义型区块级元素及表单类元素,也新增了一些其他的功能性元素,这些元素由于浏览器支持等各种原因,并没有被广泛使用 文档描述 <details>主要用于描述文档或 ...

  4. [LeetCode] Summary Ranges 总结区间

    Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...

  5. Network Basic Commands Summary

    Network Basic Commands Summary set or modify hostname a)     temporary ways hostname NEW_HOSTNAME, b ...

  6. Summary - SNMP Tutorial

    30.13 Summary Network management protocols allow a manager to monitor and control routers and hosts. ...

  7. Mac Brew Install Nginx Summary

    ==> Downloading https://homebrew.bintray.com/bottles/nginx-1.10.1.el_capitan.bot################# ...

  8. 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 ...

  9. 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. ...

  10. (转) Summary of NIPS 2016

    转自:http://blog.evjang.com/2017/01/nips2016.html           Eric Jang Technology, A.I., Careers       ...

随机推荐

  1. IDE中使用System.getProperty()获取一些属性

    使用环境:一般在项目首页或者项目后端配置中会使用到一些属性获取: package com.liuyc.study.utils; /** * 获取当前操作系统中或者当前环境中的一些默认配置 * @aut ...

  2. sedlauncher.exe

    这个进程很恐怖,屁大点的东西,但会造成磁盘爆满. 首先,这个99%不是病毒,而是win10更新后出现的东西. 关于解释,国内乱七八糟的,我没有搜到,只好在狗哥和微软官网搜了一下. 大多说是 KB402 ...

  3. 异步 async & await

    1 什么是异步 异步的另外一种含义是计算机多线程的异步处理.与同步处理相对,异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程. 2 异步场景 l  不 ...

  4. Gem install rmagick 报错问题~

    本人在CentOS7上在 执行”gem install rmagick“是报错,具体情况如下: 报错如下: [root@localhost ~]# gem install rmagick -v '2. ...

  5. keytool 错误: java.lang.Exception: 密钥库文件不存在: keystore

    通过Android Studio编译器获取SHA1 第一步.打开Android Studio的Terminal工具 第二步.输入命令:keytool -v -list -keystore keysto ...

  6. linux使用vim打开乱码问题

    在windows中编辑好的汉字文本文档,上传到Linux下打开乱码. [root@localhost ~]# rpm -ivh /mnt/Packages/lrzsz-0.12.20-36.el7.x ...

  7. 并查集 P3367 【模板】并查集

    P3367 [模板]并查集 #include<iostream> #include<algorithm> #include<cstdio> #include< ...

  8. js encode方法

    js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 1 ...

  9. java集合类学习笔记1

    一.集合的接口 java集合类库也将接口与实现相分离.首先看一下大家都熟悉的数据结构-队列是如何分离的.队列接口指出可以在队列的尾部添加元素,在队列的头部删除元素,并且可以查找队列中元素的个数.当需要 ...

  10. Swagger结合mustache模板生成后台接口代码、以及前后台建模代码

    之前项目中使用的的thrift来建模,维护前后台模型以及rest接口,前台使用的是angular2: 但是使用thrift只能生成建模,后台的rest接口的Controller文件还是需要手动去写,一 ...