OO第四单元总结

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

第一次作业

  熟悉的场景,因为时间不够我选择了暴力Hashmap,对每一种从属关系都建立一个Hashmap<String, String>或Hashmap<String, ArrayList<String>>。每次执行查询方法时,就利用这些存储信息现场计算(每次查询都会计算一次,这可能会导致查询操作过多时用时过长)。

  我认为第一次作业的难点在于理清各种琐碎的题目要求。我在着手写代码之前,大概用了两三天的时间明确各种概念和要求,实际编码时就非常容易而且不易出错。

第二次作业

  第二次作业基本沿用了上一次作业的架构,将类图、顺序图、状态图、程序正确性检查四个部分分为四个单个的类进行处理,每个类的内部都与第一次作业中的类图类似。而这四个类由于其基本结构类似(内部存在大量Hashmap<String, String>和Hashmap<String, ArrayList<String>>)、有许多相同的重复操作,所以它们可以均继承自同一个类。

  因为正确性检查是针对类图进行的,所以这个检查其实可以在类图类内部进行,但由于单个类行数的限制才将其拆分。这样的操作也导致了重复储存类似信息。

  关于PreCheck的算法,我选择暴力遍历所有类/接口。譬如针对环形继承检查,我选择遍历查询每个类/接口能否通过继承关系回到它本身,输出所有满足要求的类/接口;针对重复继承检查,我选择遍历查询每个类/接口的继承列表,如果有重复元素即输出。也就是说,对每一个类/接口进行查询时都是从零开始的,并没有利用之前生成的中间数据,可以说是效率最低的一种算法。面对强测的最后一个点,我WA了。

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

  就我自己来说,在这一学期的OO学习过程中,对OO方法的理解是极其有限的。面对每一周的新作业,首先想的是如何最快地完成功能需求,先AC再说,然后想的是如何优化算法、避免超时。至于架构,重构一时爽,次次重构次次爽。

  除过第二次非拆分不可的电梯作业外,我三四单元的作业基本都是用一两个大类解决问题的。而且第二次的电梯作业我也只是简单地分为电梯类、调度器类、输入类这几个大类。在理论课上听到老师反复强调过无数次OO方法理论,开闭原则、单一职责原则、依赖倒转原则,等等。而且我自己也阅读了一些设计模式的相关书籍,所以并非是不懂那些理论知识,但是为什么不能很好地把这些理论与实践结合起来呢?

  其一,程序架构并没有一个量化的评价标准,时间紧急时就会觉得没必要、得过且过。一般来说,对于每单元的前两次作业,我还可能适当的考虑架构,尽量写得好看一点。但是对于每单元的最后一次作业,往往要做到及时AC都很难,更是无暇考虑架构。

  其二,理论和实践的距离太远。尽管知道设计应该先于编码,但由于能力不足,从逻辑层面对一个规模较大的任务解析分层对我还是过于困难。举个例子,有些时候在写完代码后我才发现“原来这几个类有类似的结构”、“原来这几个类有类似的行为”;但是有些时候我认为某种行为可以被抽象为接口,但是真正编码时才发现并没有太大的意义。再举个例子,对第一单元的作业,老师在课上不断不断暗示要划分为常数类、幂函数类、三角函数类、加法类、乘法类、嵌套函数类等类(重点是将关系符作为类处理),然后对输入逐项处理,实现一个面向对象的操作。但是我在实际写代码的时候依旧不知道是怎么一回事,询问室友也没有得到令人满意的答案,最后依旧写出了屎山一样的代码。很久以后我阅读大佬的代码,才理解了这一种做法。但是在面对后来三四单元的作业,我还是不清楚如何拆分,只好扔到一个类中了事。

  从具体的收获来说,我认识最深刻的OO方法有:继承关系是子类对父类功能的扩展、接口是对行为的抽象、单一职责原则以及类与类之间进行消息通信的方法。尽管我已经在自己能力的基础上收获了很多东西,但这还远远不够,我计划在之后的学习中通过阅读更多的优秀代码进一步提高自己对OO方法的理解。

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

   第一单元作业,关注各种边界条件和特殊情况,也就是WF问题,对正确性问题没有什么太好的解决办法,也不会用考察正确性的样例来测试别人的代码。(直到我后半学期开始学习python,发现构造第一单元的测试样例简直无比简单,菜是原罪)

  第二单元作业,不会写测试工具的我只会在0时刻扔指令,指令全靠手打一条一条构造。在这次作业中出现了一个令我印象非常深刻的bug。在其他测试样例完全没有问题的情况下,别人的一条测试样例hack出了我的一个错误,这条测试样例的数据量极大,请求情况也很复杂。经过逐条比对输出,我发现这一组特殊的数据触发了一处if判断条件中出现可能性极低的一种情况。这让我深刻地认识到了全覆盖测试的重要性。

  第三单元作业,我初次尝试使用了JUnit的单元化测试方法。其中查看测试的覆盖率是一项非常有效的功能。

  第四单元作业,因为使用单个大类的方式,输入繁多,不便于进行单元测试,我直接采用了手动构造测试数据的方法。

总结自己的课程收获

  Java面向对象是如今在真正的实际领域广泛使用的语言与设计思想,通过学习这门连接学校与职业的课程,我了解到了实际工作的场景和要求,对学习的重心和方向有了一个更明确的认识。

  其次,通过完成不同要求的作业,我通过实践初步掌握了Java这门编程语言。

  就我来说,比起收获了OOP的方法和理论知识,我最大的收获还是锻炼了编写、测试规模较大的程序的能力。在此之前,每当听到要写一个几百上千行的程序就会觉得几乎不可能完成。而如今,先不论代码质量如何,阅读文档要求、思考程序结构、在电脑面前一码一整天、测试debug,一步一步做下来,也是很自然的事情。回头看看这一学期走过的OO之路,还是很有成就感的。

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

  第一,合理设置上机考试的内容和时间安排,对上机考试的内容进行适当的预告。

  第二,分享更多大佬的优秀代码。不知道是不是有对于防止补交作业抄袭的考量,我觉得本学期代码分享的力度还不够大。阅读巨佬的代码是一种非常好的学习方式。

  第三,理论课内容更贴近实际操作。其实我也不知道如何设置理论课的内容会更好,但我觉得这学期的理论课过于偏重抽象的理论,一节课下来脑子空空,感觉从中并没有学到太多东西,课下重读PPT时也是不明所以。后来,我找时间读了一本设计模式的书,讲解与实例结合,我立马就搞清楚了很多一直不明白的概念。

posted @ 2019-06-23 22:51  syncline  阅读(209)  评论(1编辑  收藏  举报