正向建模与开发
正向建模是指从需求出发,通过一系列的设计模型逐步细化,最终生成代码的过程。开发是将设计模型转化为实际软件的过程,包含编码、测试、部署、维护等阶段。
在本单元中,我们使用UML
进行系统设计:首先阅读指导书,形成用例图,从而更为清晰地理解记录需求;接着建立架构,确定主要模块、类及其关系,形成粗略的类图;然后细化设计,形成详细的类图、顺序图及顺序图,定义具体的方法,交互及状态变化;最后便是编写java
代码,在实现的过程也会对设计进行增补。
架构设计
本单元的架构在迭代中没有大的修改,整体过程是先画出UML
类图(如下图),然后再在编写程序的时候进行增补(hw13时几乎没有大的改动,但在hw14和hw15时初始类图还是忽略了较多细节)
在进行架构设计时,按照初读的思路对指导书中的BookShelf
,AppointmentOffice
,BorrowAndReturnOffice
等功能场所均建立了类,清晰地定义了类的功能和职责,使得系统易于管理。此外,出于第三单元控制时间复杂度的惯性,在设计时使用了HashMap
,HashSet
,LinkedList
等数据结构以存储管理数据,提高系统性能和效率。
而各类操作均集中于Main
类中,在研讨课时意识到了这样做的弊端,首先是类的耦合度较高,一但修改一个类的方法,相关类都需要调整;然后是类之间的关系较为复杂,维护成本较高;还有容器的安全问题,由于书本需要传递,类之间的交互均直接传递容器参数并调用方法,极为不便。但由于当时不想进行重构,于是随着后续的迭代Main
类更为臃肿,也越发感到暴露的问题。
架构设计思维演进
-
第一单元时面对作业完全没有头绪,直到见到学长的博客,完全照搬了学长的架构通过评测。主要建立了递归下降和层次化设计思想,而这一点在之后的迭代中被反复强化。编写完成后有一种很神奇的感觉,构造了递归下降的结构后,在最小单元编写
toString()
后,最后竟然完成了表达式的简化。 -
第二单元中领悟到多线程设计模式,并将设计模式用于架构。编写代码时采用了生产者与消费者模式,借助托盘控制对线程共享对象的操作。此外,初步感知到多线程协同,同步块与锁设置的考量,利用
synchronized(obj)
、读写锁等及逆行精细化的控制。 -
第三单元中学习了
JML
规格,由于大致的架构已经给出,主要感受到即使有规格化设计,实现的过程中对数据结构和算法的选择依然较为灵活,同时对一些java
容器的内部源码有了了解,对时间复杂度有了更深刻的体会。 -
第四单元中训练了正向建模和开发,并从
UML
对象的角度去了解类属性、方法、类间关系。锻炼了独立设计的能力。
测试思维演进
了解了测试的分类,例如白盒测试与黑盒测试,以及开发过程中的单元测试、功能测试、集成测试、压力测试和回归测试的概念。以及测试能显示bug的存在但不能证明bug不存在。
事实上测试的实践仍然停留在跑样例,手捏数据以及蹭DPO评测机上(惭愧),此外在第三单元学会了一点通过Junit
测试的方法,划定各种情况后通过较大数据量的随机生成来测试类中方法的正确性。
课程收获
通过这学期的学习,在实践中深刻理解面向对象多态、封装、继承的特点以及使用时的优雅与便捷。并意识到复杂度与性能之间的平衡,以及架构的重要性。在理论课学习到的SOLID原则,设计模式也使得程序更清晰和安全。回顾过去,从层次化设计意识到架构的重要性,到接触多线程与设计模式,到确保接近绝对正确的jml规格和junit测试以及时间的意义,再到UML正向建模,课程组的严谨性与系统性体现得淋漓尽致。