OO第四单元UML建模总结

高揄扬-21373016 学生 2023-06-20 19:45:54

第四单元总结

21373016 高揄扬

正向建模与开发

本单元我们的主要任务就是建模开发一个图书馆,图书馆的建模个人在完成作业的过程中,还是觉得较为复杂的。而如何梳理出一个清晰的结构,让自己的码力能够有的放矢,我觉得一个很重要的步骤就是正向建模。

我完成本单元的代码之前,干的最重要的一件事情就是构建模型图,在模型图里,我会首先罗列需要创建哪些类,这些类之间会有哪一些交互。完成初稿之后思考哪里可以简化,怎么样改进可以降低耦合度,怎么修改自己的设计来应对接下来几次可能会出现的迭代。在上述设计过程中,个人遇到的一个比较大的问题就在于怎么快速将需求,抽象化产生模型,建立架构,并且厘清其中各类之间的关系,对于这一点我觉得自己较为欠缺的应该是架构设计相关的整体性思维。

而在建模画图之后,实现代码个人觉得就较为轻松了。

除此以外,正向建模给我带来的另一个较大的好处就在于方便修改,我可以先在上一单元的模型上进行修改,然后再将相应的修改整合进入代码实现中,这样的操作有效减少了我在代码迭代过程中的工作量。

通过本单元的正向建模,让我对于正向建模有了更深的体会。正向建模在我看来首先能够展示出一个清晰明了的具象架构,架构的清晰呈现可以有效的帮助我们完成最后的代码实现。其次,正向建模的思想我认为也体现了一种抽象思维的能力,他将客户所提供的需求,抽象为模型,更进一步延伸出模型中的类、方法等等,我以为是一种重要的针对需求进行分析的方法,可以有效的帮助实现软件的设计。

本单元架构设计

类图

img

状态图

img

顺序图

img

本单元中我的架构是自上而下设计的,最顶层是MainProcessor类,他负责统领全局,管理各个图书馆,每个图书馆都各置一个Processor,负责管理图书馆的图书,安排各个管理员,与各个管理员进行交互等等。这种结构下,我认为最大的优势就是,我可以让下层的Processor只提供接口给上层的MainProcessor,MainProcessor只需要调用接口传指令给Processor即可,从而降低耦合度。在第二层也是同理,Processor只需负责调用各个管理员暴露给他的接口就可以实现相应的功能。比如输入一条借书指令,只需经历MainProcessor识别指令,MainProcessor下发到相应图书馆的Processor,Processor 再下发到借还管理员或者自助机器即可。通过这样的架构设计,个人有效的控制了自己的整体架构实现的耦合度与复杂度。

个人最终实现的代码结构其实也是与UML所建模型相吻合的,不过中间往往会有一些小的修改,因为会在实现的过程中发现模型存在不完善的或者需要调整的地方。但总体而言,个人的代码实现会跟随UML建立的模型走,以模型为摹本。

架构设计思维演进

在我看来自己四个单元作业中,在架构设计方面,主要有了两个方面的进步,其一是降低耦合度,其二是提高可重用性和可扩展性,其三是整体性思维。

耦合度:个人的第一单元作业的程序整体架构耦合度是相对而言偏高的,体现在IDEA对程序分析时所提供的圈复杂度等指标上,甚至会出现循环调用的现象,比如A调用B的某一方法,B再在A中调用某相应方法,在不同类的方法之间进行递归,当时印象比较深的两次熬夜DEBUG经历都是来源于此,而在经历了四个单元的OO知识学习后,我学会了如何有效控制自己的耦合度,在第四单元之中,我就选择了使用MainProcessor->Processor->(Library, Administrator等)的架构,下层类直接提供接口供上层类使用,而不会出现循环调用等相关情况,有效的降低了我的架构设计的耦合度。

提高可重用性和可扩展性:个人的第一单元是相较而言可重用性和可扩展性是最差的,三次迭代作业,个人重构了两次,主要原因就在于实现功能时没有留出足够的供迭代作业重用的空间,往往迭代时,需要额外加入比较多的繁琐判断等操作,在屎山上面堆屎山。因此在2、3、4三个单元的编写中个人会下意识的预留出所编写程序的可供扩展的空间。具体体现在比如接口的使用,在第一单元第三次作业中,我在最后的反思总结中提出了可以为因子类抽象出接口,每个接口都支持加、是否相等判断,乘法合并三个操作,只要实现这三个操作那么就可以加入到我的表达式中,不论是三角函数,还是幂指数。在第四单元中,我通过Processor类控制图书馆中各成员的行为,有任何操作直接调用相应成员向外部提供的接口进行,也有效地提高了自己的代码可重用性与可扩展性。

