一、第四单元架构设计
这个单元的UML图,相当于引入了一个新的概念,像一个新概念引用编程题,感觉和JML一样,只是JML语法改成了自然语言描述。当然这个编程题的载体是UML,在解编程题的过程中,我还是对UM有了一定程度的了从某种意义上说课程组的目的达到了。
怎么说呢?UML是一门语言,它通过类图,状态图,顺序图可以描述一种行为,或是说一种要求,一个问题。计算机编程,我的拙见是感觉在于人类自然语言到具体编程语言的转化,而UML就提供了这个方法,它转化出来编程语言结果是可以通用的,不限于某一具体的语言。
如指导书所言,本次作业的程序主干逻辑(包括解析mdj
格式的文件为关键数据)均已实现,只需要同学们完成剩下的部分。我们需要做的是满足一些指令的要求。很可惜啊,我只是一个懒人,没有去深究具体的解决方法(偶尔当传入参数的类型不清楚时,点进去看了几眼)。在实现这些指令函数的时候,就相当于将图的内容理清了一遍。对于每一个图,包过标准检查,我都是首先对传入的参数进行预处理,提取出有用的价值,对于乱序输入,我采用的是多循环几次,分层将信息筛选。
我的 MyUmlClassModelInteraction 的UML图如下:
方法都是要求的方法,然后所用的数据结构都是为这些方法服务的。我大部分都的数据结构都使用的是hash map。主要是为了方便查找,降低搜索所用的时间。如id2name,就是将ID和Name之间建立联系。方便之后的函数调用,可以直接通过id找名字。数据结构是根据函数需求所确定的,比如要查找一个类的所有方法,我建立了类与其方法的哈希表opt,当也可以多用,比如可以同时知道一个类的所有方法和方法的个数,并不是一个方法对应一个数据结构。
另外三个图也类似,都是一样的模板。比较复杂一点的算法就是要用到简单的深度优先和广度优先搜索算法。在Main里面就是简单的四个类实例化成对象直接调用其中的方法函数就行了。架构普通,简单易懂,没有什么值得学习的地方。
二、四个单元中架构设计及OO方法理解的演进
第一单元:该单元是表达式求导的处理,由于是第一次接触java以及面向对象思想,开始架构比较直线思维,大部分思想还是面向过程处理,第二三次作业全是重写的,完全没有考虑到自己代码的扩展性。在第二次作业的互测房间里,参考到了别的同学的优秀代码,感到大受震撼,于是变改变了自己的结构,第三次作业写出了一份让我自己感到满意的代码。求导,每一种因子的求导都是一个类,通过调用可以让他们相互作用,从而完成递归求导的过程。对函数式的解析采用的则是递归下法处理存储的。只是可惜的是我第三次作业没认真审题导致是无效作业。
第二单元:这一单元是对多线程的理解学习,可以说是编程上的一个新领域(对我而言)。以电梯调度的方式呈现在我们面前,只可惜大家都在卷算法,或许是觉得完成线程之间的同步互斥太简单了吧。这个单元我只是简单的用了锁临界区和对于共享资源的wait和notifyall方法解决的,好在课程组也没怎么为难我。在后面的研讨课上同学介绍了一些新的方法以及更加原子的操作,可惜我都没去实践。不过这个单元的调度算法,我的还比较一般。大概相当于操作系统中的Cscan算法。多部电梯,不同电梯我也只是采用简单的按需调度,尽量满足电梯的特性。毕竟未来是不可预测的,没有一个算法在所有情况下都是性能最好的。只是说我们尽量做到最优。现实生活中如何解决呢?我想大概是统计需求再重新策划算法吧。反正就是自己尽量做好,之后就听天由命了,无怨无悔。这个单元的架构主要是生产者消费者传送带模型,就这三类线程。这次作业的代码的可重构性极好,也是课程组仁慈,总之比较轻松。
第三单元:这一单元是JML的学习。这一单元的难度系数不大。构架主要是沿用了课程组给出的结构。就是照着JML码翻译,除了几个如最大连通块,最短路径以外,基本上都是直接翻译。这个单元一个重点就是数据结构的选取,为了不超时大家基本上都是用的Hashmap。这个单元完成了一个基本社交网络的模拟,最基础的类为 Person,该类就是图的节点,之后各种各样的类也是围绕节点展开,节点之间存在联系,即构成边。同时还存在 Group这种结构可以保存多个 Person,以及相应的数据内容。除此之外还有 Message 的结构可以实现人与人直接,人与组织之间信息的传递。最后 Network类将之前的各类联系和囊括在一起,保存了之前各类存在的信息。这一单元的另一重点是,图的维护,主要是对节点和边的增删。主要有addPerson、addRelation等函数。在编写这些函数的时候,需要考虑到自己所有的容器,他们是否需要改变。比如在维护查询联通块的函数中,addPerson需要对联通块数量增1,addRelation则需要对联通块数量减1,同时更新根节点与节点之间的关系。在查询最短路径时,在这两个函数中都要及时维护边与节点的数量关系等等。
第四单元:这最后一个单元是UML的学习。这个单元第一次作业难度较大。可能是由于上一单元轻松惯了。这次作业是要求解析一个图。这个图怎么传入的呢?由一个个小单元组成,这些单元各有各的种类特性,如UMLCLASS是一个类,UMLSTATE是一种状态等等。已经将一个图分解成了这些信息碎片,我们要做的就是实现一些查询。在实现这些指令函数的时候,就相当于将图的内容理清了一遍。对于每一个图,包过标准检查,我都是首先对传入的参数进行预处理,提取出有用的价值,对于乱序输入,我采用的是多循环几次,分层将信息筛选。四个图都是这种架构,然后在主类里面实例化一下直接调用函数。
对于面向对象的思想,老师始终是强调的,但是面向对象这个思想是不能一下形成的,之前的习性难以转变。在一开始的作业中,面向过程的影子还是比较多的,所以再第二三次作业都是直接重写。在后面的互测环节中,我见到了许多面向对象的优秀代码,在他们的帮助下我也改进了许多,代码中逐渐出现了面向对象的影子,也了解到了面向对象的艺术,从易到难,从简到繁,复杂的代码本身就是由一个个简单的又互相联系的代码段组成的吗?我不需要知道这些代码段具体的实现,我只需要知道它的功能,以及我该如何使用它。
三、四个单元中测试理解与实践的演进
第一单元的测试,主要是想到什么就测什么。构造一些自认为边界的数据进行测试。一般来说对一份完成度较高的代码来说,这种方法可以帮助找出一些边边角角的错误,但是没法保证自己的没问题没bug能过强测。在互测的环节,我是将所有同学的代码都下载下来的,开了多个窗口一个个跑,挺费时间的,不太能测出bug。只是一些极端的测出来了,如(+++x)。正确性验证的话也不太方便,毕竟第三次作业代码量还挺大的,要读懂理解7份代码实在不容易。
第二单元的测试就不是简单的输入输出了,需要带时间戳。好在评论区有热心的同学给了分享。这次我尝试写了评测机,采用的是随机生成数据与时间戳。对于结果的正确性判断,我就是利用逻辑关系来判断的,比如必须关门再开门,上升之前门必须是关的等等。对拍也不好对拍,测试起来还是十分麻烦的。而且这一单元还存在隐性bug,即只在某一次执行中才会出现的bug,死锁啥的,这个主要还是得看自己的代码,用正确性判断。
第三单元的测试主要是要考虑超时的问题,其实这个单元只要按照规格来写,不会出现bug的。这个单元第一次作业我就因为求最大连通块用的是dfs超时了,其实可以大大简化。在写代码的时候就要尽量考虑自己的性能如何。另一个bug是爆栈了,这个也是没考虑仔细,后来用一个循环代替递归解决了。这一单元的测试主要是要考虑每一个规格的极限情况,认真仔细看懂规格和他的边界条件就不会犯错了,我觉得要测的话就是一个个规格的测试,就这个单元而言只要每个规格没问题那么整个也没问题。还有一个注意点就是关于整型的取值问题,还是那句话,严格按照规格来就不会错。
第四单元的测试就是自己设计一些图来测试,还是和第三单元一样,将每个指令单独测试,熟读这个指令的要求,想一想它的边界情况自己有没有考虑到。这一单元我也存在bug,主要是对JAVA、UML规格的认识不全面,以及没重视讨论区所讨论的导致出现了一些小错误。
在此感谢热心回答我问题的助教鸽鸽与给我提供数据的同学们。代码也不是说我写完就完成了,一份完美的代码应当经得起强测,互测。代码的完成是一个不断发现问题bug然后修复的过程,也极有可能需要重写,这都是一份较为完美的代码的必经之路。
四、总结自己的课程收获
这个课程收获还是很多的。从最初开学java基本上不会,到现在能够熟练地写一份代码,这是成长。还有就是面向对象这个思想的学习,让我单一的面向过程编程思维丰富了起来。现在看来各有各的好处。面向对象最基本的代码部分还是用面向过程的方法写出来的。但这不是面向对象的重点,面向对象重点首先是对象,如何构造一个恰当的数据与方法的集合作为一个类,这些个类之间如何才能高效协作起来?每个类的具体实现不是我在这个层面所关心的,我需要知道它的功能以及用法,想办法让这些个类有机结合起来解决问题。
当然,我还学到了多线程编程,线程同步互斥与安全问题,这也是一种新的编程方式。还学了JML这个规格语言,这个就是一个大工程所需要的了。每一个人完成一个部分,这个部分以JML的规格向外展示,其他的合作者就不需要再阅读理解里面复杂的代码了。还有UML语言,这个语言我觉得很有意思,可以将自然事件转化为图的形式,然后图又是一条一条的元素代码。总之回想起来学的东西还挺多的,收获满满。
还有一点就是经过这门课程我感觉自身心态也变好了。最初那次无效作业让我很难过,但也是教训,我学到了很多,也不再那么功利浮躁了。虽然不是说躺平了,但是想想凡事还最好积极乐观点,向上看,向前看,向幸福的的方向看,不要畏惧什么困难挫折。
其实还有挺多想写的,可惜只有10分钟提交截止了呜呜呜
五、改进建议
希望实验课能够有反馈,感觉自己做完后又不知道答案也不知道自己做的怎么样。
还有就是希望强测可以早点出结果,感觉结果出了但一直不公布的样子。
另外就是希望可以再一个单元就要结束时可以展示一下优秀的代码,让大家都学习一下优秀的代码也很好。
课程组还是很不错的,我航你6这门课还是很受收获,感谢助教哥哥们和老师们还有热心的同学们!!!