第四单元总结性博客作业

第四单元总结性博客作业

本单元作业的架构设计

本单元作业任务是解析UML图,第一次作业是类图的解析;第二次作页是顺序图和状态转移图的解析;第三次作业是对UML图的合法性进行解析。

对于UML图的解析,我采用的方法是对课程组给的Uml类进行再次封装。课程组给的类只含有getId()这种最最基础的方法。而我们解析UML图只用这些方法是肯定不够的。因此我们需要构造自己的My类,在自己类中加上我们需要的方法,加上我们希望这个类的实例需要保存的数据(属性)。

比如说,对于第一次作业的UmlClass类,我在自己的代码中将其再次封装成MyClass类,代码(部分)如下:

public class MyClass implements MyElement {
   private String id;
   private String name;
   private MyClass father;
   private ArrayList<MyInterface> interfaces;
   private ArrayList<MyClass> sons;
   private ArrayList<MyAttribute> attributes;
   private ArrayList<MyOperation> operations;
   private int depth;

   public MyClass(String id, String name) {
      ......
  }
   
  ......
       
}

解析UML图,很重要的一个点是如何将输入中零零散散的类、接口、方法等的关系联系起来。在我再次封装的类中,不仅仅有这个类本身的属性(id,name等),还有这个类和其他类、接口、方法等实例的关系。这样我们通过一个MyClass类的实例就能很轻松的找到和这个类相关的类、接口等实例,那道两个MyClass类的实例,我们也能很轻松的知道他们之间的关系。同时,对于数据我采用树形架构,一个类管理各种属性、方法;方法由管理多个参数……

在第二次作业中,我们加上了顺序图和状态图的解析。这次作业算是第一次作业的拓展,方法和第一次是一样的:将官方包中的UML类再封装为自己的类进行解析。

第三次作业我认为是第一二次作业的迭代开发。之所以这么说,我认为第二次作业不能算严格的迭代,第二次作业中绝大部分内容和第一次作业的一点关系都没有,只能算增量。但是第三次作业对UML图的合法性进行检查,需要在原代码中进行增删。如果第一二次作业解析出的数据架构不是很好的话,在这次作业的处理上可能会非常复杂。由于第一二次作业我采用再封装的思路,数据采用树形架构,代码架构十分清晰,只需要对顶层的类进行相应的查找计算就能得到合法性检查的结果。

四个单元中架构设计思维及OO方法理解的演进

oo课程算是我第二次接触面向对象的编程语言。之前学过swift,但是由于课程不是很深入,对面向对象理解很浅。在上oo课程之前,我还单纯的以为面向对象就是把c语言这种面向过程的语言的函数写成方法。

课程的第一单元让我初步理解了层次化设计。第一单元是表达式解析。对于一个表达式,我们一般将它解析成树状结构。顶层是表达式,顶层之下是项,项里面是属于这个项的各个因子。对于每一层的操作,我们都只需要考虑这个层的变化,将其他层的操作抽象成那个层的某个方法。就比如想要化简一个表达式,我们需要将表达式中每个项化简,然后再合并一下同类项。其中“将每个项化简”就是项那一层需要做的事情,我们将其抽象成项类的一个方法,对于表达式类,我们不需要知道项类内部做了什么,我们只关心我们将这个任务交给了项类。

课程的第二单元是多线程。也是这个单元,让我对并发有了一些理解。一个并发的代码,我们不仅仅要保证程序在顺序执行的时候不出问题,我们还要保证在并发条件下不出问题。在并发时,我们常常会遇到数据共享,等待阻塞,线程唤醒等诸多需要解决的问题。如果对并发条件下的共享数据放任不管,就会出现正确性问题;如果过多阻塞又会出现死锁问题。

在课程的第三单元,我们接触了JML规格。按照我的理解JML规格大多用于团队开发的一种规范化模式。架构者将他构思的架构写成JML规格,代码编写者按照JML规格,用算法实现架构者的思想。我认为JML规格的学习是oo课程不可缺少的一部分。面向对象语言的优势就是他将方法、数据等内容封装到一个类之中。别的类只需要调用这个类的方法,将这个类数据的处理操作全权交给这个类。在团队开发中,这种面向对象的模式是十分有优势的。设想一个面向过程的C语言代码,多人合作的时候难道是一个人写几行拼成一个程序吗?肯定不行。但是在面向对象的设计模式这里,我们完全可以将不同的类交给不同的人进行开发。只要这个类有符合规定的接口,我就可以调用这个类的方法,对于这个类具体的操作与我无关。可以说oo解决了团队程序开发的困境。而在团队开发中,用JML规格来写代码,能够很轻松的避免软件开发过程中成员交流产生的歧义。

第四单元是UML图的解析,对于Uml元素再封装。在设计上难度不是很大。

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

第一单元和第二单元,我都是采用手动编造边界数据来进行测试,这种测试方式的效率很低。

第三单元我采用了对拍的形式。用程序自动化生成随机数据,然后和同学进行对拍。这种方式很多时候很难找到一些临界点的bug。于是后来我进行了改进,采用随机测试加手动生成边界数据的形式,测试效果比较好。

总结自己的课程收获

  • 在这一学期的课程学习中我学会了JAVA代码的编写规范,具备了编写JAVA代码的能力。

  • 我在课程的学习中学习了面向对象的编程思想,对层次化设计,多线程开发以及契约化编程有了一定的思考。

  • 在课程学习的过程中我业逐步学会了一些测试技巧。我编写测试数据更加全面,也能够独立完成小型对拍程序、测试程序以及数据生成程序。

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

  • 希望实验课程能够给出测试结果(不一定非要在实验中,实验结束后也行),不然稀里糊涂的完成了实验练习也不知道对不对。

  • 希望加强一下中测,有时代码有些功能根本没用实现都能通过中测,失去了中测本身的意义(判断作业有无完成)。

  • 希望能在互测之前就公布强测成绩(但不公布强测测试点)。因为每次强测都是在互测之后出,导致每次周日都很紧张,互测被hack了也会心态大崩,担心强测错很多。我觉得可以把强测分数提前公布,这样,得分不高的同学也可以沉下心来找别人的bug加分;得分高的同学也能心平气和的度过周日。

posted @ 2022-06-26 18:11  张启立  阅读(13)  评论(0编辑  收藏  举报