第四单元及OO课程总结

一、代码架构设计

前两次作业,我的设计的核心思想是一样的,我在第一次作业弄了一个图,第二次作业弄了三张图,查询是从顶层查询三个图

第三次作业,很遗憾,没能顺利完成。

图的结点设置,第一次作业是把UmlClass作为图的结点,第二次分别把UmlClass,UmlStateMachine,UmlInetracton对应的类作为三个图的结点

具体设计如下

第一次作业

 

 

 

第二次作业

 

 

从这两次的UML图中可以很清晰的看到,设计理念就是用三张图,在结点储存信息。

这两次作业有一个共同的问题,那就是结点和结点之间的关系,到底应该是结点内部的信息,还是属于图那一层结点之外的信息。

我选择的方式是在顶层储存关系,模仿索引的形式布局整个图

对于结点而言,每个结点储存我想要知道的信息,而不是把UML树挂在结点里面,所以需要在加入信息的时候进行缓存操作。

比如往类里面加入方法的时候,更新一些容器储存的东西,比如方法总ID,比如方法数目之类的东西,

对于顺序图,还有状态图来说,也是采取的同样的做法。

按需分配,需要查什么信息,我就在结点缓存什么信息。

那么为什么要在顶层储存各种信息呢,我的想法是,模仿索引表的形式

当需要查询的时候,我在顶层通过hashmap找到所有需要查询的结点的ID

然后根据这些结点读出的信息进行整合,最后得到我想要的信息。

换句话说,尽可能的让一个结点更加封闭,关系在顶层储存。

比如用id作为key,用一个hashset作为value,hashset里面储存所有继承关系里面的父类的id

这样子只要给定一个id,就可以知道所有父类的id,方便遍历

在我看来,这种做法更像是对UML整个图的一个还原,因为UML图里面,一眼看过去就是块和线条组成

在我的代码里面,把块弄成结点,把线条弄成hashmap的映射,可以比较贴合实际理解设计架构

这种做法最大的好处是便于处理,便于直观理解

但是坏处是更新扩展内容的时候,会很不方便。

总的来说,前两次作业并没有特别的复杂的方法,最难的是一个dfs,最复杂的根据可变参数查询符合条件方法数量

 

 

 

 

 

 

 

 

 

 

 

 

 可以看到,绝大多数方法复杂度都很低

只有两个涉及dfs的方法以及查询方法数量的方法比较复杂,其余的方法都很简单

涉及dfs的方法一个是查询所有继承接口,一个是查询后继状态数量。

两个做法大同小异,都是遍历图,难度不高。

除此之外,这两次抛出的异常绝大多数都是同名的异常,对于同名的处理,我采取的方式是用一个hashmap建立名字和出现次数的映射

每次查询之前,先读取hashmap的数值是不是1,再进行操作。

总的来说,两次作业不难,只要设计的稍微合理一点,不会出现很大的问题

二 、四个单元架构设计和OO理解演进

四个单元走下来,我的理解是

第一单元更加注重数据结构的使用,更偏重计算策略,偏重计算。

第一单元的多项式求导,主要是处理各种各样复杂的正则表达式,处理输入的信息,然后分类计算等等。

这一单元我的设计是几乎面向过程的,没有什么复杂的东西,思路上每一个也不是很抽象,都要落实到字符串上面

总的来说,第一单元熟悉了java语言,但是不懂什么是架构设计,对OO也就是把方法和数据放在一起的理解而已

第二单元更加注重进程控制以及调度算法。

第二单元是电梯调度,核心就是对于共享变量的读写,多个进程的同步和互斥

这一单元的难点一个就是如何共享对象读写控制进程,一个就是电梯调度算法的设计。

这一单元,我的设计能力有了一些强化,我对OO的理解强化了一些,比如java语言如何实现进程控制,以及如何设计进程之间相互控制等待协调配合上。

尤其是设置多个进程合作的时候,什么时候开始,什么时候停止,什么时候等待,什么时候结束,几乎构成了这三次作业的核心问题,

