OO第四单元及课程总结

第四单元作业设计

  第四单元的三次作业,难度上来说大概是呈难-中-难的分布态势。第一次作业的难点主要在于对UML类图不熟悉和最大2s的cpu时间限制,针对前一个问题,边写边探索,也算掌握了大半;第二个问题,考虑到作业的需求中涉及到很多遍历操作,在参考几篇博客之后,选择了使用哈希图存储以及根据键值遍历的方式。

1         for (String key : recordMap.keySet()) {
2             int val = recordMap.get(key);
3             if (val > 1) {
4                 return true;
5             }
6         }

  由于完整的类图中元素较多,使用时再进行分类显然不太合理,于是我又根据各元素的parentId借HashMap套娃建立起类似于树的存储结构。

1 private HashMap<String, HashMap<String, UmlOperation>> operaTree;

  创建时根据类的id为下属元素的parentid分类:

 

1     for (int i = 0; i < classes.size(); i++) {
2         String classId = classes.get(i).getId();
3         operaTree.put(classId, getOperaByClass(classId));
4         attriTree.put(classId, getAttrByClass(classId));
5     }

 

 

 

  同时,为了避免多余的元素遍历,我将元素分类的操作直接放到了所实现的类的构造方法中。

  第二次作业加入状态图和设计图,其实二者相对于类图复杂度都有所降低,方法的实现也相对较简单,只是需要注意各个元素的实际意义(神奇的region)。

  第三次作业涉及到图的正确性检查,在需求的理解上需要花费更多的时间,但主要思想还是图的遍历。

  作业实现过程中,虽然我把多次使用的操作封装成了方法(比如类、状态机的检查等),但是为了数据调用的方便(和摸鱼),几乎是把所有需要实现的方法都放在一个文件中,导致单个文件最终多达一千多行,在代码风格上大打折扣。(此处安利  CodeGlance插件)

 (方法多到图上都看不清了)

1     public void classCheck(String className);
2     public void stateCheck(String smName, String s);
3     public void interactionCheck(String name);
4     public void lifelineCheck(String interName, String interId, String llName);

架构设计演变

  最开始接触OO课程时,代码基本是沿着流程化的思想设计的,在扩展性和可读性上有很大欠缺,第一单元作业很少继承前次作业的架构设计。往后的作业设计中,一方面是需求的可拓展性越发明显,另一方面是自身对面向对象思想的逐渐理解,更加注重架构设计的后续扩展和各个类的抽象性,尤其是后续类的继承与接口实现、生产者-消费者模式、多线程等设计思想让我看到面向对象设计在处理某些问题上得天独厚的优势,当然在作业中也降低了代码的实现和维护成本。课程组精心安排的实验课,在帮助我们理解这些思想上有很大的功劳。

关于测试

  在接触这门课程之前我没有重视过自己代码的测试工作,包括很多次作业我都是把指导书上的数据过了就不管了,有时针对较简单的数据形式会采用“手搓”+“人眼”的方式测试,覆盖率和效率都很低下。但实际上像脚本、Junit等都是不错的低成本测试方式,用过之后才真香。其中Junit配合Idea的测试覆盖率显示让测试有效性一目了然。在第三单元的Jml训练中,更是有根据Jml自动生成样例的骚操作,不过由于工具链缺乏支持实用性较差。总的来说,OO让我从手搓数据的“原始”时代进入借助工具实现自动化测试的“文明”纪元。

课程收获

  面向对象设计思想,以及使用它解决实际问题的能力;

  java语法及特性;

  多种设计模式;

  git、Jprofiler等辅助工具的使用;

  测试对工程实现的重要性;

  统一的代码规格(Jml);

  ......

课程建议

  理论课有些乏味,希望能增加更多具体和有趣的事例;

  实验课的训练很具体,但是如果有定期的实验结果反馈会更好;

  第三单元的训练重点感觉放到了算法上,建议进行调整(Jml工具链真是一言难尽);

线上学习体会

  个人认为这门课程线上学习和线下的区别不是很大,毕竟课程的相当一部分工作都需要网络的支持。线上与线下最大的不同应该是理论课,线上开展理论课教学,充分利用课程后的问卷和讨论,加深了我们对课程知识的理解,应该会比线下的学习效果好,但平时的作业和实验可能会由于学习环境的不同而降低质量。总的来说,线上学习OO课程还是比较愉悦的,在众多课程中算是直接收获最为明显的吧。

 

posted @ 2020-06-15 02:26  longmixl  阅读(163)  评论(0编辑  收藏  举报