OO第四次博客作业

OO第四次博客作业

一、总结本单元两次作业的架构设计  

(一)第一次UML作业

 先po一个类图来从整体角度看一下类的设计:

从类图可以看出来,在类的设计上,我除了Main类以外,额外加入了四个类,其中MyUMLInteraction类还是起到主要的解析作用,然后MyUMLClass、MyUMLInterface和MyOperation都是辅助查询的类。

然后在具体细节实现上,主要就是MyUMLInteraction类承担了大部分的任务,我使用了200多行代码来用作构造函数,通过两个for循环来解析出所有需要的类型,这个类的数据成员是一大堆HashMap用于存储各种UML图的类型,方便查找。

然后需要我实现的各个指令的成员函数我都是在这个类中实现的,因为我的各个元素都是直接存储在各个HashMap中的,所以各种查询只能直接在这个类具体实现。

其他三个类都是存储一些需要的信息比较复杂,要单独统计或者单独存储的。

(二)第二次UML作业

 也先给出一个类图看一下整体的结构:

可以看出来跟第一次的架构设计几乎完全一样。这种简单粗暴的设计直接导致了我的MyUMLGeneralInteraction类的行数高达1000行(在没有调整checkstyle之前),因为我所有的方法都是直接在这个类中实现的,然后构造函数也是高达200多行,所有的需要存储的元素我都几乎存在了这个类的HashMap中,然后其他5个类就是辅助查询的,在遇到一些具体针对某类元素的指令时可以在构造函数中统计存储好,方便在方法实现时使用。

架构的细节跟第一次作业几乎没有区别,关于类的查询完全复制的第一次作业(这个我不知道怎么使用继承来复用上次的代码)。然后剩下的一些指令涉及到图的比较复杂的指令,我都是使用递归实现的,因此也出现了一些难以预料的bug。

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

(一)第一单元

第一单元其实主要是摸索面向对象思维方式,所以架构设计几乎是没有,能把功能分摊到不同的class类对于我来说都是一件非常艰难的事情。

我第一次作业就是面向过程的写法,一main到底,完全没有关于类的解析的考虑。

第二次作业自然要重构,我的第二次作业开始考虑将任务分配到Poly和Term中,细分每一个部分。

第三次作业也是这个思路,只不过更加复杂,我使用递归的方法来完成任务。

感觉第一单元我对面向对象的这种编程思想了解的很少,架构设计几乎是零。

(二)第二单元

到了第二单元,我觉得我在一些同学发的帖子里我得到了一些启示,尤其是第三次作业中的三部电梯,我是同意建模的,在细节上各有不同,这是在构造的时候需要考虑的事情,然后调度器、输入都是单独的类,将电梯这些全部分开单独建模,结构上清晰了很多。

其实第二单元是我对OO中的面向对象思维理解跨越最深的一步,因为第二单元非常适合这种分开建模的方式,使用起来得心应手。

(三)第三单元

第三单元我完成的情况不是很好,前两次作业都是一些很细小的地方出问题,然后到了第三次作业的图,我真的很晕,然后就没能交上去。

对于第三单元的架构设计,我就是按照课程组的要求来建的类,自己的架构设计考虑很少。

(四)第四单元

实际上第四单元是非常开放的单元,非常适合用来训练OO编程思维,但是我原本这方面比较薄弱,然后加上考试之类的,我又比较笨,我写完就需要很多时间,就没有花费太多时间在架构设计上。我是采用的非常粗暴的方式(详情见一中我的这两次架构设计)。但是对于课程组下发的标程我仔细研究了一下他的架构设计,感觉在这里面学习了很多。感觉在第四单元的标程中,我对OO方法的理解在第二单元上又前进了一步。

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

说实话我对于测试的掌握一直不是很好,这几个单元的测试方面做得很差。

(一)第一单元

第一单元我之前忙于写代码,没怎么看同学们的帖子,怎么来构造随机数据,怎么使用数学工具计算得到结果,怎么批量测试。这些是我第一单元快要结束的时候我才看了这些帖子。从总的四个单元的练习来看,其实这一个单元最适合批量测试自己的程序,最适合锻炼自己使用工具测试程序的能力。

然而我第一单元测试自己包括别人的代码都没有这么做,我都是通过看代码(实际上是看正则表达式)来找程序的漏洞。

(二)第二单元

第二单元中的多线程较为容易产生测试样例,但是结果判断我不太会写。后来意识到指导书中后面有提示结果的有效性有几条可以依据来写测试程序。不过我感觉这个单元其实肉眼debug比其他的方法要使用,就是通过看逻辑上对不对,可以避免出现一些奇怪的bug。

(三)第三单元和第四单元

第三和第四单元可以采用老师提过的单元测试的方法,针对每个方法进行测试,很有针对性;也可以使用JMLUnitNG来自动生成测试样例对方法进行测试。但是这些方法都是比较有限的,因为这两个单元的测试样例和结果判断不太好自己生成,尤其是第四单元的UML图,指令生成倒不是很难,但是结果判断不是很好判断。我在这两个单元自己尝试了带包编译运行,这种方法还是要自己生成测试样例,而且还需要至少两个程序对拍,因为我自己不知道答案,只能通过与别人的对比来判断程序的正确性。

(四)总结

这从这四个单元的情况来看,第四单元的时候肯定比第一单元的时候对测试的理解更加深刻,对于一些方法的掌握也更多。但是自动化测试的方法掌握情况还是不太好。

四、总结自己的课程收获

(一)思维方式

