302
社区成员




正向建模是一种用于描述和分析系统或过程的建模方法。它基于系统的目标和行为,以及各个组成部分之间的相互作用关系,从而生成系统的模型。在正向建模中,建模过程从系统的高层目标出发,逐步细化到具体的组成部分和其行为。这种方法着重于描述系统的结构和功能,以及各个组件之间的交互关系。
在本单元作业中,体现在书写代码前,先根据业务功能和潜在拓展大致设计UML类图、状态图和顺序图对图书馆系统进行建模,然后再具体书写代码和完善UML图。
实现单独的Book
类,有利于存储图书借还期限、捐献书籍人、被借还次数等信息。实现单独的Student
类,有利于存储信用积分、持有书籍、预约书籍等信息。将每个部门看作一个类,体现了图书馆不同部门的之间的分离。具体地,借还处对应BorrowOffice
,预约处对应OrderOffice
,图书漂流角对应DriftCorner
,书架对应BookShelf
,DriftCorner
和BookShelf
都可以看作是增加书籍、移除书籍、查询书籍的容器,因此都继承自BookContainer
。比较独特的一点是,我为预约单独实现了一个类Appointment
,本意是可以存储预约信息方便判断预约失效,但事后经过思考后发现可以就在Book
类里实现,因此意义不大。
reture
之外的元素name
都不为空,无重名类,无循环继承和重复继承,无接口。State
一一对应。Trigger
与Guard
检验:涉及到状态转移的方法都无guard
,因此在状态图中全为trigger
,无guard
,并且与程序中有@Trigger
注解的方法一一对应。(偷了一点小懒)
orderNewBook
为起始消息和以getOrderedBook
为结束消息的消息路径。message
对应:与程序中有@SendMessage
注解的方法一一对应,且涉及到的方法均为public
。Library
、BorrowOffice
和OrderOffice
之间均有关联关系。第一单元主要是有关递归下降的方法,其中语法树主要涉及到了Expr
、Term
和Factor
,构成了树的每一层。在每次写代码之前,我都会根据作业要求画出语法树,特别是涉及到表达式因子、指数因子和自定义函数因子时有循环下降的体现,还需要将Factor
再具体分为子类,因此也体现了抽象的思维。
第二单元主要训练多线程之间同步的实现。这一单元其实我并没有体会到太多架构的思维,因为大多数时间都用来实现look
算法,寻求理想电梯调度算法以及解决经常出现的轮询和死锁问题去了。最后还是没能解决死锁问题,但认真学了操作系统后对死锁的理解还是有了提升。
第三单元主要是针对JML的训练。这单元也没有太多架构思想的体现,因为大部分代码都是对应着JML写的,这单元主要是有关网络增删和查询算法的优化,有利于降低时间复杂度。其中利用了如DFS
、BFS
以及并查集等算法,在掌握这些算法之后感觉还是收获了很多。
第四单元主要是针对UML的训练。这单元基本上都围绕着架构正向建模,在每次写作业之前其实也不一定把UML图全部给画出来,只需要大概画个草图体现出图书馆各个部门的职责和关系,写完代码后再对UML图进行完善就行了。这单元并没未涉及太多算法的优化,各自的实现也是非常自由的,因此难度不大。
主要构造一些边缘数据,利用最后结果为0,单独的正负数,括号在前在后等。还构造了一些复杂数据,如自定义函数嵌套、指数函数嵌套、括号嵌套以及负号问题等。
主要构造一些卡时间的数据,例如选择在同一时间到达多个乘客,同一时间reset
多部电梯和reset
电梯载客量最小和时间最大,检验电梯调度算法的可行性。
利用Junit进行根据JML的后置条件、不变量和可变范围进行白盒测试,在构造数据点时采用多次随机的方法。当然,有的时候要根据方法采取随机生成数据和构造特殊数据结合的方法。
感谢DPO!
OO课程都围绕着面向对象进行,这其中强调了面向对象的三大特点:多态、封装和继承,而这也是面向对象建模所要实现的目标。从oopre到OO正课四个单元的训练,我已逐渐从面向过程转变到了面向对象,也体会到了面向对象在解决工程问题上的可行性和优势。
除此之外,我学会了诸多算法,例如递归下降算法、look
算法、并查集算法等,还学会了如何提高代码的可读性,还学会了如何在面对大量数据点时迅速缩小有效数据的范围并找到对应的bug,还学会了如何通过JML抽象出方法的功能以及迅速阅读JML的能力,最重要的是,学会了在写代码之前先认真思考建模。
学习OO的过程是痛并快乐着的,痛在无数个找寻bug的不眠夜,痛在自信慢慢提交但最后却泛红的强测界面,痛在互测时自己单方面的被hack,痛在每周六晚死亡的ddl。但幸福的地方在于,走过来一个学期再回顾这段经历,它带给我的是坚韧,是抗压能力,是能力的塑造。