第四单元总结与期末回顾

一、第四单元架构简析

1.1三次作业迭代逻辑分析

本单元的三次作业和前几个单元类似,大体上是第一次作业从零开始,像是跨越一座大山,第二次作业在前面的基础上做一些补充,相比之下较为轻松,第三单元突破一些难点,难度较大。当然每个单元都有不同之处,这一单元的个人认为最难的是第一次作业,主体架构的设计、面向对象技巧的使用、官方代码的理解都在第一次作业,第二次作业可以看作是第一次作业成果的具体表现形式的扩展,基本思路很类似,也能回顾第一次的一些不足,第三次作业是对前面的架构拓展一些功能,是进一步的应用。从类图到顺序图、状态图再到逻辑检查,除了在这一过程中练习了java面向对象的设计,还深度了解了UML的特点和使用。

1.2前两次作业

前两次作业架构类似,两次作业相对独立,但是设计思路大致相同,都是利用容器建立具有一定特点的图结构,第一次作业相对内容较多,我将接口与类进行了抽象,他们是图结构的节点,因此我设计了MyPoint类、以及继承自MyPoint类的MyClass、MyInterface类,图中的有向边是继承或者接口实现,图的存储类似采用了邻接表的形式,每个结点包含自己的“父节点”,父节点又包括上级接口和上级类,为方便查询,结点内部和外部大都采用了map进行存储,并且为了节省时间开销,每个结点进行相关查询一次后会保留查询结果,具体来讲会保留查询到的所有上级结点,由于我们的图不会在程序进行过程中变化(只会初始化一次),这样的缓存方式是快捷高效的。至于关联关系,只需要在结点内部保存相关的end就可以方便的满足查询需求。第二次作业的图的类型稍有不同,但那都是代码逻辑层面的问题,代码架构是类似的,简单来讲状态图中结点内部我存储的是下级结点信息,而类图中结点内部我存储的是上级结点信息,这是符合状态图、类图的基础逻辑的。

1.3第三次作业

第三次作业是对之前建立的图结构进行一些逻辑检查,这个过程是初始化之后进行,一些约定被弱化,要保证初始化时不出问题,逻辑检查相当一部分是对图结构进行一些较为复杂的查询,比如搜索等,查询循环继承时我就直接以每一个点为源点进行BFS,效率并非最优,但处理起来比较方便,关于重复继承、重复实现的检查,则是直接查询并记录所有上级结点,看有没有相同的。当然由于约定被弱化,之前设计好的缓存结构不能直接使用,也并无太大必要,因为检查过程只有一次,所以我直接进行了针对性的查询搜索,不至于破坏原始数据,检查通过以后之前的约定就能满足了,这样的处理方式于我而言比较方便,但过程中有一定的信息丢失,当然由于查询过程是一次性的,丢失信息并不多。

1.4最终作业的类图