整体性思维:整体性思维我觉得主要体现在第四单元,第四单元所要求实现的图书馆较为复杂,如果开局就直接上手编写代码往往会较为困难,因此我会选择在编写代码前抽象出需求所要求实现出的模型,自上而下分析问题,一步一步从整体模型到类的构建,再到更细的方法。

测试思维演进

个人在OO这四个单元中,对于测试的思考主要可以分为两个阶段,第一阶段,怎么测试,第二阶段,怎么完善测试。

在第一阶段,我主要忙活的是如何搭建一台自己的评测机,编写测试数据生成器,编写python测试脚本,然后编写一个输出结果比对器,测试脚本较为简单,难度主要集中在数据生成器上,在初级阶段,我为了避免数据生成器的复杂性,往往会采用随机生成的方式,随机搭配大数据测试,以此希望获得一个较为强的测试结果。

而在第二阶段,个人则着眼于如何让自己的数据生成器更强,测试的范围更完善,在这一阶段,我开始学着使用常量池,在第三单元编写具有针对特定指令进行强测功能的数据生成器。通过这些步骤,我逐渐学会如何产生更加强的测试数据,如何更有针对性的程序,进而确保自己的代码实现功能的正确性,因为也在三四单元保持了全对的战绩。

个人课程收获

个人认为自己在OO课程中,获得的收获主要可以分为两个方面,其一是知识层面,其二是思想层面。

在知识层面,我学习到的最大的收获就是多线程编程,多线程在这个学期的OO课与OS课中都有涉及,在OS课程中,更多的是停留在理论层次,而在OO课程中,则实操了电梯单元,亲自完成了多线程的程序设计。在电梯单元我个人所取得的成绩其实并不好,几乎占了我全部扣分的2/3,但是我认为我的这个单元仍然是成功的,因为通过这个单元的学习,我学会了如何利用lock,synchronrized,实现临界区的互斥访问,从最开始对着上机实验课的代码懵懂的模仿,到最后,能够自己设计完成复杂的临界区交互,写成自己的影子电梯,并且在很多组数据上取得较为理想的成绩,对我而言是非常有成就感的。

除了多线程编程,另外两大知识收获,一个是JML规格语言,通过JML规格语言,我第一次了解到如何使用科学严谨的方法描述方法、函数实现的功能,既懂得如何看规格写方法,也学会针对需求写规格,对于规格与实现分离的思想也有所涉及。第二是UML建模,UML模型图,让我对于如何针对需求抽象出模型,再根据模型实现代码有了更深刻的认知,一方面,个人尝试了根据图书馆所给出的需求先建立自己的模型,完成类及类之间的关系的构建,然后再上手进行具体的代码编写。通过建立模型再编写代码这一步骤,个人在实际的代码编写过程中会感觉更加轻松,更有目标去着手,效率也会大大提高。

在设计思想层面,我对于面向对象的设计思想也有了更为深刻的认知,尤其是与大一C语言编程相比。与C语言不通,在面向对象课程的学习过程中,我们往往会将数据与方法两者抽象为对象,将功能的实现封装进入对象之中,交由对象完成操作,这一点起初令我觉得惊奇,但是慢慢就适应、接受然后理解了这样编程的优势所在。面向对象编程让原先静态的数据对象变成了执行者,通过调用数据对象去执行,屏蔽了很大程度上代码实现的复杂性,就比如说C语言要求一个数组的最大值,要在最外面写一个for循环,而在面向对象中,我可以实现一个数组类,在里面实现一个for循环,在外面看起来我就只是调用了一个方法而已,通过这样的设计,降低了代码的复杂度,同时提高了代码的可读性,可重用性,我觉得这就是一定意义上面向对象编程的优势所在。

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

443

社区成员

发帖
与我相关
我的任务
社区描述
2023年北京航空航天大学《面向对象设计与构造》课程博客
java 高校 北京·海淀区
社区管理员
  • 被Taylor淹没的一条鱼
  • 0逝者如斯夫0
  • Mr.Lin30
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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