zoukankan      html  css  js  c++  java
  • OO Unit 4 Summary

    OO Unit 4 Summary

    第一次作业

    架构设计

    第一次作业关注于类图,需要实现一些查询方法。

    我采用了适配器模式(多亏了实验课学到的知识),将每个UmlElement封装为自定义类UmlxxxxxParser。由于UmlElememt的构造方法不是public,我采用对象适配器。Parser功能如下:

    • 提供element原有功能。每个Parser中将对应的Element作为成员变量,对外提供getNamegetId等等访问接口,从而对于Element的方法访问可以直接通过parser进行

    • 记录额外信息(封装的主要目的),例如每个Class包含的operation、attribute,每个Operation是否是Non-Return等等

    然后我建立了一个全局的parser类,在要填写的类中构造一个该类对象加入成员变量。parser的行为包括(按照执行顺序):

    • 将所有类、方法、参数等等进行归类,并建立对应的Parser存进不同的arraylist,并建立所有id到parser的map

    • 建立类和类、类和接口、接口和接口间的关联、继承、实现关系

    • 将参数加入对应方法,将方法、变量加入对应类中

    • 对外提供按照class的name访问class的接口(并抛出异常)

    最后在实现的类中调用parser的接口得到对应的类,并进行类的属性、操作的相关查询,其中寻找实现的所有接口使用了树的广度优先搜索。

     

    bug

    由于使用了自动测评+中测强度尚可,在强测中没有出现bug。

     

    第二次作业

    架构设计

    第二次作业增加了顺序图和状态图,提供查询方法。由于面临OS考期,课程组将作业压力减轻了一些(代价是去年一次作业的内容拆成了两次,并在后一次作业中增加了一些内容)。

    架构与上次类似,由于三种图互不交叉,所以使用三个整体parser处理,多封装了顺序图和状态图的几个相关Element类,增加操作例如在每个状态中保存其直接后继状态。唯一值得一提的是将finalstate、pseudostate、state三个类的parser统一继承自一个generalstate的抽象类,提供getNextStateCount方法,从而三个类可以统一处理,从而不必写很多冗余的if-else和类型转换,也不易出现错误。

    实现的新方法本身比上次更简单,大多数只需直接访问对应的lifeline/statemachine即可,只有后继状态涉及到图的广度优先搜索,也并不复

    bug

    强测中出现了一个bug,即顺序图中message的接收方为UmlEndPoint的情况,原因本质来说是UML图的理解不够完善,直接来说是代码没有较好的规避异常机制(例如在类型转换前判断类型)。

    第三次作业

    架构设计

    第三次作业增加了UML规则检查的内容,要求在建立模型后、查询指令前依次判断规则001~008,若不符合规则则立即报错结束。

    架构沿用前两次的设计,对于前六条类图的规则,在类图的parser中检查;后两条状态图的规则在状态图的parser中检查。002、003、004采用了广度优先搜索,其他的算法没有什么可说的(虽然有些许坑点)。其中002找环路我用DFS写结果频频出错,两个小时后无奈改用BFS终于成功,可以说体现了我的数据结构水平

    中测修bug花了很久(大家都卡在middle5,错误原因各不相同),长时间以为是002~004(毕竟对自己的数据结构水平不放心),最后发现是005的判断出了错,判断孤儿attribute不小心写成了判断孤儿parameter,修改后总算是通过了中测,OO作业收官~

    bug

    强测没有出现bug,完结撒花~(更新时间:6.14 12:15)

     

    本学期架构设计演进

    本学期四个单元的高强度作业、实验带来了架构设计上的水平提升。第一单元,从第一次作业近乎完全面向过程的设计,到第三次作业OO化的抽象化建模(将项与运算均作为同一类对象处理),对于继承和多态的理解愈发深刻。

    第二单元深入理解了多线程,完成了学期最高难度的多部多线程不同功能可换乘电梯的调度作业,对于并发设计有了深入理解。

    第三单元侧重于契约式设计,具体学习内容为JML,同时顺便锻炼了数据结构算法能力(dijkstra、dfs、甚至有的同学用的tarjan/并查集)。

    第四单元主要学习UML图及模型设计,而作业内容则通过解析UML图来学习UML,顺便练习架构设计。

    可以说经过了一学期的学习,在架构上从完全不知如何进行OO开发,到可以自然想出OO化的设计,进步还是很明显的,无论是顶层架构设计还是底层编码实现,都有了显著提升。

     

    本学期测试技巧演进

    本学期学到了诸多测试技巧,例如黑箱测试、JUnit单元测试等。最主要的测试方法还是编写自动评测程序进行黑箱测试。我从第二次作业开始编写对拍程序,在每个单元更换生成器和正确性判断方法,一直用了一个学期,整体上效果还不错,强测没有出现过多的正确性的bug(主要是是性能分、TLE等)。黑箱测试随机生成数据比较无脑粗暴,还可以用来进行互测,且不需要阅读他人代码,还是比较省时省力的。

    广告:自动测评已经发布到github~不过由于核心部分是迭代开发,前面几次作业的可能存在bug,但值得一试~ 链接:https://github.com/wzk1015/Object-Oriented-Design-Autotest

     

    课程收获

    昆仑课程名不虚传,压力真是山大,一周1k行啊

    除了上面说的编码能力、架构设计能力的提升,感觉也提升了软件开发的综合能力,并通过高强度训练增加了自己吃苦耐劳的能力(为996做准备)

    更具体的来说,对于java语言也有了很多了解,认识到了java作为典型面向对象语言的特征,在工程开发上极佳的适用性(特别是虚拟机、跨平台等),现在java可以作为python之后我第二倾向的语言,工程化设计上的首选。

    广告:娱乐项目console三国杀正在开发~欢迎来star,链接:https://github.com/wzk1015/sanguosha

     

    课程改进建议

    1、实验课公布正确答案和成绩,这样大家在实验后也可以学到知识(相当于bug修复),对于自己的成绩也有个预估;

    2、减少数据结构算法、时间性能优化上的侧重,个人感觉现在有点过于侧重这方面了,其实在架构开发上还有一些可以研究的;

    3、第三单元提升中测强度,中测留一手强测捅成狗不太友好,希望中测和其他单元持平(并且可以多开放一些中测点的数据,毕竟强测的区分度也挺大的)

    4、其他单元希望中测数据点能全部开放,例如像寒假pre一样在ddl前若干小时开放等,不然大家不知道错在哪里,只能花很多时间做黑箱测试,白白浪费时间而得不到提升

    5、自动测试可以给予指导,例如在实验课内容中增加,现在实验课学习了JUnit,实际上感觉自动测试也可以简单指导一下,否则目前唯一的学习来源是研讨课(还取决于有无同学进行分享)

    6、相对于作业侧重自学,实验课实际上是一种不错的学习方式,给了我们接触各种设计模式的机会,或许以后可以减少作业的权重,而在实验上增加一些新知识让我们学习?

    7、网课内容有点过于抽象,而且有些内容老师反复说了好几页PPT其实意思相近,反而容易让人迷惑,感觉课堂中可以加入更加具体的内容(当然这也可能是线上教学带来的影响,老师和同学都不太适应)

     

    线上学习体会

    特殊时期特殊上课方式,我们竟然在家里学完了一整个学期的OO课。所幸这门课本身自学成分居多(特别是代码实现层面),没有影响到教学质量,作业依然带给了我们在短时间内完成千行级别的工程开发能力,实验课依然能够学习到设计模式等重要的(但过于具体因而没有在录播课中涉及的)知识。唯一可惜的是研讨课有所影响,听说研讨课本来是可以邀请业界开发人员来办讲座的,看来我们错过了一些不错的学习机会。

    所幸的是线上教学没有影响到教学氛围,大家在群中的讨论依然非常活跃,互相给予了非常多的帮助(在此感谢帮助过我的大佬们)。作为一门不以考试为核心而以作业为重点的课程,OO的压力都在平时,因而这样的讨论氛围还是非常有必要的。

    现在回想起寒假pre2时照着指导书才敲出public static void main的自己,感觉提升是真的很大,也不辜负这么长时间的压力与付出了。

  • 相关阅读:
    美化WebApi,使其统一返回Json格式
    JavaScript函数封装调用
    Visual Studio 编辑器调试在IIS发布的Web程序出现错误的解决
    C#解析多层Json数据
    Python3解析库lxml
    学习使用Django一 安装虚拟环境
    一:(1.1)了解MVC之路由重写
    Python使用selenium模拟点击,进入下一页(三)
    云服务器安装证书
    Python使用selenium模拟点击(二)
  • 原文地址:https://www.cnblogs.com/zkwang/p/13097015.html
Copyright © 2011-2022 走看看