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

设计目标

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

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

设计概要

  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函数,都可以称之为函数,都是由函数本身,以及参数构造而成,形成一种树形结构,即表达式树。

对其一视同仁可以完成非常简化的设计架构,所有的函数,这里叫他函子。

共性

  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,我觉得,这个课程,学生最应该提升的能力,就是一定程度上,驾驭复杂架构的能力,而伴随课程推进的,应该是学生的进步,对这一方面能力的进步与否,也应予以考察。

OO_JAVA_四个单元的总结的更多相关文章

  1. 北航oo作业第四单元小结

    1.总结本单元两次作业的架构设计 在我动手开始总结我的设计之前,我看了其他同学已经提交在班级群里的博客,不禁汗颜,我是真的偷懒.其他同学大多使用了新建一个类,用以储存每一个UMLelemet元素的具体 ...

  2. OO 第四单元总结

    一.总结本单元两次作业的框架设计 1.1. 需求分析 通过分析mdj文件可知,两次作业如果对于时间复杂度没有要求,可以不涉及任何数据结构,直接根据读入的UML_ELEMENT逐个分析得到各个函数的结果 ...

  3. OO2019第四单元作业总结

    一.本单元两次作业的架构设计  1.第一次作业 第一次作业由于时间仓促,没有过多的架构设计,就直接补全了所给的MyUmlInteraction类,导致整个程序的代码风格和效率都不高,在强测中也因此失掉 ...

  4. UML结构与解析——BUAA OO第四单元作业总结

    UML与解析架构 UML是什么 统一建模语言(英语:Unified Modeling Language,缩写 UML)是非专利的第三代建模和规约语言.UML是一种开放的方法,用于说明.可视化.构建和编 ...

  5. OO第四单元总结——查询UML类图 暨 OO课程总结

    一.本单元两次作业的架构设计总结 作业一.UML类图查询 1. 统计信息图 2. 复杂度分析 基本复杂度(Essential Complexity (ev(G)).模块设计复杂度(Module Des ...

  6. 2019年北航OO第四单元(UML任务)及学期总结

    第四单元两次作业总结 第十三次作业 需求分析 本次作业需要完成一个UML类图解析器,所需要解析的只有符合UML标准和能够在Java 8中复现的UML类图.查询指令存在两种:仅与所查对象有关的指令,以及 ...

  7. OO第四单元作业小结

    一.本单元两次作业的架构设计 1.第一次作业 整体思路:以class为核心,建立MyInterface.MyAttribute.MyOperation.MyAssociation四个类分别储存每个类的 ...

  8. 【面向对象】第四单元总结——UML

    本单元构架设计 统一建模语言(英语:Unified Modeling Language,缩写 UML)是非专利的第三代建模和规约语言.UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的 ...

  9. 返璞归真——OO第四单元总结暨学期总结

    本次作业是第四单元的最后一次作业,也是本学期面向对象的最后一次作业,在此我将分别对第四单元和整个学期进行总结. 一.本单元的两次作业 第四单元的作业是关于UML的一些处理.UML语言是一种区别于具体语 ...

随机推荐

  1. Linu常用日志分析实战

    日志结构分析 分析日志状态码所在位置为第九个 遍历取出第一行日志的每个字段 //取出第一行日志 awk 'NR==1{for(i=1;i<=NF;i++)print i"= " ...

  2. 完蛋,公司被一条 update 语句干趴了!

    大家好,我是小林. 昨晚在群划水的时候,看到有位读者说了这么一件事. 在这里插入图片描述 大概就是,在线上执行一条 update 语句修改数据库数据的时候,where 条件没有带上索引,导致业务直接崩 ...

  3. Vue3.x全家桶+vite+TS-搭建Vue3.x项目

    目录 一.搭建基础项目 1.vite创建项目 3.运行项目 2.环境变量设置介绍 vite配置多环境打包 二.配置Router 1.安装路由 2.配置路由 3.引入 三.配置Vuex 1.安装vuex ...

  4. [源码解析] 深度学习分布式训练框架 horovod (20) --- Elastic Training Operator

    [源码解析] 深度学习分布式训练框架 horovod (20) --- Elastic Training Operator 目录 [源码解析] 深度学习分布式训练框架 horovod (20) --- ...

  5. CentOS8部署tftp

    tftp:简单文本传输协议,而ftp:文本传输协议.可以把tftp看成是ftp的精简版.tftp用于免登录传输小文件,tftp服务端监听在udp协议的69端口tftp简单的工作原理: tftp服务端与 ...

  6. 猪齿鱼 SaaS 版效能平台发布

    ​日前,猪齿鱼Choerodon全场景效能平台Saas版发布,提供体系化方法论和协作.测试.DevOps及容器工具,帮助企业拉通需求.设计.开发.部署.测试和运营流程,一站式提高管理效率和质量.从团队 ...

  7. mysql更新数据时:当想mysql某插入有某字段设置了unique且和之前相同时,会报错,并停止运行

    这个在mysql5.7会报错: 如openid设为unique: 1062 - Duplicate entry 'oTfYq6PKne00IrcTqphmKqKnsahM' for key 'qx_w ...

  8. linux错误: locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory

    命令 locate my.cnf 产生以上错误 此时执行 # updatedb 更新下数据库即可

  9. Java基础系列(6)- 注释

    注释 平时我们编写代码,在代码量比较少的时候,我们还可以看懂自己写的,但是当项目结构一旦复杂起来,我们就需要用到注释了 注释不会被执行,是给开发人员看的 书写注释是一个非常好的习惯 Java中的注释有 ...

  10. Jmeter系列(36)- Access Log Sampler

    简介 Access Log Sampler 是个非常有用的工具,可以收集和分析真实用户操作的数据,并可用于流量分析.常见的就是我们的nginx的access.log 日志 使用 access.log ...