BUAA_2022面向对象_第四单元总结

BUAA_2022面向对象_第四单元总结与课程总结

第一部分:第四单元总结

O、写在前面

​ 这一单元难度不大,但对细心和理解能力要求不低,在指导书和javadoc的提示下,实现接口方法。尽管不难,但是繁杂的查询关系,会直接导致设计时的不全面。最突出的体现就是,常常实现到一半发现有一个新的查询做不到,然后匆忙添加一个ArrayList或者HashMap来满足暂时的需求。这么做着实让自己难堪,但是,功夫不负有心人,察觉到这一点后,我每一次作业都会进行一次梳理,尤其是对涉及到的UML对象的各项属性,哪些有用哪些没用;各个查询指令对查询路径有什么要求,需要用什么数据结构来支持。可以说,磨刀不误砍柴工,这样的准备工作是十分值得的。

​ 下面是参考的Uml元素关系,可以说帮助很大,理解他们的关系是实现的重中之重:

一、架构设计

1、Manager设计

​ 在参考了往届学长的实现与反思后,我同样采用Manager的形式来抽象管理元素。即因为Uml一共有3中模型图,为了提高抽象层次,我将三种模型分别用三个Manager来管理,implement的方法也通过Manager来与各模型交互,这样一来,可以专注于模型的单一职责方法,中间的转换可以交给Manager来完成了。

2、元素的重实现

​ 除此之外,由于Uml元素具有分散性,这是其引用结构造成的,因此我重写了UmlClass、UmlInterface等元素,来让其具有“存储功能”,不需要在外部建立多个HashMap来让Class找到Attribute、Method等繁琐操作,否则会使实现更为错综复杂。

3、辅助数据结构类

​ 在做好类设计的准备工作后,还需要注重各个方法对查询的需求。利用HashMap来处理对应关系,是可行的,我的实现中也有诸多HashMap的身影,但对于“查询关键状态”等专注于某个对象,与前后多个对象之间的关系,HashMap就显得吃不消了。所以,建立辅助的数据结构很有必要。

​ 基于Graph的数据结构,我建立了两个Graph类,一个用于state关键状态的判断,一个用于check是否存在循环继承、重复继承的异常。而图中的dfs等算法就能派上用场了。

第二部分:架构设计思维及OO方法理解的演进

一、第一单元——迭代、设计的起源

​ 多项式可以说是对我来说最困难的一个单元,我是一个慢热型选手,在明确自己应该怎么做之前,往往是举步维艰的。在这一单元,对java的熟悉程度也不高,因此很多实现方式都有失优雅,总体来说不是非常满意。

​ 在刚开始OO的时候,我并没有意识到设计的重要性,在我心里,着手做往往比空想要来得实在。但是,现实的打击是巨大的。我在实现过程中,往往走着走着发现走不通了,但是时间又来不及,只能缝缝补补,最后也只能勉强过中测。

​ 第二次作业我明显注意了自己架构设计的习惯,现在回过头来看,多项式处理其实并不难,这是因为多项式的单一性,即规则固定,因此实现的方法往往是普适的。我渐渐开始放慢脚步,好好思考每一步的意图和实现方法,最后一次作业,终于能有自己的思想,加上自己对化简的思考。可以说,相较于第一次作业,是一个质的飞跃。

二、第二单元——多线程的主动探索

​ 第二单元是电梯单元,从单个电梯到多台电梯,到多台多功能电梯。这个单元可以说是较为自豪的一个单元了,这是因为全程是我自己从头到尾设计与维护的架构,虽然第一次还是无效作业······

​ 多线程的学习是困难的,但我庆幸自己十分主动。面向对象包含着多线程的思想,毕竟我们现实生活中,每个人都不是一座孤岛。在我心里,面向对象就是一种对现实世界的缩影,模仿人类的眼睛、耳朵和双手,每个对象都有着自己的特性,有着自己的职责、能力。多线程,是对“对象”的进一步抽象性提取:每个人都有自己的节奏。而线程合作,就是对应人与人之间的交流。

​ 在这个单元中,还学习了诸多设计模式,诸如生产者消费者模式、工厂模式、观察者模式等等,这些都是为“设计”提供更多高屋建瓴的启示。除此之外,最重要的还是多线程的实现,synchronized长久陪伴,也与我们产生了奇妙的感情。

三、第三单元——按图索骥的需求

​ 第三单元学习JML语言,是对前两单元形成的发散思维的规范。毕竟,没有规范就难以合作。

​ 经过一个单元的学习,我逐渐理解到,JML或许就是“对象”的语言。每一个对象的方法中,JML会规定:我需要什么,在我完成我的任务前你必须保证什么,你履行了你的承诺之后我能保证完成什么,我完成的成果有哪些,我改变了什么等等。这就如同一群高效率的理性人士的对话,极大提升了“对象”间相互理解的程度,降低了理解的门槛。

四、第四单元——面向对象的抽象面貌

​ 在第一单元,学习了对象是什么,如何构造对象,对象之间的关系可以是什么,并在此基础上实现了多项式的解析;在第二单元,学习了对象之间的交互,明了对象可以看做现实世界的抽象,多线程提高了这种抽象的现实意义,加深了对面向对象的理解;第三单元,我们学习了对象之间的语言JML,能够更好的利用一个普适工具,让人与人、对象与对象之间进行“对话”。第四单元,就是一个更高层次的总结,阐释了面向对象的抽象结构。

​ 我们一直在说抽象抽象,那到底什么是抽象,我想所有人心里都已经有一个答案,但是这个事情必须有一个统一的描述标准,否则它几乎只能成为每个人心中一闪而过的思绪,而难以交流与传播。Uml正是扮演一个这样的角色,用它的三大模型,来用“面向对象”的视角,刻画一个完整的系统。从静态的类图、到动态的顺序图、状态图,都是在极力描述这个系统的结构和发展规律。

​ 不得不说,编程确实是一种艺术,无处不体现着编程者博大的智慧,面向对象与其衍生的诸多知识,正是其淋漓尽致的体现。

第三部分:收获与建议

通过OO课程的学习,除了学会了面向对象思想方法,编程思维和习惯也得到了极大提升。除此之外,还学会了使用辅助工具如git、Idea插件、starUml等等,”欲要善其事,必先利其器“,这些经验在未来发展是极其重要的。

关于建议,我觉得OO课程的设计先进性毋庸置疑,任务量合适能够很好的促进思考与练习,但对有些时间紧迫的同学来说,往往没法全面的测试与设计测试程序,因此希望官方或许可以加强对“测试能力”的锻炼,也是能够提升同学的代码能力和debug能力的。

posted @ 2022-06-29 14:24  tsyhahaha  阅读(11)  评论(0编辑  收藏  举报