本单元所实践的正向建模与开发
正向建模和开发,是很有效的手段。在本单元中,我们实现了一个图书馆模拟系统,包含读者、各类管理员、三类借阅和预约规则不同的书,依托UML的架构设计能力。以下是我完成作业的流程:
- 设计架构️
- 绘制草图️,画出原始的
UML
类图和关键流程的时序图,以及核心状态的状态图 - 在
UML
图和草图的基础上高效编码 - 在测试并 debug 的过程中修改架构设计和
UML
图
正向建模开发,练的是“内功”。在大型工程中,边架构边开发乃至逆向工程是完全不可取的。在我们作业中,不采用正向建模开发可能能让我们快速完成某一次作业,但决不利于理解和维护,也很难基于现有代码进行开发迭代。
本单元作业的架构设计
架构:以 Library
为核心类,内有各种图书(Book
类)和学生信息学生类 Student
,还复合了各类图书管理员(借还管理员(LoanReturnLibrarian
类),整理管理员(SupplyDepartment
类),预定管理员(BookLibrarian
类)),以及图书管理处(PurchasingDepartment
类)和自助机器(SelfServiceMachine
类)。此外还有顶层封装类 BookManager
以及辅助类 Message
(负责传递借书请求和书籍副本)。
- UML 类图
- UML 状态图
- UML时序图
追踪关系比对分析:
在迭代的过程中,虽然需求暴增、约束很多,但是依靠第一次作业建立的良好架构,拓展并不困难,但是要注意和UML图的一致性,并且点面结合进行测试,以提高代码质量。
状态图我画得十分精简,将书的状态抽象成在图书馆、在运输中和在读者手中,主要对应 Book
在 Library
、PurchasingDepartment
、和 Student
间的状态转移。这样描述书的好处是精简、抽象、不易出错,坏处是编码的时候还要具体分析画草图,可能会造成功能实现的一致性问题。
流程图我设计得稍微复杂一点,涉及到 Student
、Library
、BookLibrarian
和 PurchasingDepartment
的消息传递。可以看到,BookLibarian
和 PurchasingDepartment
的消息传递高度一致,当读者预定后发现本校没有根本没有这本书(包含已经出借的和在架上的)的时候,就会同时发出借阅请求和购书请求。这样一个类负责预定书籍,一个类负责采购书籍,相互协作,完成了功能的实现,彼此仍然保持相对的独立。
架构设计思维的演进
从上手直接写,再到构思后写,再到先构思,写 demo,再着手写,到利用 UML
工具,对指导书的要求进行充分抽象之后再写。我从掌握“一人敌”的方法到掌握“万人敌”的方法,学到了面向对象程序设计的精髓。在以后的实践中,我将更加充分地将这种思维运用到自己的编码中。
第一单元没有架构思维,因为递归下降的模板是现成的。第二单元电梯,因为 Look
算法和影子电梯几乎就是最优解。第三单元代码翻译填写,也不太需要架构思维。只有第四单元,面对需要自己用 UML
绘就未来的代码大厦的难题,必须总览全局,搞清要求,仔细设计,才能涉险过关。故通过第四单元的训练,我的架构设计思维才真正成形。
测试思维的演进
有赖于 OO 微信公众号的教程,我从第一单元开始就开始着手搭建自己的评测机。虽然 2、4 单元更加依赖大佬的评测机和具体的数据点,但毕竟还是锻炼了自身的能力。
我的测试思维的演进是增量型的。一开始我只会单纯的暴力测试,修改 bug。在电梯单元我根据具体的功能构造了强度足够高的测试点(如仅有换乘可达的数据点)。在第三单元测试中我通过 JML
和 JUnit
接触了模块化测试。这一单元无论是写对拍器的能力和测试思想均有很大提高:评测机的代码接近 1000 行,同时了解了什么是白盒测试、黑盒测试,以及功能测试、集成测试、压力测试等。在第四单元测试中,我以更清晰的逻辑,体验了什么是正向化设计下的代码测试。
课程收获
在写下这篇博客的之后,我仍然在完成 OO 最后一次课的作业,试图理解纷繁的顺序图和它与其他 UML 类图的关系。是的,OO 就是一个这样快节奏的课程,每一次的作业,就像是无声的行军号令,只见到战士衔枚疾走,奔向刀光剑影的血腥战场。中测、强测、互测,我们早已身经百战;清晨、黄昏、黑夜,我们只争朝夕,奋力前进。
在 OO 的最后一次课暨 OO 课程颁奖典礼上,印象最深的是吴际老师的的这样一句话:“OO 课用心讲好每一个故事”。是的,从解好一道算术题,到设计好电梯的调度算法,再到构建起庞大的社交网络,再到抽象层次的架构设计,还有研讨课和交流群的思维碰撞,共同疏导微信群中的烦躁情绪……我们共同经历了“最美丽的 OO”课程,克服了“高原课程”所带来的“高原期”,真正做到了从哪里跌倒,就从哪里跑起来,拥有了扎实的学科素养和百折不挠的钢铁意志。
OO 虽然没有最终的期末考试,但处处充满对我们学习能力的考察和人生的考验。如何平衡好学习和生活,按时精准完成完成每一次的作业,无疑极富挑战性。虽然不是每一个人都能成为 OO 课程的英雄,但大家都是默默为 OO 课程添砖加瓦、付出心血和汗水的战士。每一次闪耀着思维光芒的课程与研讨,每一次看似波澜不惊实则暗流涌动的上机,每一次精心设计和架构,每一次认真完成的有效作业,每一次精益求精的细致优化,每一次刻苦求索的 bug 修复,都是我们 OO 课程成长之旅的重要组成部分。在这样一种近乎残忍的课程修炼中,每一个人都最终成为了自己的英雄,拥有了属于自己的光明未来——无论是专业技能方面还是人生发展方面。