最终这一单元的作业的类图如下:(我实现的相关部分

二、前四单元架构总览

2.1第一单元

第一单元可能是我暂时没有体会到面向对象的精髓,依然很依赖之前的面向过程的思考模式,第一次比较简单,第二次需要考虑性能,我采用了计算完成之后进行搜索之后再合并的方式,效果还不错,可以说性价比比较高,第三次难度就比较大了,我采用面向过程经典的递归模型进行处理,用字符串作为递归函数的传入传出值,分层治之,包括WF的判断也是逐层判断,写起来还算是比较容易,当然也有一些面向对象的设计在里面,比如项、因子等,但有些对象被字符串取而代之,可以说面向对象设计得不到位。这一单元很好的锻炼了我们处理字符串的能力,包括正则表达式等。

2.2第二单元

第二单元上手起来还算难度比较大,毕竟第一次接触多线程,第一次作业初步掌握多线程之后第二次作业就比较简单了,第二次作业主要是在第一次作业上有了一些限制,加了电梯,总体上讲我采用生产者消费者模式,为每个电梯配备一个storage,人来的时候基本上随机被分配到storage,这样随机的方式减少了客户请求端与电梯的交互,写起来比较简单,性能上也不算差。第三次作业比较困难的就是换乘,我采用让电梯抛出请求到客户端的方式,一定程度上减少了代码修改量,避免了不同电梯线程之间的直接交互。我这单元作业的设计原则是各司其职,尽量避免不同线程间的交互,这样也不容易发生死锁一类的事故。调度我采用的是look算法,效率可观,写起来也比较简单。同步控制我用的是synchronized关键字、wait、notify那一套,通用有效。

2.3第三单元

第三单元比较侧重算法,我们也深刻的体会到规格化设计的优势,前两次作业比较简单,不过就是根据规格描述进行翻译,就是要注意实现方法,实现方法不是死的,设计实现方法要考虑程序的性能,我多采用缓存等机制来提高性能。这一单元的图相关算法也算是巩固了个遍。第三次作业算法的意味就比较浓烈了,性能的要求也很高,因此难度还是比较大的,像是判断双连通、最短路径算法的优化等。第三单元的架构是设计好的,更注重实现。

2.4第四单元

第四单元前面已经提到过了,我觉得这单元相比第三单元整体难度较大,首先理解作业的意图就有些困难,其次他不像第三单元基本不用设计架构,这单元的架构虽说比较简单,但是也需要自己想,这单元我少有的主动使用了继承等设计方法,可见,我的设计水平有所提升。

2.5面向对象的理解

第一单元可以说是入门,面向对象的东西涉及到的比较浅,可以说不学习面向对象也能写,当然如果说字符串处理也是面向对象的重要一环的话可以说是训练的很到位了。第二单元面向对象的感觉基本建立了,因为线程是很好的一个对象,为避免安全问题,会很自然的进行“封装”等处理,我可以说我能够很好的体会到电梯、客户请求端、仓库作为对象的存在。第三单元是课程组示范性的告诉我们面向对象模块化的涉及过程,当然顺便也学会了JML的使用,对设计有了初步的感觉。第四单元在整体上有一个设计架构、设计类、设计方法实现的过程,可以说对整个从设计到实现上有了一些感觉,当然我觉得第四次作业设计的难度不太够,面向对象的感觉也有些不到位,但课程组的目的可以说是基本达到了。

三、前四单元测试体会

3.1第一单元

第一单元借助一些python包等其他工具实现了与小伙伴对拍的简易测评装置,一定程度上实现了黑箱测试,当然我觉得第一单元更重要的一点就是手动构造一些边界数据,这比较困难,不容易测全,应该和同学多交流。

3.2第二单元

第二单元通过对输出、输入的逻辑分析可以实现单人黑箱测试,相比第一单元,这一单元随机测试的覆盖性较好,在大家的帮助下搭建测评机还是比较容易的。可是这对线程安全的问题较难区分,这是一个尚待解决的问题。

3.3第三单元

第三单元在老师的引导下我们针对一些较为复杂的方法做了一些junit单元测试,也针对边界情况、比较复杂的图结构手动构造了样例,也通过自动化的手段生成了测试数据与小伙伴对拍,测试还是比较全面,可是最终死在了性能上。。。

3.4第四单元

第四单元的样例生成逻辑较为复杂,第一次作业借用了上一级学长的一个生成器搭建了简易的对拍器,后面两次作业由于时间问题只是手动构造了一些数据进行测试,测试基本覆盖,但数据量不够,还好这一单元没出什么问题。

3.5总体体会

测试是一个永恒的话题,有些作业的随机测试效果较好,而有些却不然,有些作业正确性分析较为简单,而有些比较复杂。我觉得测试的关键还是在于边界,毕竟一个软件的一般功能如果有问题早在一开始就发现了,边界的问题往往是隐患最大且不容易发现的。

四、课程收获

这是我进入学院以来体验最好的软件类的课程了,和上学期计组不相上下,但类型不太一样,虽说是在家里,但学习体验一点没有收到影响。首先肯定是掌握了面向对象设计的思路、方法,基本掌握了java语言,其次还有附赠的数据结构复习与提升、图论应用,以及为了搭建测评机初步掌握了python和一些脚本语言、命令行的使用等。除了这些知识,还有各个庞大作业的任务体验、小伙伴之间的“情感联络”,以及认识了有趣的老师和助教。

五、课程建议

  • 希望评分机制进一步透明化。
  • 实验能简单有效一点,有几次实验太难了。。
  • 希望研讨课的制度能改一下,课程网站的讨论区的存在使得研讨可能没有太大必要,不是不想和大家分享,感觉没什么可说的,或者课程组可以适当的限定研讨的范围,审一下研讨的内容,感觉大家很多都是为了刷分来研讨的(包括我。

六、线上学习体验

OO课改到现在,线上线下已经影响不大了,只是不能很好的和老师同学们交流,线上的课程网站、讨论区都很不错,实验的体验也还行,研讨效果也还好,至少相比线下不会差,要说不好的地方大概就是录播课的效果可能不如线下,当然这也是于我个人而言,不过也可能线下也。。。

你可能感兴趣的:(第四单元总结与期末回顾)