BUAA-OO-第四单元总结及课程总结

黄瑞翔-22230611 学生 2024-06-14 23:18:56

目录

  • oo第四单元作业博客(22230611-黄瑞翔)
  • 一、本单元所实践的正向建模与开发
  • 二、本单元作业的架构设计
  • 第一次作业
  • 第二次作业
  • 第三次作业
  • 总结分析
  • 三、四个单元中架构设计思维的演进
  • 第一单元(表达式化简)
  • 第二单元(多线程电梯问题)
  • 第三单元(JML)
  • 第四单元(UML)
  • 四、四个单元中测试思维的演进
  • 五、课程收获

oo第四单元作业博客(22230611-黄瑞翔


一、本单元所实践的正向建模与开发

在本单元中,课程组给出的要求是先根据指导书中的描述构造好答题思路,提前设计好大致的类图、状态图以及顺序图,然后根据UML图进行编程。在实际操作过程中,由于指导书的描述很有层次,因此我能够从题目要求中较为方便地提炼出需要编写哪些类、需要设计哪些状态。在编写代码时,由于框架已经被大致勾勒,所以更多地就需要考虑诸多细节的实现,在完成代码编写后,我会再一次将UML图完善一遍。总而言之,这单元作业给我带来的感受是:事先设计好UML图对于编写代码的效率提高是大有裨益的。

二、本单元作业的架构设计

第一次作业

第一次作业主要是根据用户需求,实现图书在 书架、借还处、预约处、用户四者之间的移动。

类图如下:

img

在本次作业中,针对四个图书所在地点设计了四个类,在Main类的主方法中对这四个类分别进行实例化——因此,Main类与其他四个类之间均存在依赖关系。具体实现:在Main类中针对各种请求分别编写相应的static方法,在主方法中对其进行调用即可。

第二次作业

相较于第一次作业,本次作业新增了续借功能以及图书漂流角Corner。对于前者,只需要在Main类中新增一个static方法renew即可;对于后者,我新建了一个Corner类,与上次作业的那四个类一样,在Main的主方法中实例化。

类图如下:

img

状态图如下:

img

本次作业状态图的设计,将五个地点设置为五个状态,然后从用户每种不同类型的请求中分析其可能带来的状态转移。

第三次作业

本次作业增加了用户信用积分这一概念,对整体的架构而言不需要改动太多,只需要在用户类中加一个属性用来记录其信用积分即可。此外,在主类的各个方法中,需要对积分进行按时改动。

类图如下:

img

状态图如下:

img

顺序图如下:

img

总结分析

最终的代码设计总体与UML图相吻合,其中有部分的细节是无法根据UML图来编写的,需要自己去寻找相对合理的逻辑。在编写代码过程中,我也会适时的向UML图中加入一些相应的新方法与状态转移,但总体的框架不会发生太大改动。

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

第一单元(表达式化简)

这一单元的开始之初,我几乎是一头雾水。但好在有训练代码的帮助,我理解了解析一个表达式需要将其抽象为不同元素的组成,对其进行层次化的递归解析。从中,我深刻地感受到了层次化设计的重要意义,如何将一个复杂的对象抽象为简单元素的组成,是一个看似很难的问题,但当你有了思路后,会发现它其实非常清晰且便于理解。此外,在计算表达式的时候,也是通过从最简单的元素开始计算,然后通过递归不断的计算更高级别元素的值。总而言之,第一单元给我带来的深刻感受就是层次化设计的重要性。

第二单元(多线程电梯问题)

这一单元训练的主要是多线程的代码设计。同第一单元一样,在刚拿到题目时,我也是没有一个清晰的思路。在这单元的实验之后,我对线程的认识才逐渐清晰起来。由于是一个实时的电梯系统,我们在保证电梯正常运行的同时,还需要考虑不断新增的请求与每时每刻的调度。因此我们需要设计三个线程来分别解决。在每个线程中,需要针对其功能按照逻辑顺序编写代码,此外最令人头疼的就是锁的问题,需要细心地判断资源是否被多个线程共享,从而决定是否设置锁块。

第三单元(JML)

这一单元的架构已经有课程组给出,我们需要做的就是根据JML语言的要求进行细节的处理。这单元更多考查的是如何选取合适的数据结构与算法以提高性能。此外,这单元需要我们针对方法编写测试,这一部分的实用性很强,对于debug很有用处。

第四单元(UML)

这一单元中,UML图对于程序的架构设计十分有帮助。对于题干给出的要求,事先规划好若干的类,大致明确类与类之间的关系。做好这一类准备后再编写代码,会使得思路很清晰。

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

在本学期的四单元作业中,有了身边大佬的帮助,我在完成作业后可以使用评测机进行测试。在自己测试的过程中,我最初主要使用的是手动构造的方法,但在第三单元中学会了构造随机的样例进行测试。

第一单元的测试中,我会自己手动构造一些复杂的表达式,比如多层函数嵌套等;

第二单元的测试中,我主要依靠的是大佬编写的评测机(真的万分感谢);

第三单元中,我学习了编写测试的方法,学会了手动构造样例测试某个方法,也学会了通过随机数去生成大量的样例。当然,两种测试各有千秋,手动构造能够应对一些很特殊的情况,但覆盖面较窄;随即数据可以大范围地覆盖可能的情况,但可能会遗漏一些极特殊的情形。

第四单元中,我仍然是采用手动构造样例,也借助了评测机的帮助(再次感谢!)。

五、课程收获

这一路上的颠沛流离,终是到达了这一刻,我心中纵有千言万语,却在此时放慢了敲击键盘的速度。可以说,是收获满满的一个学期吧。虽然在上学期学过了oopre课程,但由于相隔已久,在本学期之初的我好像无头苍蝇一般,对待刚开始时的作业一筹莫展。有幸通过训练代码的提示与和同学的交流,我才慢慢地走进oo的世界。第一单元让我明白了“面向对象”的含义,如何将复杂的研究对象抽丝剥茧为简单的元素,并将其层次化的处理,体现了一个oo人的基本素养。在第二单元中,有那么几天,我疲惫不堪地与死锁、轮询这些问题斗争着,几番挣扎,终于还是柳暗花明了。我感受到,如果要编写一个完美的复杂多线程程序,需要大量的锁支持,并且要用明确的结束条件去结束某个线程,这是一份高强度的工作。在三、四单元中,我学会了如何阅读JML语言、如何构造UML图,并且尝试在更多的情境中去编写更优的算法。总而言之,这学期的oo课程锻炼了我的能力、历练了我的心志,希望在今后的学习生活中,能够稳扎稳打,更进一步!

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

301

社区成员

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

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