第四单元 OO blog

第四单元 OO homework

这一次是OO的最后一次作业,相对的,作业难度也比较低,感觉强测的难度也比之前低了不少,感觉OO课程组为了我们的期末考试用心良苦。感动。。。

整体结构设计

在这一次的作业中,我将所有的检查方法都放在了 MyImplementation 类中,主要的优点是容易迭代,因为各次作业之间的关系并不紧密。但是缺点也很明显,造成我的类行数过多,最后两次的作业中, style 分数只有50分。

实现思路

对于每一次新加入的功能,进行补充,我用例如 HashMap<String, String> idToParentHashMap<String, ArrayList<String>> idToParents 这样的哈希表去储存我需要的信息,每一次新加入的指令只需要利用好我的这些信息,就可以完成相应的任务。三次作业的需求是逐渐增加的,但是核心需要的信息都是相通的,所以迭代的难度并不大。

例如我的第三次新加入的测试指令:

@Override
  public void checkForUml008() throws UmlRule008Exception { //ok
      ArrayList<String> list = new ArrayList<>();
      for (UmlElement i : lists) {
          if (i.getElementType() == ElementType.UML_FINAL_STATE) {
              list.add(i.getId());
          }
      }
      for (UmlElement i : lists) {
          if (i.getElementType() == ElementType.UML_TRANSITION) {
              UmlTransition transition = (UmlTransition) i;
              if (list.contains(transition.getSource())) {
                  throw new UmlRule008Exception();
              }
          }
      }
  }

这样的迭代方法对于代码的整体来说是不好的,但是比较适合迭代。

测试思路

第一单元可以通过评测机来随机生成数据,但是后两个单元不是很容易随机构造合法数据。适合采用手动构造的方式来进行。同时,评测的思路也是和同学对拍(期末的时候写一个python的评测确实难顶)

第一单元

测试数据主要靠随机生成,使用python自带的化简工具,进行正确性测试。

第二单元

测试数据也是使用了Python随机生成,利用python中的cmd指令测试java包。

第三单元

测试数据随机生成,并且手动构造了一些边界数据,主要采用与同学对拍测试的形式,因为实在不会写这种的正确性检查代码。

第四单元

主要采用手动构造边界数据,与同学对拍测试的方式进行。

对所有单元的总结

第一单元是对于表达式的展开,这是我们从面向过程到面向对象的编程方式的过渡。从这一单元的作业中,我也是第一次了解到了层次化迭代的开发思路,逐渐了解了怎么设计自己的代码使得代码更加易于迭代和debug,学习到了怎么用git和其它工具维护我自己的工程。同时,在第一次作业中我也犯下了很多因为设计思路不熟悉的错误。可以说第一单元是我学习收获最大的单元,因为这一单元的设置真真正正的让我了解到了什么是面向对象,是让我从零到有的突破。同时第一单元也是后面所有单元的重要基础。没有第一单元得到练习,后面也不可能做的好。

同时,第一次作业是我写的最艰难的一次,但是确确实实是我转变程序设计思路,开始从面向过程到面向对象转变的开始。

第二单元我认为是最难的,也是印象最深刻的一次。在此单元作业前,多线程一直是一个比较模糊的概念。不过这次的课上代码提供了一个很好的思路,让我能够通过样例代码,以及自己的学习,完成这一单元的作业。可以说我能够大概理解多线程的实现,也是多亏了样例的代码。现在来看,这一单元思维难度其实不大,重点还是在于对 java 中线程的理解。不过理解线程......难度还是很大。

第三单元整体难度不大,但是我做的效果不好,究其原因,是对于 jml 规格的阅读不够熟练,对于复杂方法的 jml 规格,阅读起来还比较困难。这一单元感觉并没有学习到很多的知识,更多的是对于 jml 的阅读理解。

第四单元是实现 UML 解析器。这一单元让我对于 UML 模型中各个元素的含义和父子关系,属性耦合度、继承深度等概念有了更深的理解。

设计思维及OO方法理解的演进

第一单元是我理解OO方法最重要的一次,从第一次作业中课程组提供的代码中,我才理解到面向对象的魅力所在。

同时,第三单元也让我体会到了规格带来的好处,第四单元则是让我充分认识到封装性的强大之处。

课程收获

这门课作为北航计算机学院的核心专业课,可以说是难度比较大,很有push的感觉,课程内容也比较充实,(这学期就没有周末...),不过我也能充分感受到编程能力的提升,思维模式的改变。我也发现对于语言的学习,不能从系统学习编程语言的语法开始,应该任务驱动性学习(比如我的第一次作业)。只有这样才能充分发挥人的能力。

同时,我也认识到了测试和 bug 修复的重要性。从自己搭建评测机,随机数据生成,我充分认识到了自主测试的必要性。

并且从这门课上学到的 git 完成代码版本管理也是非常有用的,我认为这是除了代码能力外学到最重要的知识。

改进建议

或许可以调整一下课程的内容安排顺序?从我的个人体会来说,第一单员可以了解到面向对象的主要特征,第四单元可以对面向对象的特点有更深的认识,之后的第三单元认识到规格的重要性,而第二单元主要是对于线程的理解,并且难度比较大,可以放在后面的作业中进行完成。一四三二的顺序或许更符合基础比较差的同学的学习规律。

在研讨课上,如果有比较大佬作为组员,那么可能交流的时间会比较多,也会有一些新奇的想法,但是大部分同学的作业完成都很相似,所以在讨论中并不能有很好的收获。如果一个组内没有愿意表达自己想法与观点的人坐场主持,那么这场研讨会可能就比较尴尬。或许可以按照成绩来分配组员,让每一个组都有成绩水平不同的组员,这样也会比较合理。

或许可以提供一些预习材料,比如常见的容器的用法等等,方便我这一没有Java基础的同学了解更多如 hashset hashmap 的各种用法,有一段时间因为不会用导致使用了很久的 Arraylist

 

 

 

 

 

posted @ 2022-06-29 15:18  Avaleph  阅读(9)  评论(0编辑  收藏  举报