如何合理的给电梯类进行设计,直接影响到了进程控制的难易程度,同时,优秀的设计可以避免死锁的发生。

在这一单元,多个线程配合,很考验对于进程类的设计能力,如何合理的和其他进程通信,和其他进程同步互斥,防止死锁

 除此之外,合适的调度算法,调度策略,也是获得性能分的关键。

总而言之,第二单元,主要学习了多线程,从线程的角度上,对于类进行设计

通过对于线程控制的各种操作,不断改变线程类的设计,改善自己的架构,可以更加轻松的实现多线程操作

这一单元学习了比如生产者消费者模式,观察者模式,单例模式等等,都有了很大收获,

对于OO的理解,也在不断加深,无论是抽象程度,还是站在对象角度上,分析对象之间消息传递,都得到了锻炼

第三单元开始考察细节设计和简单整体设计

虽说第三单元被调侃称为看着JML写代码,但是事实上,JML表达的是结果,为了防止超时,需要对于每个方法进行合理的改造,

比如动态维护之类的操作,减少二次循环,三次循环的复杂操作,降低时间。

在这一单元的时候,框架的整体以及被课程组设计出来,我们要做的,是在这个框架之下,对于每一个方法进行设计,

尽可能在框架之下打磨细节,让每个方法更加简单,更加快速,有更好的效果。

所以,为了打磨细节,虽然框架已经给出,但是我们仍然需要分析对象之间如何交互,如何传递消息,什么时候传递消息。

在第三次作业里面,最短路径,强连通等等,也对于整体设计有一定的考察

因此,我对于OO的理解也在逐渐加深,对于规格也有了更新的认知,这一单元,需要先读懂JML

然后从整体上简单设计,然后具体的研究每个方法细节,才能达到不超时的目的

第四单元考察整体设计

这一单元前两次特别考察整体设计,感觉这一单元的OO要求达到了巅峰

在分析UML类图获取信息设计代码的时候,更加感悟到了OO就是一门把数据和方法放在一起的编程方法

如何选取数据,选取什么属性,如何更新属性,应该加入哪些方法,都需要动笔之前在整体上进行设计。

无论是站在对象角度上设计方法和属性,还是从整体角度上设计方法进行对象之间信息交流,进行信息整合

我在整体设计上,反复了多次,最终形成一个我认为最方便的设计,这一过程中,我感觉我的设计能力得到很大的提升

不光是设计能力,我的抽象能力,分析能力,组合能力,都在这一次作业得到了很大的提升,

前三个单元的积累,比如细节缓存设计,比如对象之间信息交流,比如处理输入建立关系等等都得到了应用

虽说这一单元看起来简单,但是如果用心去做的话,会感觉自己的设计能力可以承接前三次作业完美发挥

对于OO的理解也是如此,更加感受到了OO为什么要把方法和数据放在一起,选择什么样的数据方法,这样的目的是什么,等等

这两次作业,我也学会了更加抽象的分析问题,抽象角度进行设计等等总而言之,这单元很考验整体设计能力,也特别培养OO的水平,前三单元的能力都被完美融合进去,收获很大

总而言之,如何高内聚,如何低耦合,如何便于维护,都是我这四次课程关于OO,关于框架设计的收获

更重要的,我觉得我的抽象思考能力有了很大提升,不必依赖特别具体的实现

三、四个单元测试理解与实践演进

在第一单元的时候我是测试能力比较弱,测试完基本功能之后,就是一些边边角角的测试点,测试一下极限状态下的分析

除此之外,虽然测试样例可以自动生成,但是正确性检验还是肉眼比对,所以没有进行很多。

出现错误的时候,也是采取肉眼观察加上和一些程序配合的方法,测试能力比较弱。

由于测试疏忽,第三次作业出现了很大的失误,从此重视测试

第二单元的时候,我逐渐学会了使用自动化生成数据进行测试的方法,但是由于第二单元的特殊性,对我来说大量输出很难处理,我只读取了人是否出来作为参考

