buaa oo unit4 博客

励思媛-22371445 学生 2024-06-13 16:24:14

buaa oo unit4 博客

正向建模与开发

正向建模

正向建模是指从需求或设计文档出发,进行程序设计和建模,再进行具体的代码编写。

正向建模是一种自上而下的开发方式,通过模型语言表现出更好的可读性、准确性,减少因上下游程序员交流不当带来的编程失误。但正向建模也是一种相对重度的开发方式,设计过程周期长,且与逆向建模相比,每次需求改变都需要因为局部问题而把整个设计推倒重来,无法灵活应对需求的改变和迭代。

UML的正向建模

UML (Unified Modeling Language)为面向对象软件设计提供统一的、标准的、可视化的建模语言。UML模型图常见的有类图、顺序图、状态图、协作图、活动图、用例图等等,在本单元中我们主要使用类图、顺序图、状态图来进行建模与设计。

类图是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。类图描述一类的属性和操作,也描述不同类之间的关联、协作、约束,可以直接映射到面向对象的语言。

顺序图展现对象之间的动态合作关系,强调对象发送消息的顺序,同时显示对象之间的交互。

状态图用于描述对象具有的各种状态、状态之间的转换过程以及触发状态转换的各种事件和条件。UML状态图描述了一个状态机,适用于动态特性建模。

架构设计

类图

屏幕截图 2024-06-13 102607

顺序图

屏幕截图 2024-06-13 102631

状态图

屏幕截图 2024-06-13 102622

代码设计与UML模型设计的追踪关系

首先我设计UML状态图,明确了书籍可能的状态以及状态转移条件,再通过书籍的状态大致划分各类及其功能,与最终代码类的划分一一对应。

再设计UML类图,我细分了各类的具体功能职责,确定了整体的静态架构,与最终代码设计的各类方法、属性一一对应。

再通过设计UML顺序图,捋清了某一具体操作的整个流程,各步骤需要做什么、需要由哪个类来做。比如预约书这一请求就需要从Student->Library->AppOffice一步步执行。顺序图体现出各类的紧密合作,与最终代码处理某一请求的流程一一对应。

架构设计思维的演进

unit1:层次化设计思维

unit1主要是表达式因子分解,采用递归下降的思维,把表达式分解为项,项再分解为变量、数字、幂次等各因子,各因子看似全不相关,但又可以在行为级上抽象,从而提取出因子这一接口。这一单元主要训练了我们自顶向下的层次化设计思维,深层次的迭代、互相包含也是编程、debug的重难点。

unit2:多线程并发设计思维

unit2以操纵电梯为背景,需要我们考虑多线程在时序上的交互、多线程随机执行顺序的干扰。这一单元主要训练了我们多线程并发的设计思维,多线程对临界资源的访问是设计和编码的重难点,synchronized同步锁的合理使用极为重要。

unit3:JML规格设计思维

unit3以社交网络为背景,通过大篇幅的JML规格描述,约束我们的各方法代码。从一开始对繁杂的JML规格的不理解,到逐渐体会到这种准确、统一的规格描述的优势,这一单元培养了我们JML规格设计思维。同时,这一单元涉及图的算法,我接触到图的精妙数据结构和算法。

unit4:UML正向建模设计思维

unit4以图书馆系统为背景,我们在具体编程前,先分析需求和设计文档,通过UML进行建模,在编程前先对整体架构有了很好的把握,编程时就能行云流水。这一单元主要锻炼了我们利用UML进行正向建模的设计思维,很好地磨练了我们的整体架构设计思维。

测试思维的演进

unit1:边界数据和特殊数据

第一单元由于我并没有评测机,只能手动捏造边界数据、特殊数据进行测试。第一单元大都是由深浅拷贝、表达式化简带来的bug,因此边界数据进行测试还是很有效的方式。

unit2:评测机大量数据点测试

第二单元测试的最大问题是,由于多线程执行顺序的不确定性,同组测试数据可能运行正确也可能运行错误,bug无法重现。我采用评测机大量数据点测试+同组数据多次测试的方式,一般同组数据运行十次可以再现bug,评测机500组数据都跑通才能说明基本没有bug。自这一单元起,评测机和压力测试的重要性逐渐凸显出来。

unit3:junit测试与压力测试

第三单元要求我们编写junit单元测试,我也逐渐体会到junit的测试作用,针对某些较容易出错的方法进行单元测试,能够保证该方法完全符合JML规格要求,从而保证该方法的正确性。由于unit3涉及很多图的算法问题,因此压力测试也必不可少,强测出现的问题也大都是压力测试下的ctle。

unit4:评测机

unit4主要是开馆闭馆整理容易出现送书的顺序问题,通过评测机进行测试即可发现问题。

课程收获

回顾过去,还是很感慨面向对象这一大课重课就这样结束了,我居然活着过来了

正如荣文戈老师在课上说的,oo这门课培养的绝不仅是我们编程的能力、测试和debug的能力、对java这一语言的掌握度,oo锻炼的更多是我们的架构设计思维。

我们面对大一时就曾困扰我们的迭代、层次化设计,我们面对从未接触过的多线程并发问题,我们面对庞大的JML规格描述,我们面对无从下手的UML建模语言,在一个个陌生的情境中,我们逐渐形成了自己的架构设计思维和习惯,对于多线程、图这些复杂的问题,或许我们在oo课上的学习只是匆忙一瞥、浅尝辄止,但却为我们今后深入这方面的研究奠定了思维的基础。

在oo课上,我也意识到了评测机、代码测试的重要性,并锻炼了写简单评测机的能力。从上学期对评测机完全不了解、写完代码就听天由命的状态,到如今能自己测试代码、提交到课程评测网站时的胸有成竹,我离成为一个合格的程序员越来越近。

oo课很苦很累,但我真的收获了很多。感恩助教,感恩同学,感恩老师,也感恩自己,在高压的训练下,我掌握了很多架构设计、编程、测试、debug的新能力。

这世间唯一让我信奉的真理,就是这一切终将会过去。

现在的我对克服未来程序员道路上的困难充满了信心。

...全文
78 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

301

社区成员

发帖
与我相关
我的任务
社区描述
2023年北航面向对象设计与构造
学习 高校
社区管理员
  • YannaZhang
  • CajZella
  • C_ecelia
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