2022_BUAA_OO 第四单元总结

2022_BUAA_OO 第四单元总结

本单元作业架构设计

作业内容

本单元作业需要我们实现一个UML解析器,能够对类图、时序图、状态图进行解析以及模型有效性的检验,具体来讲是先由官方包将输入的一系列字符串转化为同一抽象类,需要我们先后完成建立模型、检验模型的有效性以及查询相应的指令。

新增类

我采用了新增类包装原有类的方式,对所有需要用到的原有类进行了统一的封装,每个类实现了UmlElementInterface接口。同时,在建立模型的过程中,需要进行五次遍历,我将遍历过程单独封装为一个方法类。这些手段都便利了增量开发的进行,同时也使得MyImplementation类中代码行数显著减少。

实现细节

由于很多需要的数据只需要计算一次,同时单次计算的时间复杂度较高,最好使用记忆化搜索可以有效提升性能(虽然本单元对于时间几乎没有限制),同时还涉及到了一些比较容易实现的算法,如计算关键路径可以用bfs,查找有向图中环或两点之间路径数量可以采用dfs、拓扑排序等方法。

架构设计思维及OO方法理解的演进

第一单元

正式进入面向课程的学习,在这个单元中,我们初步实践了程序的架构设计以及对于迭代开发的思考,在一次次增量开发中,我切身地体会到了一个相对良好好的架构设计,对于开发的重要性。同时,在这个单元中运用到了递归下降的思想,这让我们初步接触并理解层次化设计思想,学会从现实问题中剥离抽象层次。此外,在本单元,我们对封装也进行了较多的实践,除了掌握类是封装数据和操作、提供数据间的接口的基础层面,还开始对与“高内聚低耦合“有了一定的认识。本单元还实践了工厂模式,打开了学习设计模式的大门。

第二单元

这一单元我们初步学习并理解了多线程开发环境中的线程协同与线程安全问题,着重设计并发行为的效率以及线程安全性。我们需要通过慎重加锁的方式以及临界区的大小,再加上一个相对全局更优的调度算法来提升程序性能。同时在这一单元,我们也学习并实践了许多非常实用的设计模式,如生产者-消费者模式,流水线模式,单例模式,观察者模式等,还运用到了策略与机制分离的设计思想。我们还在理论课上学习了SOLID原则,学习到了单一责任、里氏替换、开闭原则等在程序设计中的重要作用。

第三单元

这一单元我们学习了契约式编程的思想,学习了基于规格的程序设计。整个单元的代码实现过程都是在阅读复杂规格并提炼关键逻辑、进行翻译的过程。同时这一单元似乎也是对于时间限制最严格的一个单元,需要我们对算法的时间复杂度有较好的设计。此外借由异常抛出的加入,我也开始考虑程序设计的鲁棒性。

第四单元

这一单元我们系统地学习了UML的类图、时序图和状态图。在设计上我们可以以图为对象,分封包装成相关的类,可以很大程度上简化代码,看着更加赏心悦目。

四个单元中测试理解与实践的演进

第一单元测试需要考虑较多的边界情况,其间出的一些主要问题来自深拷贝、优化后的正确性以及如何河流组织输出。在测试方面我先梳理了架构设计,再据此针对性的构造边界数据进行测试。

第二单元测试要针对线程安全以及调度算法的实现进行测试,我出现的问题也主要源于此,如在第一次作业要保证时间戳的递增,第二次的优化边界出了问题。测试采用了对拍与手动编造极端数据实现,以及一些随机数据的压力测试。

第三单元测试几乎全在于时间复杂度,需要着重注意采用的优化方式的正确性,这一单元发现的问题也主要来自与极端数据的构造,以及找同学帮忙进行对怕测试,互测过程也主要是压力测试。

第四单元测试由于时间问题,主要还是根据讨论区提出的一些问题构造数据对自己的代码进行测试。

课程收获

  1. 最直观的收获是学习掌握了JAVA语言的基本语法以及一些特性

  2. 养成了良好的代码风格

  3. 学习了多种测试手段

  4. 学习理解了架构设计思维以及许多实用的设计模式

  5. 重温了不少数据结构课学过的算法

  6. 理解了契约式编程

  7. 接触了多线程编程

  8. 锻炼了心态,出再多bug也能波澜不惊。。。

改进建议

  1. 第一周或许可以不留作业而让同学们完成预习任务,三天学会java确实有点难顶。。。

  2. 可以考虑增加一个测评机搭建教程的pre

  3. 实验课后公布参考答案,便于学习理解,同时实验课可以考虑有一定的反馈结果

posted @ 2022-06-28 23:57  luiluizi  阅读(23)  评论(1编辑  收藏  举报