所以我就自动化生成一批简单不复杂的数据,以及一批特别复杂数量很大的数据,主要目的是测试死锁和是否出现没送到人或没接到人的情况。

第二单元并不复杂,也没有特别多的问题,只要时间之内送到人了就可以,所以测试主要是测试会不会出现特殊的异常情况出现没送人的错误。

这一单元逐渐熟悉了掌握了用程序代肉眼做重复事情的方法,毕竟程序可以直接大量文本比对判断谁没有出来。

真正让我测试能力飞跃的,是第三单元

首先是JUNIT工具的引入,让我针对每个方法测试有了更方便的工具,

第三单元只需要比对输出,所以可以自动化生成大量测试样例,进行输出的正确性判定

不论是对于方法的测试,还是对于大规模数据的测试,我都做的很充分

这一单元除了CPU超时的原因,没有出现任何错误点,这也归功于我测试做的充分

第四单元由于输入特殊性,很难进行自动化生成样例,我就采取手动画图的方法,测试了各种情况进行分析

大致上,把能出现的异常都测试了一遍,判断是否正确抛出异常,

然后就是对于基本功能进行简单测试,

最后是特别复杂的测试,

比如多继承多实现

比如同名类继承之类的查询,

总而言之,测试很充分,两次没有出现错误

四、课程收获

 一学期的OO课程下来,我的收获很多。

一方面是关于java语言的,在寒假的时候,我连打一句hello world都需要百度

public static void main总是打不全

各种各样的错误都犯过之后,我对Java语言更加上手了,能熟练地用java实现我想要的功能

另一方面,对于面向对象,对于OO的理解,我也逐渐深入

最开始只知道OO要开类,把属性方法放起来

后来逐渐解锁封装继承多态等东西,更加深刻感悟到OO的好处

最后,通过这两次作业,更加深刻认识到了为什么OO要把数据和方法放在一起

引用我在研讨课上的发言

”OO的目的是为了用Class把数据和方法包装成一个模块,包装成一个小的I/O设备。

对于这个设备,你给它按照要求给他输入,就可以调用方法得到你想要的所有有关信息。

在顶层,要做的就是对各个工具整合,各个工具的信息整合等等,得到结果。

在此基础上,封装就是防止你从外部破坏了工具,继承和多态等等是方便各个工具的管理组织以及明确各个工具的作用等等,

他们是帮助实现OO的手段,也是OO得以成立不可脱离的重要依据。“

另外,各种插件也让我对代码分析有了很大的收获,复杂度分析,UML图分析,可以直观了解我的代码。

虽然是迭代开发,但是我对于处理千行以上的代码,也有了更丰富的经验。

除了OO和java之外,对于分析问题,解决问题,抽象能力,逻辑分析,自动化测试,debug能力等等,我都有了很大的提升。

我相信OO这门课教给我的不只是java,不只是这几次作业,更多的,是程序设计时候的思考,

是抽象分析问题,站在对象角度上思考问题,设计架构的能力,

这些能力,我觉得会受益终生。

五、几个建议

1 感觉单元顺序可以调整一下,可以先从JML入手,帮助熟悉java,熟悉OO,熟悉一些简单的设计。

2  JML的相关工具不齐全,没有发挥预想的效果,但是JML单元还是不错的。

3  希望以后可以开放实验的内容,便于后续的一些学习与回顾

六、线上OO学习体会

这学期疫情原因,只能线上学习OO

虽然不能面对面交流,但是网课可以反复多次去看,这是最好的地方。

除此之外,线上可以进行讨论课,讨论参与度比课上更高

课上讨论是达不到微信群讨论的热烈程度和参与程度的。

虽然不能直观和老师面对面接触,但是却可以更好的参与讨论,反复琢磨上课内容。

除此之外,课程时间更加灵活,我可以提前观看,做好预习,比如上午看完,下午再去讨论,效果比直接上课现场思考收获更多

 

posted @ 2020-06-13 22:11  润羽るしあ单推人  阅读(888)  评论(0编辑  收藏  举报