写在前面: 随着这篇博客的发布,整个OO课程也正式迎来了尾声~!从上学期OOpre初次接触JAVA这门编程语言的手足无措,到现在能够自己有条理地写出一个小程序 (真的吗),这门课还是教会了我们许多的,至少比过去的自己强了不是吗。
一、正向建模与开发
正向建模与开发遵循一种自上而下、从抽象到具体的设计思路,强调在设计阶段尽可能地考虑所有可能的问题,以减少后期的修改和重构,提高开发效率和质量。
在本次作业中,体现在UML图与代码实现间的联动。也就是,我们先利用UML类图、顺序图、和状态图搭建出一个大致框架,再写代码来实现这些功能。这要求了我们在设计阶段就尽可能地考虑所有可能出现的问题,以减少后期的修改和重构。(不过因为经验不足还是重构了一次T-T)通过这种提前规划和考虑,可以更加高效地开发和构建系统或软件,提高质量和可靠性。
类图: 显示了模型中的类、类的内部结构以及它们与其他类的关系等,描述系统的静态结构。
顺序图: 展示了交互过程中消息的传递和响应,帮助准确地描述和理解事件之间的关系。
状态图: 描述了实体基于事件反应的动态行为,显示了实体如何根据当前所处的状态对不同的事件做出反应。
其中类图是最为直观的(个人认为),最能够指导代码实现的模型。这次作业对于类图的评测也是十分的严格。(提交次数都去哪了~~)剩下两个嘛……懂的都懂,关键不在通过评测,而是在于理解的这个过程)
二、U4架构设计
(四个单元了,终于有现成的类图拿来用了,流下感动的泪水)
这次作业要求我们实现一个小型图书管理系统,需要实现借书,还书,查询,预约,预约取书,续借和图书漂流功能。总体来说,需求比较贴近生活,比较好理解。
具体地,分为以下几个主要的类:
Library: 负责将输入指令分配给各个部门,调用其它部门的方法,管理bookshelf
,记录所有学生信息。
Student: 在第三次作业中加入,管理每个学生所拥有的书、借还日期、信誉积分。
BorrowOffice: 借还处,管理位于借还处的书以及一些移动操作。
Reservation: 预约处(自己瞎取名),管理位于预约处的书、记录预约指令,提供预约相关操作。
DriftCorner: 漂流角,管理漂流图书,提供捐赠、移动相关操作。
Book: 第二次作业加入,记录书号和借还次数。
这个单元其实有一点点oopre的既视感,理解上没什么困难(感谢OO课程组在考期大发慈悲),实现起来……暴力循环也能过,不用像第三单元那样为性能问题焦头烂额,也不用像第二单元那样为正确性焦头烂额。大多bug都是一些细节,不过多读几遍题目要求,再浏览一遍讨论区基本就能解决。硬要说的话,可能就是每次迭代中,新的要求比较分散,有点难找(第三次作业预约书多了些限制,第一次做的时候漏掉了)。
三、架构设计思维的演进
Unit 1 表达式解析
主打一个承上启下的作用,帮xie助po我们理解递归下降的思想。其实正向建模在这一单元已经隐隐体现了,Expr-Term-Factor
这样一个下降结构,以及其中各种运算关系,需要我们自己画图来区分。不过,刚开学还处于一个懵懂状态,写的时候还是遇到了递归把自己递进去了的问题,有一些混乱。
Unit 2 电梯
至!暗!时!刻!多线程对于我来说还是太烧脑细胞了…!在抉择实现方法时纠结了好久,最开始看不出孰优孰劣,有些细节等写到了才发觉一丝不对劲。没有在写之前确定好大致框架,导致了后面逻辑混乱、不知道从哪里下手,给了我当头一棒。这次失败的教训,给我狠狠上了一课,后面再也不敢没什么思路却直接上手写代码了。
Unit 3 JML规格
一个比较形式主义的东西。 规格描述可以更完整更精确地表述需求,能够有效避免一些争议。大体框架、各个类之间的继承关系已经给定,我们只需要在这基础上构建我们自己的类即可。可以说这个单元主要考算法不考架构。
Unit 4 UML模型
一个没那么形式主义的东西。吐槽一下这个作业难度呈一个先上升后下降的趋势,给了我一种自己进步的错觉。架构的话,采用正向建模,先框定各部门的职责和之间的关系,再着手代码,能够减少重构风险。(当然,有人第一次作业忘了考虑可扩展性,导致第二次作业狠狠重构了)
四、测试思维的演进
Unit 1 表达式解析
刚刚从愉悦的寒假中缓过来,脑子着实有点不太够用。 主要的测试方法是手搓一些典型的+边界数据。典型数据,就是循序渐进:单因子、多因子;含参、不含参;含0、不含0;这样排列组合一步一步来。边界数据,把0放在各种地方,试着卡大数据等等等等。不过人的脑力终究还是有极限的,所以我不……所以还是挨了好多刀(哭)。
Unit 2 电梯
这里就主要靠佬的评测机了(感恩)。DPO伟大!!还附赠分析功能,省了我好多ctrl F
的时间。
Unit 3 JML规格
这个单元要求junit,于是就直接黑箱测试了。喂个几千轮随机数据,从非完全图到完全图,尽量涵盖广一点的范围。包括value值也不能忘了负数,正确性方面是没什么问题的。(性能的话……哭)
Unit 4 UML模型
基本上就测了一下样例,正常写不太容易出bug。麻烦的是UML的一大堆bug,只能使用万能的瞪眼法。
五、课程收获
这一个学期的OO正课,虽然代码语法方面讲的比较少,但是学到了很多理论知识……以及收获各种小故事(jyp老师:一到这种时候大家头都抬起来了)
这门课教会我的,大概就是从面向过程的编程思维转变为面向对象的思维,这种转变能够更自然地处理复杂的问题。也学会了从“对象”的角度出发去分析和设计程序,而不是简单地堆砌代码(其实还是有的)。
结束啦~OO真的是非常典型的6系大课,你可以在任何课上看到敲OO的同学们,它也给我带来了许多的不眠之夜。不过,过程虽然是痛苦的,当交上去一片绿之后,还是会有满满的成就感……被cpu了(确信)
也感谢在我绝望的时候帮助我的同学们,感谢愿意听我吐槽的朋友们, 给我带来了莫大的鼓励。谢谢!!