301
社区成员
发帖
与我相关
我的任务
分享正向建模与开发
正向建模是一种用于描述和分析系统或过程的建模方法,即从需求出发,设计系统的各个模块及其相互关系,从而生成系统模型的过程。在第四单元的学习中,我体会了通过画UML模型图来进行正向化建模设计,由于我在平时有画草图的习惯,所以我在本单元采用的是草图 ->UML模型图->代码的思路完成作业,这也是我第一次较为系统的进行正向化设计的实践。在具体实现过程中,由于对UML的不熟悉,很多在写代码之前的设计或者实现在具体写代码的时候并不适用,这就需要在写代码的时候对UML进行进一步完善,例如在第十三次作业中,由于只画了UML类图,类图体现不出各种事件的解决过程,所以在具体写代码的时候,需要对UML类图进行修改。总体而言,在本单元中我还是充分体会到了正向建模和开发的合理和必要,不仅对编写代码时有规范,在后续正确性检验时也有不小的帮助。
第四单元架构设计

第四单元的架构比较简单,除了将作业中的借还处,预约处等具体抽象为一个类,还有Library这个用来联系各个类的处理类,所有指令都是直接通过Library中的方法调用其他类中的方法。在本单元中没有对性能的要求,我在这三次作业中的代码主要目标是实现高内聚低耦合。高内聚体现在Library类中都有其他类的具体实例对象,并且诸如借还处这样的类采用了单例模式,所用指令的处理都是对Library类中的所有实例对象进行处理。低耦合体现在不同指令的处理没有耦合在一起,而是分开处理,在Library中体现为每一种请求都有一个特定的方法处理,从而进一步调用实例对象中的方法。
本单元的代码和UML的追踪关系而言,最后的效果上,各类中的主要增删改查方法,如query等与设计中的保持基本一致,主要的存储的对象的属性页保持一致,但是存储时使用的数据结构有变化。同时,增加了一些辅助属性,如bdc类中的grade属性,是一个静态变量,用于记录所有被捐赠书的等级,方便在图书整理的时候查询书的等级。
架构设计思维的演进
第一单元:表达式展开
第一单元表达式展开让我狠狠地理解了类之间的继承和实现接口之间的关系。学习相关的递归下降方法后,对因子,项,表达式,单项式,多项式类谁继承谁,已经谁应该放在谁的属性等方面思考了很多,也参考了很多别人的架构思路,从刚开始的重复调用,方法的耦合度很高到后面模块化处理,先解析再计算的思路让整体代码的可读性很高,这一单元还对深克隆浅克隆问题有了更深刻的认识。在第二次作业中我进行了一次重构,将多项式单项式的计算类引入,计算后的深浅克隆出现问题,最后将单项式类和多项式类编写深克隆方法解决问题,总体而言,第一单元还是出现了一些bug,而且在性能测试上比较一般,但在最后的代码完成度和可读性和拓展性还不错。
第二单元:多线程电梯
第二单元的多线程给我造成了很大困扰,从零开始接触多线程代码编写,在一开始synchorized关键字的运用都让我很费力。第二单元出现了很多死锁和轮询问题,都是锁的释放和获取控制并不正确。第二单元我做过整体的一次重构,由于第二单元的第二次作业开始,分配线程和电梯线程之间的共享对象很多,我将隐式锁换乘了显示锁,重新理清生产消费关系,对同步关系的控制更好。总体而言第二单元我做的并不是很好,最后代码很可能还会存在死锁问题,但是本地经过很多测试也无法复现,在整体代码的性能测试上并不好,但是经过一单元的学习,让我对多线程编程有了更深的理解,如何处理各线程之间的同步关系也让我收获颇丰。
第三单元:JML规格化设计
第三单元引入JML规格,按照JML规格进行相应的代码设计,这一单元的难点在于 算法,如何采用更高效的算法实现JML的规格,JML规格的方法大多是复杂度比较高的暴力方法,采用算法优化之后,需要通过相应规格化的测试判断该方法是否满足JML规格,Junit测试很好地完成了问题。本单元主要采用策略类的模式,将维护的数据结构和维护方法封装在一个类中,在整个社交网络中该类的实例化对象,进行相应的操作时就会调用策略类的维护方法,整体而言架构设计比较简单,我在本单元出现的bug也比较少,通过本单元首先对jml这类规格化设计有了初步了解,同时对自己的算法知识也是温习了一遍。
第四单元:UML正向建模和设计
这一单元在代码的实现上并不困难,重点在于对UML模型图的掌握,体会一次UML正向设计是作业的重点,我在完成之后确实发现UML正向设计确实让编写代码的整体更加条理,而不像之前直接上手写代码可能会出现考虑不周而导致重构的现象,而是需要我们在UML模型图中合理思考一下我们需要如何进行分工,分配好每一个类具体的功能。然后,在实现具体代码的过程中,再去不断地优化我们的架构设计,实现相辅相成。本单元也并没有实现什么bug,没有遇到什么难点。
测试思维的演进
在oo刚开始的过程中,我对代码的测试仅停留在随机数据的测试,用大量的随机数据测试的强度并不一定高还需要进行更多专门的测试。让我对测试有进一步认知的是第三单元,Junit测试可以进行代码的方法测试,如果在编写比较大的工程时,可以和编写代码同时进行,保证各个核心方法执行的正确性;编写完代码就可以进行功能测试,功能测试就是按照需求说明书的各个功能编写相应的测试数据进行测试,功能测试数据的要求就是代码正确执行相应功能,测试数据并不需要很强,也不要求多功能组合进行。后续需要经过随机测试,即多功能混合进行测试,检验程序能否在多功能交替执行时出现问题。最后是压力测试,即编写边界测试数据,检验程序的时间复杂度和空间复杂度能否符合要求。在实际作业过程中,我主要是采用了随机测试和压力测试结合的方法,由于作业的代码量并不大,功能也并不多,单元测试并未采用。在数据生成器的编写方面也要注意数据的合理性,如果要随机测试就需要注意数据的覆盖范围,本学期编写过几次数据生成器,通过数据生成器的编写也让我对测试有了更深的了解。
课程收获
通过oopre和oo两个学期的学习,让我这种面向对象的设计方法有很深的感悟。oo课程学习的收获是巨大的,一方面让我在代码编写,建模设计,测试思路上全方面学习到很多知识,另一方面通过和其他同学的交流,了解他人的架构实现,也让我思路更加开阔。从刚接触java语言学习语法,写作业时都是先考虑我会怎么写,到后面拿到指导书我能系统地分析需求,先从宏观角度建模设计,最后在编写代码时做到我该怎么写。虽然oo也给了我很大压力,但是伴随了我大二一整年的oo对我的提升是巨大的。
最后感谢课程组、老师和助教以及各位同学的帮助!!!