301
社区成员
发帖
与我相关
我的任务
分享正向建模是指从需求或设计文档出发,进行程序设计和建模,再进行具体的代码编写。
正向建模是一种自上而下的开发方式,通过模型语言表现出更好的可读性、准确性,减少因上下游程序员交流不当带来的编程失误。但正向建模也是一种相对重度的开发方式,设计过程周期长,且与逆向建模相比,每次需求改变都需要因为局部问题而把整个设计推倒重来,无法灵活应对需求的改变和迭代。
UML (Unified Modeling Language)为面向对象软件设计提供统一的、标准的、可视化的建模语言。UML模型图常见的有类图、顺序图、状态图、协作图、活动图、用例图等等,在本单元中我们主要使用类图、顺序图、状态图来进行建模与设计。
类图是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。类图描述一类的属性和操作,也描述不同类之间的关联、协作、约束,可以直接映射到面向对象的语言。
顺序图展现对象之间的动态合作关系,强调对象发送消息的顺序,同时显示对象之间的交互。
状态图用于描述对象具有的各种状态、状态之间的转换过程以及触发状态转换的各种事件和条件。UML状态图描述了一个状态机,适用于动态特性建模。

首先我设计UML状态图,明确了书籍可能的状态以及状态转移条件,再通过书籍的状态大致划分各类及其功能,与最终代码类的划分一一对应。
再设计UML类图,我细分了各类的具体功能职责,确定了整体的静态架构,与最终代码设计的各类方法、属性一一对应。
再通过设计UML顺序图,捋清了某一具体操作的整个流程,各步骤需要做什么、需要由哪个类来做。比如预约书这一请求就需要从Student->Library->AppOffice一步步执行。顺序图体现出各类的紧密合作,与最终代码处理某一请求的流程一一对应。
unit1主要是表达式因子分解,采用递归下降的思维,把表达式分解为项,项再分解为变量、数字、幂次等各因子,各因子看似全不相关,但又可以在行为级上抽象,从而提取出因子这一接口。这一单元主要训练了我们自顶向下的层次化设计思维,深层次的迭代、互相包含也是编程、debug的重难点。
unit2以操纵电梯为背景,需要我们考虑多线程在时序上的交互、多线程随机执行顺序的干扰。这一单元主要训练了我们多线程并发的设计思维,多线程对临界资源的访问是设计和编码的重难点,synchronized同步锁的合理使用极为重要。
unit3以社交网络为背景,通过大篇幅的JML规格描述,约束我们的各方法代码。从一开始对繁杂的JML规格的不理解,到逐渐体会到这种准确、统一的规格描述的优势,这一单元培养了我们JML规格设计思维。同时,这一单元涉及图的算法,我接触到图的精妙数据结构和算法。
unit4以图书馆系统为背景,我们在具体编程前,先分析需求和设计文档,通过UML进行建模,在编程前先对整体架构有了很好的把握,编程时就能行云流水。这一单元主要锻炼了我们利用UML进行正向建模的设计思维,很好地磨练了我们的整体架构设计思维。
第一单元由于我并没有评测机,只能手动捏造边界数据、特殊数据进行测试。第一单元大都是由深浅拷贝、表达式化简带来的bug,因此边界数据进行测试还是很有效的方式。
第二单元测试的最大问题是,由于多线程执行顺序的不确定性,同组测试数据可能运行正确也可能运行错误,bug无法重现。我采用评测机大量数据点测试+同组数据多次测试的方式,一般同组数据运行十次可以再现bug,评测机500组数据都跑通才能说明基本没有bug。自这一单元起,评测机和压力测试的重要性逐渐凸显出来。
第三单元要求我们编写junit单元测试,我也逐渐体会到junit的测试作用,针对某些较容易出错的方法进行单元测试,能够保证该方法完全符合JML规格要求,从而保证该方法的正确性。由于unit3涉及很多图的算法问题,因此压力测试也必不可少,强测出现的问题也大都是压力测试下的ctle。
unit4主要是开馆闭馆整理容易出现送书的顺序问题,通过评测机进行测试即可发现问题。
回顾过去,还是很感慨面向对象这一大课重课就这样结束了,我居然活着过来了。
正如荣文戈老师在课上说的,oo这门课培养的绝不仅是我们编程的能力、测试和debug的能力、对java这一语言的掌握度,oo锻炼的更多是我们的架构设计思维。
我们面对大一时就曾困扰我们的迭代、层次化设计,我们面对从未接触过的多线程并发问题,我们面对庞大的JML规格描述,我们面对无从下手的UML建模语言,在一个个陌生的情境中,我们逐渐形成了自己的架构设计思维和习惯,对于多线程、图这些复杂的问题,或许我们在oo课上的学习只是匆忙一瞥、浅尝辄止,但却为我们今后深入这方面的研究奠定了思维的基础。
在oo课上,我也意识到了评测机、代码测试的重要性,并锻炼了写简单评测机的能力。从上学期对评测机完全不了解、写完代码就听天由命的状态,到如今能自己测试代码、提交到课程评测网站时的胸有成竹,我离成为一个合格的程序员越来越近。
oo课很苦很累,但我真的收获了很多。感恩助教,感恩同学,感恩老师,也感恩自己,在高压的训练下,我掌握了很多架构设计、编程、测试、debug的新能力。
这世间唯一让我信奉的真理,就是这一切终将会过去。
现在的我对克服未来程序员道路上的困难充满了信心。