第四单元总结

一、第四单元架构设计

第一次作业

我的本次作业的架构设计思路分成了三个部分:对外的接口,储存和功能实现三个部分

首先我建立一个ElementContainer类,它是一个容器,用来储存element并将其恢复成树的结构,并实现了查找的函数,比如findMyClassByName,findMyClassById等。

1639356-20190624202524801-339031407.png

其次我将操作比较多而复杂的类,实现了自己封装。在这些类中包含了这个对象的查询函数。同时由于和Class相关的查询操作比较多,我们也可以发现MyClass类格外的复杂。(我认为这里可以做查询和功能的进一步划分,让class类仅仅是一个查询接口而不包涵过多的图的路径问题)。在查询的函数中我采用了缓存的方法,将查询过的路径记录下来,减少时间的开销。

1639356-20190624202535177-843902445.png

最后,我实现了要求的MyUmlInteraction类,这个类的主要作用是在容器中得到要查询的对象,再对对象调用查询的方法。

1639356-20190624202547674-302406475.png
1639356-20190624202601411-1324244955.png

这一次作业总体的架构比较清晰,实现起来也比较简单,主要的问题在于要理解较多的UML图的概念。另一处不足之处是我认为查找顶级父类,类查找所有实现的接口,接口查找所有实现的接口等这些函数都是比较相似的,如果能够分离出一个图的容器并实现各种图的运算,可能会更好。

第二次作业

第二次作业我总体上继承了第一次的思路。只是在以下两方面做出了改进

  1. 一个UML图能够包含多个时序图和状态图,因此我修改了类图中的单例模式。
  2. 在这一次的作业中类图可能会包含三种错误,其中的循环继承等会引起程序的死循环,针对死循环进行了修改。

主体上沿用了上一次的架构,比较轻松地完成了这次的作业。
1639356-20190624202636400-1180102090.png
1639356-20190624202647383-1110185597.png
1639356-20190624202654071-381087116.png

这次作业中新增的时序图的查询和状态图的查询都不是很难,只要正确的理解两图的概念,就可以较为轻松的完成任务。

二、四个单元中架构设计及OO方法理解的演进

第一单元:

第一单元时我还基本上没有什么架构设计,也不懂得什么OO方法,前两次作业基本上使用java语言写的面向过程的程序。这一情况到第三次作业才有所改善。在第三次作业中,我初步应用了类的继承,但是架构上功能的拆分不合理,众多功能堆积同一个类中,也因此产生了bug。

第二单元:

第二单元的主题是多线程。多线程程序因为不能够调试,刚开始处理时十分棘手。也是在这个单元我开始接触到了一些设计模式:工厂模式,单例模式,生产者消费者模式,观察者模式。通过这个单元的学习,我初步明白了多线程程序应该如何编写,架构也终于有了些OO的样子。

第三单元:

第三单元是我做的最差的一个单元,主要集中在第二次和第三次作业。这两次作业均是由于性能问题,最后在我大规模的重写之后问题得到了解决。第三单元的架构(改进后)是我最满意的一次,尤其是助教的标程让我学习了很多。

第四单元:

第四单元完全是我自己设计的架构,虽然还有一些不完善之处,但是我在这次作业中进一步感受到架构的作用。良好的架构不但实现起来很快,也方便于定位自己的错误。

三、自己在四个单元中测试理解与实践的演进

四个单元中关于测试我主要学习到了两种方法,第一是构造测试集并写自己的测评程序,第二种是junit单元测试。在整个学期中我都是以第一种方法为主,从第三单元开始我接触到了junit,但是用的不是很多。

测试是程序正确运行的保证,良好的测试可以提醒自己很多没有想到的情况。在一次分享课上有同学提出了面向测试的开发令我受益匪浅。如果上来直接就写,难免会有一些考虑不周全的地方,有的甚至到最后才被发现,产生严重的后果。若是提前构造一个良好的测试集,并编写自己的测评程序,就可以用充足的测试减少错误。

junit单元测试是从第三单元时接触的方法。单元测试的方法保证了“积木”的每一块都是正确的,从而保证了正确性。但是我平时完成作业时觉得有些繁琐,测试程序逻辑虽然简单,但是很多很长,所以用的不是很多。另一方面也和我的设计水平不足有关。我自己大多数模块很简单,基本不需要反复检查。有一些功能比较复杂的模块包含的内容比较多,输出也会直接输出。以第四次作业寻找所有实现接口为例,我的实现分为两个部分,第一个是从container的hashmap中get,第二步在MyClass类中设计了一个函数,采用了dfs寻找所有接口。这两部分第一部分非常简单,而第二部分虽然复杂但是结果直接输出,不如直接采用第一种测试方法。因此我对junit使用偏少,也希望助教可以设计一些内容,让我们真正学习到junit的好处。

四、课程收获

面向对象课程给我印象最深刻的就是架构。一个好的架构不但写起来非常容易,而且也很难出现错误,即便有一些错误也很容易找出。我也从一开始的不会设计,到后面学习别人的设计,思考自己的设计,这一过程让我受益良多。

面向对象课程中我写了很多很多代码,提高了自己的动手能力和设计能力。和以前的课程不同,以前的课程要么是比较短的小任务,要么已经有了大体的框架。而面向对象课程的每次作业都像是在一大张白纸上画画,需要自己去构思,自己去完善每一个细节。在一次次的作业中,我对工程的理解也更加深刻,怎么减少思维复杂度,怎么保证正确性,怎么方便于不断的修改,这都是我在这门课程中学习到的东西。

五、改进建议

  1. 希望改进互测机制

    在互测环节中,位于8个人的屋子,不可能将所有人的代码读一遍,到了最后只是用自己的测试集将别人的代码都测试了一遍,没有起到相互学习的效果。同时,相比于同学的程序,我觉得阅读优秀的代码对我的帮助更大。

  2. 希望能够改进课上环节

    感觉每两周一次的课上环节有些脱节,通常是上午才上完课还没有弄清楚,下午就去做课上测试了,有些稀里糊涂的。更加针对的内容和更好的排课时间可能可以改进这一点。

  3. 希望分享环节可以继续改进

    相比与课程的其他设置我觉得分享环节对我吸引力较差。一方面,工程师的分享感觉和我们差距太远,另一方面每个人的问题都不太相同,同学的分享没有让我有很多的启发。

转载于:https://www.cnblogs.com/quarkstar/p/11079299.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值