2024 BUAA OO 第四单元与课程总结

余欣实-22373040 学生 2024-06-12 22:48:49

目录

  • 一、三次作业的程序结构与正向建模开发
  • Homework1
  • Homework2
  • Homework3
  • 二、四个单元中架构设计思维的演进
  • 第一单元
  • 第二单元
  • 第三单元
  • 第四单元
  • 三、四个单元中测试思维的演进
  • 第一单元
  • 第二单元
  • 第三单元
  • 第四单元
  • 四、课程收获
(2024 BUAA OO 第四单元与课程总结)

一、三次作业的程序结构与正向建模开发

Homework1

  • 第一次作业架构的类图如下:

    img

  • 本次作业我首次采用了正向建模的思路,在着手编写代码之前,首先通读作业要求,初步把需要使用到的类及其属性与可能的关联用 UML 图表示出来;再在编写代码的过程中不断完善 UML 图与设计思路,思路比以往更清晰了,效率也确实提高了不少

Homework2

  • 第二次作业架构的类图如下:

    img

  • 本次作业则在第一次作业的基础上,再次首先针对 UML 类图进行开发设计,与第一次作业不同的是,本次作业的基本架构已经给出,设计的目标与实现方式更加清晰明了,对于 UML 类图的正向设计不再需要同程序一起做大的修改,程序的编写也只需要照着 UML 类图进行实现就可以了
  • 本次作业还新增了状态图的评测,对于程序中的状态转移,在第一次的作业中虽然没有写出来,但其大体内容已经很清晰了,因此制作状态图的过程也较为顺利,状态图也为本次作业的正向编程提供了一个新的视角

Homework3

  • 第三次作业架构的类图如下:

    img

  • 本次作业同样在上一次作业的基础上进行增量开发,同时新增了顺序图的绘制,对于程序中的消息传递机制进行了表述,从程序的执行顺序和消息传递的视角丰富了我们的正向编程手段

二、四个单元中架构设计思维的演进

第一单元

  • 第一单元的架构设计是比较粗浅的,我的设计思维多半来自先导课,凭借基本的面向对象思维,对于作业的要求,按照基本的程序执行的顺序,一点点将代码写出、补全,基本完成后就针对输出的性能进行优化
  • 第一单元总体上复习和加强了先导课的所学,同时对于递归下降这样递归调用的程序和数据结构以及其中的死循环避免等问题有了新的认识和理解

第二单元

  • 第二单元的架构设计以多线程的同步互斥控制为主,在设计的时候主要遵循每个线程的行为要求,先分别大致写出各自的行为,再对于线程间的通信、互斥等问题,使用互斥锁进行控制,最后在调试和修改中确保线程安全,预防死锁发生
  • 第二单元采用多线程的程序编写方式之后,难度大大增加,对于代码的编写不能再按照一个线程的执行顺序进行,需要更多的对于不同线程之间构成的多种多样的情形进行讨论和判断,对于全面考虑的设计提出了更高的要求

第三单元

  • 第三单元引入了 JML 作为描述函数行为的规格,因此设计思路就自然围绕 JML 所给出的描述展开,根据规格中规定的前置条件、后置条件、副作用范围等初步编写方法;由于存在时间复杂度的要求,因此在初步设计完成之后,还需要重新改进数据结构和算法,通过设计降低方法的复杂度
  • 第三单元首次引入了规格,以此指导我们在编写程序时首先对于代码进行正向设计,尽管本单元的规格代码都是由课程组给出的,但在我编写代码的过程中也确实体会到了正向设计带来的好处,也避免了此前容易产生的忘记方法功能等问题,更好地指导我规避了诸如对象深拷贝等相关的潜在问题

第四单元

  • 第四单元引入了 UML 作为整个程序设计架构的规格描述,真正实现了正向设计,在编程开始前首先进行 UML 类图草图的设计,再根据初步设计进行代码编写,在编写的同时跟进 UML 的修改与优化,最终完成整体架构的设计
  • 第四单元的 UML 相较于 JML 更加复杂和全面,在写代码之前需要我们全面地考虑整体架构的设计思路,从此写代码不再是凭着感觉试探着进行,而有了更全面、更完善的规划

三、四个单元中测试思维的演进

第一单元

  • 第一单元的测试主要针对于一些复杂度较高的表达式情形和正确输出最优答案上
    • 对于高复杂度的表达式,我采用了随机生成的方式,通过大量的黑箱测试来寻找问题,是最为简单有效的方法之一
    • 对于输出的优化,则需要对于特殊的优化情形进行考虑,这就需要我们正向思考,根据可能的优化方式进行组合,构造更为特殊的情况

第二单元

  • 第二单元的测试主要在于多线程并发所产生的线程安全问题,尤其是其中的死锁问题,这同样需要足够量的黑箱测试,甚至是同一个输入数据的反复多次测试,以尽可能地使线程安全问题暴露出来

第三单元

  • 第三单元给出了函数的 JML 规格,因此测试就可以从 JML 入手,针对所规定的前置条件、后置条件、副作用范围等进行测试,不仅提供了更为精确的测试思路,也让测试后的修复环节对于出错位点的定位更加高效
  • 同时本单元增加了 JUnit 单元测试,将测试的层面下放到了每个方法的层面上,测试更加细化的同时也更加自动化,也让我们初步感受到了正向规格设计带来的测试和调试的便利

第四单元

  • 第四单元的作业要求较为简单且开放,测试数据也不需要太强,因此我只是进行了黑箱测试,加以对于极个别特殊情况的测试样例,就基本完成了代码的测试
  • 本单元编写的 UML 图也可以作为测试的依据,通过 UML 图的内容来编写对应的测试数据,检验程序中的对应部分是否存在问题

四、课程收获

  • 大学以来五花八门的课程中,OO 课无疑是给我留下最深印象、对我影响最大的课程之一。伴随着先导课和正课的学习,我逐渐掌握了面向对象的思想和编程方法,让我在很多方面都有了应用,如今编程时的思维也与以往不同,有了更多的对象思维,甚至每次编程总想去用面向对象的思路去进行代码编写
  • 当然 OO 课远不止面向对象这么简单,我们更是掌握了一门高级语言,尤其是高级语言的多线程控制等等,也是填补了我这方面知识上的空白,增进了我对 Java 语言本身的掌握程度
  • OO 课程的每个单元都有着鲜明的分工和特色,不光是在前两单元的代码层面,更有后两个单元的宏观设计模式和规格,让我接触到了更加工程化、集成化软件开发的过程,每个单元都有着独特的体验
  • 总之,在整个 OO 课程的学习中我收获了太多前所未有也至关重要的知识,有了更为完备的面向对象编程的思想和操作体系,诚可谓受益良多
...全文
109 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

301

社区成员

发帖
与我相关
我的任务
社区描述
2023年北航面向对象设计与构造
学习 高校
社区管理员
  • YannaZhang
  • CajZella
  • C_ecelia
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