OO_JAVA_四个单元的总结

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

设计目标

尽可能减小特殊容器的存在,能通用就通用,减小重复的类同代码。java

基础容器的存在,就是为上述目标而服务的。数据结构

设计概要

  1. 底层:基础的、类型无关、无依赖的容器以及对应的查询方法
  2. 中间层:用来存全部的parent和association映射关系及对应的查询方法
  3. 顶层:基于底层容器和中间层容器的业务逻辑处理方法

基础层

private Map<String, UmlElement> elementMap;
    private MultiValueMap<ElementType, UmlElement> typeMap;
    private DuoMap<String, ElementType, UmlElement> nameMap;
    private DuoMap<String, ElementType, UmlElement> parentIdMap;

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

原则

  1. 简洁:思路到代码都要简洁。
  2. 解耦:能提取的共性通通提取。

演进过程

所谓演进,就是上述原则理解的不断深化,和实际运用的不断深化。多线程

第一单元:表达式:继承与CAST

设计要求

处理表达式的输入输出,以及对表达式求导。架构

提取共性

不管数字、加号、乘号、减号、指数符号、sin函数、cos函数,均可以称之为函数,都是由函数自己,以及参数构造而成,造成一种树形结构,即表达式树。框架

对其一视同仁能够完成很是简化的设计架构,全部的函数,这里叫他函子。ide

共性

  1. 树或者说函子(某些)能够具备子树即子函子
  2. 对树或者说函子能够求导,求其导函数
  3. 对树或者说函子(某些)能够反科里化,将嵌套的同函子表达式展平
  4. 对数或者说函子(某些)能够合并同类项,好比数字相加能够合并

第二单元:多线程:层次分离

分离处理层次

分离层次的目的是为了每一部分都足够的简单,并且相互解离,能够独立或者一步步的设计构建,减轻脑力负担。函数

层次

  1. 顶层调度层,负责把乘客请求分配给电梯
  2. 电梯调度层,负责把乘客请求转化成电梯运行指令
  3. 电梯执行层,负责运行电梯运行指令

第三单元:JML规格:stream的运用

从第一单元接触到stream,学习运用,到第三单元,stream的运用已经在个人代码里到处都是,能够减少代码的复杂度。单元测试

第四单元:UML:容器的设计

从简洁、通用的角度出发,不该该为每一种UML元素的关系结构都设置对应的类或容器进行存储与获取学习

在这些元素与元素之间有不少关系直接从元素自己就能够构建获得,也即我所使用的4个类型无关Map,经过这4个Map,个人代码中没有大量的存储容器,这就是共性的效果。测试

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

所谓面对对象,就是在抽离相似对象之间的共性,以这些共性组织代码,提高代码的抽象程度,减轻编写的体力劳动。

在编写代码时,疏漏不可避免,这时就体现出分层与解离的好处了,当你的代码分离的层次清晰时,就能够快速地定位到发生错误的所在,这也是OO课程中我努力趋向的目标。

历来自c语言、数据结构课程的单纯经过输入输出数据来约束代码的正确性,我又学到了单元测试这一利器,以及为了解决正确性问题而发明的JML形式验证语言,这些都是约束程序的正确性的办法。

总结本身的课程收获

我OO的历程,就是不断地提高本身的解耦代码的能力,即提取共性的能力,第二单元时我以为第一单元用接口以及实现接口能够写的复杂度下降一些,如今我回过头看我第一单元的代码,我发现,有不少操做均可以进一步提取共性,简化代码,这就是进步,不断地掌握抽象的思惟方法。

每个单元,每一次project,最重要的是进步,所谓收获,也就是从一次次的做业中,体会到的本身的思路、设计的进步。

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

  1. 第一单元

    • 第一单元的难度能够适当的下降,下降的方法能够是提供官方的架构,而后让学生填写实现便可,好比表达式的求导,能够设置以下简易结构(四个接口):

      public interface Differentiable {
          Differentiable derivate();
      }
      
      public interface Recursive extends Differentiable {
          Collection<Differentiable> getChildren();
      }
      
      public interface Mergeable extends Recursive {
          Differentiable merge();
      }
      
      public interface Coryled extends Recursive {
          Differentiable uncoryled();
      }

      而后给出表达式项的模板(一种项的例子,省略初始化和构造):

      public class Plus implements Differentiable, Recursive, Mergeable, Coryled {
          private List<Differentiable> children;
      
          @Override
          public Collection<Differentiable> getChildren() {
              return children;
          }
      
          @Override
          public Differentiable derivate() {
              Plus plus = new Plus();
              for (Differentiable diff : getChildren) {
                  plus.addChild(diff.derivate());
              }
              return plus;
          }
      
          @Override
          public Differentiable uncoryled() {
              return this; // TO BE IMPLEMENTED
          }
      
          @Override
          public Differentiable merge() {
              return this; // TO BE IMPLEMENTED
          }
      
          public void addChild(Differentiable diff) {
              children.add(diff);
          }
      }

      设置结构与模板的目的,是为了学生易于掌握面对对象的内涵,并快速地理解Java里的类的继承和接口的实现。

      面对对象,即解离出对象与对象之间的共性,上面四个接口,就是表达式项的四种特性:

      1. 可导:每一项都是可导的,因此其余特性接口都继承自该特性接口
      2. 递归:有些项具备子项,好比加法项,其子项即两个相加的项,求导时须要进行一些相似递归的操做
      3. 可合并:有些具备子项的项,好比加法项,其子项能够合并同类项,好比1+2能够转化成3
      4. 可反科里化:嵌套的同种类项,能够解除嵌套,好比1+(1+2)能够转化成1+1+2

      并且,第一单元夹杂的输入处理部分,比重和难度较大,能够予以改良,好比像上述框架通常,也提供相似的框架。

      对于大多数学生来讲,刚刚学习面对对象的思惟,既然在对面对对象一无所知的状况下你们写出的代码都是面向过程,不如官方提供一个或数个框架,让学生按图索骥,照猫画虎,这样,既减轻了第一单元的课业难度,又让学生友好的接触这一门课程,何乐而不为?

  2. 评分:单元测试

    首先,像JML和UML这样的单元,评分的方式和标准是否能够改变呢?

    由于这两个单元咱们写代码,都是按照官方的接口来实现,那么评分是否能够按照单元测试来给分呢,这样也必定工程的须要,锻炼你们测试的能力。

  3. 评价:架构考察

    而后就是架构的考察,一个学期,如此多的project,我以为,这个课程,学生最应该提高的能力,就是必定程度上,驾驭复杂架构的能力,而伴随课程推动的,应该是学生的进步,对这一方面能力的进步与否,也应予以考察。

相关文章
相关标签/搜索