301
社区成员
发帖
与我相关
我的任务
分享在本单元第一次中,我真正采取了 “正向建模” 的开发过程,即先对根据题目需求,设计项目架构,并绘制初步的 UML 图。在这一阶段,我确定了整个单元项目的主体结构,即图书馆、书籍存储、用户这样三位一体的布局。
设计完成后,整个项目的结构便跃然纸上,写起来也比较的轻松。只有一点:编写代码的时候会对原有设计进行修改,我忘记了实时同步,导致最终花了大量的时间进行 UML 类图的更新。
正向建模便也是这样的一个过程:先设计建模,再开发修改。对于大型项目,有助于我们对代码进行良好的规划。
本单元围绕四个核心部件进行:图书馆(LibraryCore),书籍存储(BookStorage),用户(User),预约订单(Order)进行。
简化类图如下(太复杂也没人看,不如简化一下):

用户需要维护一下自己借的书,以及所借书籍的相关状态,并提供检查方法,已确定用户层面是否满足借阅等需求。
预约订单全部由预约处(OrderOffice)控制,在我的设计中用户并没有维护自己预约的书,在第三次作业中导致了一些麻烦,但不多,毕竟 设计的时候只要管架构,实现起来要考虑的事情就多了 。
同时,图书馆(LibraryCore)提供了一系列的 on* 方法,用于相应不同的请求,并在主方法中通过表驱动简化代码,我觉得还是不错的。

第一单元模块化编程初见,第二单元设计模式与多线程,第三单元形式化描述,第四单元架构先行建模。四个单元侧重不同的主题,教给我们建模的方法与设计的思路。代码编写可能倒不是那么主要,重要的是设计,这将有助于我们去开发更大型的项目,去进行更多的尝试。
第一单元,初入 OO,学习了递归下降这一极其重要的算法思想,我相信它一定会很有用。这一单元的架构设计比较简单,比较清晰,即使里面有嵌套,但可以围绕文法定义来进行。
我认为这一单元给我留下的最深刻的印象便是“不可变对象”的重要性,它也将在第二单元发挥作用。
多线程确实难搞啊,头都要搞大了,纵使不是第一次接触多线程(进程),也好好吃了一壶。对于电梯来说,我将线程与对象分离,也即将动作与状态分离,极大地辅助了整体的设计。与此同时,不可变对象的引入,也保障了线程的安全。
这一单元极大地提升了我多线程编程的能力,虽然代码远没有设计地如此优雅,最终也取得了一个不错的成绩。
Jml 之流确实之前完全没有接触,一开始也觉得怪费劲的,虽然有一些不愉快的地方,但整体也体会到了“形式化”、“规范化”的意义。
同时,这一单元我也体会到了标准与实现相分离的特点,我们需要在满足规范约束的前提下尽可能去优化算法,这也是一个不小的考验。
经验教训:简单也行,困难也行,时刻不能放松警惕,谨防阴沟翻船。
这次作业,“先设计,再实现”的理念落实得比较好,我也切实体会到了它的好处(仅限于这次需求不是很复杂,我不清楚当项目变得再复杂一些,这样的好处还能不能保持)。
当然了,建议测评机在检查类图时,可以一次性多反馈几条错误。
对于我来说,严格而言,并不能算 “演进”,每个单元有各自的特色,我也采取了不完全相同的测试策略
第一单元,适合于对拍,因为那两个答案相减,可以比较轻松的判断是否一致。因此我主要采取这样的方式构建测评机。同时,我忽视了答案的文法检查,好在没出大岔子。第一单元比较适合作单元测试,因为里面有一些关键方法,有着较为明确的输入、输出。
第二单元,适合于测评机检查,因为测评机维护电梯、乘客状态比较容易。同时,多线程测评的交互也是一个比较有趣的地方。这一单元适合黑盒测试,当然电梯的运行策略和调度策略可以考虑单元测试,但是总感觉怪麻烦的,似乎有点得不偿失。
第三单元,适合于单元测试,因为有详细的约束,可以很方便地构建测试与检验。但是数据生成又是一个难题,题目也要求我们去进行某些方法的单元测试,这里就可以感觉到数据生成对其的重要意义,还是比较难搞的。
第四单元,适合于单元测试,和测评机黑盒测试。针对图书馆的相关操作,可以构建测试用例,同时,也可以针对整体进行用例的测试。
我发现我还是习惯于传统的基于测评机的测试,测评机的代码比作业代码都要多好多,还学了好多稀奇古怪的东西,也算是课程的红利?
除了对象,其他收获还真不少。 比如对 Java 和 Python 的熟练度上升很多,也学会了模块化编程的重要思想。我能够直面多线程的复杂情景,也能够了解形式化验证的相关内容。UML 既给了我一种建模的手段,也是一种展现思路的方式。
对于面向对象来说,Java 的设计真的很清晰明了,没有那么多逼仄的东西,很多情况下也符合常理,总体体验还是比较舒服的。
作为连接 CO 和 OS 的一门课,面向对象是最上层的,但处处也都有其影子,譬如 OS 的设备表那块,绝对有面向对象的设计理念蕴含其中。
因为我的测评机有图形化界面,我也更能够体会到面向对象在实际开发中的重要应用,能够充实我的学习生活。
好耶!