作为面向对象课程,我觉得在课程中的最大收获是get到了一个跟C语言代码完全不一样的模式的代码写法。众所周知,C语言代码是面向过程的,而本课程通过java语言向我们介绍了面向对象的模式,与面向过程的代码在思维上其实还是有很大的差距的。

课程一开始的时候,其实我对于面向对象的编程思想了解的很少,然后第一次作业很简单,用C风格的java代码也可以硬刚出来,然后就感觉,哎呀,这个怎么和C好像没有什么太大的区别啊,就只是换了一个语言写代码而已。但是到第二次作业的时候,就发现如果还依然使用C那种面向过程的思维方式,代码非常的难写,而且一旦出现新的需求,那真的是酸爽。而面向对象的代码在重构方面有很大的优势,代码的可扩展性非常的强。

几次研讨课上同学们的分享和自己这一个学期面向对象代码的编写,让我了解到了面向对象这种思维方式和代码编写方式的优势,感觉面向对象的代码非常适合做一些需求经常变化但是基本的内容又不会变的项目。当然这也不是说面向过程的C不好,这两种思维方式各有优缺点。

(二)一些边边角角的东西

比如说我学了一门新的语言[笑哭]。。。

还有一个我觉得很重要的就是学以致用吧,我们OS课上学习了一点编写脚本的知识,而在OO课上,这个就可以拿来用作批量对比测试的工具。其实我不会写评测机,之前的作业基本上都是在理解了代码的逻辑内容来判断代码是否有bug,但是如果大数据量的测试一个一个的在IDEA的cocsole里比较的话会效率很低,所以这时候有一个脚本就会非常方便。

由于本人非常的菜,所以我只会使用git bash来编译和运行java代码并将结果输出到文件中然后使用diff来与其他的人来比较,做不到那些大佬搭的评测机的水平,然后在这么点东西自己摸索的过程中还是遇到了一些玄学的问题,所以我觉得这也锻炼了我自学的能力吧。

五、立足于自己的体会给课程提三个具体改进建议

(一)每个单元尤其最后一次作业给一个标程

每个单元都是学习一类新的知识,比如第一单元学习的正则,第二单元学习的多线程等等。每此作业都要花掉我许多时间,然后还有其他课程的作业,所以我很多时候是没有时间去详细地看关于那部分的内容,然后这单元的代码也不知道可以有哪些比较规范的写法。这样每次都是只有输出没有输入,就感觉每次作业只是完成了作业而已,实际上没有学习到一些新的东西。

给标程就是希望可以通过看标程可以了解一些代码的书写规范,尤其像面向对象的代码编写方式是每次作业都要注意的,例如最后一次作业,我有一个类写了1000多行,因为我不太清楚要怎么把这些分出去,怎么继承上次写的代码,等等。还有比如第二单元,我三次作业都是使用的轮询(sleep)没有用过notify和wait,我希望可以有一个标程来作为新的思路参考,我觉得这样我可以学到很多,而不仅仅只是完成每次作业。

(二)每个单元最后可以给一个总结帖(在大家博客写完之后)

我的想法其实很简单,就是就像以前上数分高代之类的数理课,老师在一个单元结束以后会简单总结一下,这个单元里我们学习了哪些知识点,有的时候我们自己可能一些东西注意不到,老师提点一下自己回去再学习巩固一下会更好。

作为与数理完全不同的面向对象的课程,我觉得这个不是学习语言为主,跟大一的时候学习C语言程序设计不一样,这个主要是思维上的学习。课程组可以配合标程,相当于给标程加的注释,标程使用了哪些重要的内容,这些东西在面向对象中对应了什么重要的东西,比如说使用了什么模式之类的。

总结帖可以很简略的提一下本单元我们学习的重点内容,比如第一单元的重点内容在于入门面向对象程序设计和正则表达式的学习,然后配合标程可以介绍一些面向对象里的常用知识。

因为OO理论课不像OS、计组的理论课,介绍理论知识,然后理论知识和上机实践结合,可以明确自己要学些什么。OO就完全是通过平时的编程作业来自己感悟要学什么,理论课上的很多东西我听了感觉非常的抽象然后就不太能懂,以至于有的时候我硬刚也可以通过测试。通过这样一个帖子,明确我们这个单元除了代码还有什么需要去学习运用的,我觉得比单纯只写代码会好很多。自己总结固然有用,但是别人尤其是助教们的总结,可以给我们指导作用,和自己的总结不是一种作用。

(三)关于评测机

评测机我觉得是一个测试必备的好工具然而不是每个人都会写评测机,关于测试方面虽然很多同学在研讨课上做过分享,但是是一开始的时候,很多东西到了后面就不一样了,比如一开始就只是单独的java文件编译运行,到后面不仅是多个文件,而且会带包一起编译运行,然后这之中就会出现很多玄学问题,我又一次尝试带包的命令行编译运行,试了一个下午才发现了一个玄学的问题在哪里,就这种东西如果别人提醒一下就会好很多,不用花费很多时间在这种实际上没有太大价值的东西上。

我觉得课程组发评测机是一个不现实的问题[捂脸],但是我希望课程组在测试这方面可以稍微提醒一下,在关键的地方可以点一下,让我们不至于走太多的弯路,毕竟我们时间少,任务多。我觉得测试也可以算在这个课程教授的内容里面,也是一个重要的知识点,所以希望课程组在测试方面可以官方发一些帖子,在适当的时候可以提供一些帮助。

posted @ 2019-06-23 17:16  17373183  阅读(107)  评论(0编辑  收藏  举报