OO第四单元——UML设计

OO第四单元——UML设计

正向建模与开发

本单元是训练根据UML写代码的能力。相较于以往三次作业先写代码再画UML图,这次的作业是正向开发的,即先自己思考出UML图然后根据UML图写出代码。

在开写代码之前,我先是在脑子里思考了一下图书借阅的过程,对于这种生活实际的问题,我一直坚持着一个理念:存在即合理。多想想生活中的场景会对这种生活题的模拟有很大帮助。然后经过思考,构建了主要的类,图书借阅的过程无非就是LibraryBookShelfborrowReturnDeskreservationDeskdriftCornerStudent来回传递信息的过程。再根据题目要求,想一想具体的借书还书过程,就可以抽象出一些函数,然后根据oo三大特征中的封装,让类与类之间的功能独立,即可以画出大概的UML图。有了UML图了,代码写起来就很简单了。UML图方法表示的是这个类具有的功能,我们写代码的时候就是实现该功能即可。

架构设计

在这里插入图片描述

这是我最终的UML类图。从图中可以看出我确实做到了所谓的在Library里,五个部件之间进行消息传递的过程。至于Book类的设计,是因为在写的过程中发现有些中间变量如果单独放在Library里会很杂乱,但是用一个类将用到的属性封装在一起会很方便,于是设计了Book这个类,这个类也比较贴切Library里有Book的感觉。

  • Library

Library有点类似于Controller,它作为接受main里传入要做什么的请求,又将该请求具体的实现逻辑分发给对应的对象进行工作。

  • BorrowReturnDesk如名字所示,负责借还处的图书管理。
  • ReservationDesk如名字所示,负责预约图书取书的图书管理。
  • DriftCorner漂流角,负责漂流图书的图书管理。
  • BookShelf在一开始的时候就初始化了,它作为消息交流的重点。
  • Student模拟学生借书的请求,学生持有的书封装在里面,借还预约取书等功能都需要先check学生的状态,看看是不是能借。
  • Book封装了许多属性,比如预约的日期,借书的日期,这些在我的实现中对于具体函数的处理都有相当大的帮助。

总体说下来思路都挺顺畅的,稍微取了点巧的就是在整理图书的时候只在开馆整理一次,闭馆什么处理也不做。经过分析,开馆整理是有百利而无一害的。后续的迭代开发也证明了该架构的正确性。

架构设计思维的演进

第一单元是表达式展开,考察了递归下降分析和封装的重要性。第二单元是电梯,考察了多线程处理。第三单元是JML规格,考察了阅读规格写代码的能力。第四单元是UML设计,考察了根据UML图写代码的能力。

第一单元是我最痛苦的单元,虽然学习了oopre,但我的设计思维还没有从面向过程转化为面向对象的编程。第一单元注重的是一个统一处理,而我最开始的时候老想去分析具体的逻辑,重视了局部而忽略了整体,现在还记得第一次作业直到周四晚上还没有写出一个字。在室友的帮助下,才慢慢地理解了什么是面向对象,为何面向对象的三大特征是封装、多态、继承。第一单元的收获使得后来的单元轻松了不少。

第二单元是非常贴近现实编程的一个新颖的概念,多线程。以往写的程序都是顺序运行的,这次是并行运行的。因为第一单元每次作业完成的都很极限,所以第二单元的第一次作业我很早就开始做了,没有采用实验课的架构,这也使得后来的性能分很垃圾。

第三单元吸取了前两单元的教训,一直在思考但是前两天都没有动笔,等到实验课过后才开始写。虽然本次迆比较简单,但感觉我的思维已经从面向过程脱离出来了。谁有谁的功能,就创建类,类与类之间怎么联系,就通过调用类的方法来实现消息的传递。又因为具体的方法已经给出来了,只需要思考思考怎么不会超时即可。这单元在轻松度过的同时学习了不少算法。

第四单元就考察了前面三个单元学习到的架构思维。虽然也很简单,但我个人觉得我本次的架构是不错的。体现在每次迭代开发的时候对于前面的代码修改很少,然后新增的代码量也很少,我觉得这是达到了老师所说的要求。本次作业完成的都很快,除了第一次作业外,剩下的作业基本两个小时就做完了。

测试思维的演进

最开始的时候,我也只会根据评测机来捏数据,然后强度也很低,基本测不出什么问题。后来宿舍里的大佬发力了,我见证过他捏的数据后,深受震撼,woc,原来还可以这样。佬采用的方法朴实无华,找边界条件,找复杂度最高的方法,想想大伙可能会怎么做,根据这三点,反过去捏数据。这种数据捏出来是极其特殊的,无论是第三次作业的疯狂exp,还是第二单元50.0s的疯狂上人,抑或是第三单元不好好注意就会O(n^2)的qtvs等等,都是这种测试思维的产物。在第一单元之后我的测试思维就有较大进步,每次都能刀到人。

此外就是评测机的大规模覆盖吧。拥有一个伟大的评测机相当重要。在之前的博客我就已经提到过,大规模数据覆盖加上特殊数据爆破测试,通过这两种测试,代码基本就没啥问题了。也就是提到的黑白盒测试。

课程收获

3学分的课上出了30学分的感觉(。一开始的oo强度确实很大,我记得我一开始几周从星期一到星期五每天都睡不好觉,随时随地基本都在想oo要怎么写。做梦都在写oo。写完了星期六晚上睡觉的时候有种劫后余生的感觉(。真可谓抗压中的抗压了。清明节的时候宿舍三个人疯狂debug,多线程虽然有1/1000的bug,但是无法全部accept也始终困扰着我们,从早de到晚最终总算找到bug了。看到all accepted那一刻心情还是相当爽的。

不得不说,从oo学到了很多,递归下降的处理思路,多线程的设计,JML规格的阅读,如何画好UML图等等。其他学校基本都没有我们这么大的强度,通过这种高强度的作业,我觉得水平上升的很快,一开始从啥也不会,很快就能想出来一个好方案并不断修正然后速写了。

也算是走完oo课程了,除了U3第一次作业互测时候被我的两个美赛队友一人来了一刀,就没有bug发生了。强测金身也是金身吧(。虽然正确性保证了,但是我在一二单元的性能其实做的并不好,也算是一点小遗憾吧。感谢一路来帮助我的好朋友们:ltc,gyk,crz,yez,我从他们身上学到了太多东西了。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值