BUAA_OO第四单元博客

俞书昊-21371074 学生 2023-06-20 18:55:49

正向建模与开发

正向建模(Forward Modeling)是一种建模方法,用于描述系统的输入和输出之间的关系。在正向建模中,我们首先确定系统的输入变量,并基于已知的物理规律、统计模型或实验数据来构建一个模型。然后,通过该模型来预测系统的输出结果。正向建模通常用于理解和解释系统的行为,并用于预测未知条件下的输出。它是一种从因果关系的角度来建立模型的方法,通过对输入变量的控制和调整,可以预测系统的响应。

在本单元中,​ 正向建模需要我们在编写代码之前做好对类图、状态图、时序图的设计,以避免大规模的重构,并且,绘制可视化的uml图有助于梳理各个类之间的交互,理清思路。但在实际完成时,最终的代码设计和UML模型设计难免有些分离,因为有些交互的问题难以在模型设计时候就能预料到,在编写业务代码时候还需要灵活变通来实现一些模块功能。

类图

 

状态图 

时序图

 

 

架构思维

  • 第一单元,实现对表达式结构进行建模,完成多项式的括号展开与函数调用、化简,主要采用了递归下降的方法,体会到了层次化设计的魅力,本单元初步有了对象化的概念,单在实际设计上还有很多不足,主要是各个模块之间独立性不好,虽然把多项式从逻辑上拆分成了多个类,各个类之间还存在较大的依赖关系,这导致每次添加新功能时对原代码的改动都比较大,甚至需要重构。
  • 第二单元,实现了一个电梯系统,整体上是一个生产-消费者模型,主要实现难度在于多线程协作和调度算法两方面。架构上三次作业都采用了一种基于对现实的模仿的设计,将现实中坐电梯过程的三个行为主体,电梯、人、调度器作为基本的三个类,三个类的功能也是仿照现实生活,电梯只负责接受信号向目的地运行,不关心人员状况,人只管在电梯门打开时完成进出活动,不管电梯运行方向,调度器只负责完成调度分配以及在电梯和人之间传递信号,具体的电梯运动和人的上下都由他们各自完成。多线程的协调上,采用互斥的方法,将调度器的分配任务方法,调整队列方法设置为synchronized以实现不同电梯线程间的互斥访问临界资源。线程终止上在调度器内设置一个标志变量,实现当输入终止时电梯线程自动终止。本单元作业相比第一单元,各个类之间的依赖性降低,功能独立性上做的比较好,尤其是Elevator类和Person类,由于在设计上功能就独立于调度器,每次更改要求都只需稍微调整即可,而调度器的改动也主要在于每次使用的调度算法不同,主要功能上变化不大,这次作业没有重构的情况,而是能在上一次作业基础上增加功能并修改少部分相关代码实现,是相比于第一单元最大的进步,也体现了对OO方法的进一步理解。
  • 第三单元是对jml的学习,整体代码功能已经给出,我们只需实现一个环节,要求通过读JML语言理解实现。由于只负责写整个系统的一部分,架构上考虑较少,重点是数据结构的组织和相关的算法优化。
  • 第四单元是图书馆大模拟,因为各个对象的交互比较复杂,所以对架构的要求较高,所以我在架构上花费的时间较多,最终也是较好的实现了低内聚、高耦合。

测试设计

  • 第一单元,主要靠手搓数据,根据指导书构造一些边界的、易错的数据点,但整体测试不够充分。
  • 第二单元,采用评论区大佬的评测机。
  • 第三单元,生成随机数据,与同学进行对拍。
  • 第四单元,这一单元考察uml,借书、还书的操作可以枚举,主要靠手搓数据进行功能性测试。

课程收获

经历一个学期面向对象课程,我的收获主要有三个方面:面向对象思维能力、码力、自我检测能力。

首先,面向对象思维能力是这门课程的核心要求,对我来说也是最大的挑战。在之前的学习中,我主要接触的是面向过程编程,尽管在寒假时预习了java语言,但在实际编写程序时仍然倾向于使用面向过程的思维方式。然而,通过这一学期的训练,我逐渐能够自然而然地运用面向对象的思维方式来分析问题和设计架构。相较于面向过程编程,面向对象更接近人类的思维模式,这在编写大型程序时显得尤为重要。面向对象编程更容易进行大中型程序的设计,编写过程中也不容易出现错误。而面向过程编程由于各部分关联性太强,常常出现一个地方出错牵一发而动全身的情况。通过面向对象思维的训练,我能够更好地设计程序的架构,减少错误的出现,并且在出错时更容易定位和解决问题。这对于编写高质量的代码和保证程序的可维护性具有重要意义。

其次,码力的提升也是这门课程带给我的重要收获之一。从每次作业发布到提交的时间一般只有五天,实际编写代码的时间只有一天多。考虑到架构设计和代码检查的时间,实际敲代码的时间更加有限。然而,通过面向对象的训练,我发现自己的编码速度有了显著提升。在完善架构设计的情况下,我能够快速而准确地编写代码。现在,基本上能够在一晚上的时间内完成500行以上代码的编写。这对于我来说是一大进步。

最后,我在自我检测能力方面也取得了显著的进步。之前,我的测试主要依赖oj的反馈信息,自己进行的测试相对较少。然而,在面向对象课程的训练中,我开始更加全面地考虑测试方面。我有意识地进行边界测试、压力测试和功能覆盖性测试,并且学会了使用自动化测试和单元化测试的技巧。这些能力的提升使得我能够更全面地测试我的代码,提高了代码的正确率,有时甚至能够一次性地编写出没有错误的代码而通过中测。

这些收获将对我的软件开发能力产生积极的影响。

 

...全文
67 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

444

社区成员

发帖
与我相关
我的任务
社区描述
2023年北京航空航天大学《面向对象设计与构造》课程博客
java 高校 北京·海淀区
社区管理员
  • 被Taylor淹没的一条鱼
  • 0逝者如斯夫0
  • Mr.Lin30
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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