共享是最有效的学习办法。
博客:blog.ktdaddy.com/

故事

这几天的小猫心境还不错,修完了”幂等工作的bug“,填完了”缓存击穿的坑“,前两天组长告知给他的“整理一份体系现状报告”使命也算是有了思路,阴霾总算散去。好像一切都朝着好的方向开展了。是的,也该过去了,究竟这些工作摧残小猫都快个把月了。

这天,小猫提着两杯咖啡找到了产品司理,原本么,礼多人不怪,这不效果就来了么。

“……整个事务背景呢,其实也便是这样了,然后后边有啥其他问题,也欢迎随时问,知无不答”。产品老汪和小猫足足聊了一半个小时,唾沫星子横飞,似乎还有点意犹未尽。

“嗯嗯,谢谢了,汪哥,耽误你时刻了。”

“没事儿,不必谦让,不过提醒你一下,当时体系通过太多开发的手了,体系代码得好好看看,听说初版别的时分都是外包搞的。你懂得……”

“嗯嗯,好,太感谢了” 小猫连连允许,老汪的话却是提醒了他。

内心开端嘀咕,“哎。看来搞定各种模型联系,事务背景也仍是不行啊,面对现实吧,烂怂代码仍是得整理一下的,当时体系的接口界说、以及类的封装形似都挺乱的……”

敞开“类图”之旅

提到对体系代码中的模型整理,其实最好的办法仍是运用UML类图。上个章节中老猫没有打开和我们共享UML类图,一个是因为篇幅的原因,第二个是老猫觉得类图关于我们后续阅览结构源码以及底层规划形式有着相当大的协助,所以很有必要将其作为独自一篇来和我们共享。如下概要:

整了解救烂怂代码?我是这么做的

类图的简介

类图是什么呢?比较专业一点的说法:在软件工程中,类图是一种静态的结构图,描绘了体系的类的集合,类的特点和类之间的联系,能够简化了人们对体系的了解;类图是体系分析和规划阶段的重要产品,是体系编码和测验的重要模型。

其实不仅仅是软件工程中,其他许多时分需求理清复杂联系的时分,我们也能够用到这种表明办法。接下来,跟着老猫揭开类图的奥秘面纱……

类图的根本特点

其实类图仍是相当简略的,类图只需归纳起来就两个比较重要的点,一个是类,第二个是类和类之间的联系,我们弄清楚这两个,其实类图也就掌握了。 啥是类?关于OO程序员来说,这个类不便是我们日常界说的class么,没错,其实便是这概念。其间包含类名、类的特点、类的办法。

王者荣耀打过吧?老猫用自己比较喜欢的一个英豪“钟馗”为事例和我们解析一下。如下图:

整了解救烂怂代码?我是这么做的
上图中我们能够看到:

  1. 类名:最上面的矩形框中即为类名:钟馗(Zhongkui)
  2. 类的特点:类名下的第一个矩形图中表明类的特点,如上钟馗事例中,其称号、血条等等信息即为其特点。
  3. 类的办法:在类特点的下面便是类的办法,其间在钟馗这个英豪类的办法中包含勾人–hook(),锤人–hammer()等等

上图中我们能够看到无论是类的前面仍是办法的前面其实都有不同的符号,其实这类符号便是作用域的概念。在类图中,作用域首要有以下几个:

  1. “+”:表明public,对所有的类都可见。
  2. “-”:表明private,仅仅只对当时类可见。
  3. “#”:表明protected,受维护的特点或许办法,其后代类可见。
  4. “~”:表明package,表明包内可见
  5. “=”:表明默认值,上述事例中或许没有画出来。我们概念知道一下即可。
  6. “_”: 下划线,表明当时的这个类的办法或许特点是静态的。
  7. 斜体:老猫这儿没有画出来,这儿其实表明的是笼统,当然有的时分也会用两个尖括号包裹来表明笼统,<<我是笼统类or接口>>。

办法和特点冒号后边所表明的含义也不相同,办法后边冒号后边的描绘例如hammer():boolean,表明的便是返回值为boolean类型,是否锤到人。而特点的冒号后边则表明的是当时该特点的类型。

类之间的联系

我们再来看一个每个类和类之间的联系。直接看表明办法,如下图:

整了解救烂怂代码?我是这么做的

上述图中,我们或许需求记住的是各种线条的表明办法。接下来,我们逐个来看

泛化(承继)联系

我们举一个鸭子承继鸟类这样一个比方。我们表明出来的话,如下:

整了解救烂怂代码?我是这么做的

表明办法:空心三角+实线,箭头指向父类

上图中我们明晰地看见子类鸭子承继了父类所有的特点,当然除此之外,子类还丰富了父类的办法,例如鸭子承继下蛋的一起扩大了游泳。

小代码:

public class Bird {
  public String feather;
  public String wing;
  public void layEggs() {
  }
}
public class Duck extends Bird {
  public String feather;
  public String wing;
  public void layEggs() {
  }
  public boolean swim() {
      return true;
  }
}

完成

笼统了飞翔这么一个接口,然后让各种不相同的鸟类进行完成,如下图:

整了解救烂怂代码?我是这么做的

表明办法:空心三角+虚线,箭头指向待完成的接口

表明完成接口中的所有的办法。

小代码:

  public interface Fly {
    public void doFly();
  }
  public class WildGoose implements Fly {
    public void doFly() {
    }
  }

依靠

举个比方,动物都依靠于空气,所以我们就有了下图:

整了解救烂怂代码?我是这么做的

表明办法:尖括号+虚线,尖括号指向被依靠的类。

依靠联系表明一个类运用(依靠)另一个类的服务或信息。一般来说,依靠总是单向的,不应该存在双向依靠。就拿上面的比方来说,动物依靠于空气,我们并不能说,空气依靠于动物,可见依靠是单向的。

小代码:

public class Animal {
   public void breath(Oxygen oxygen,Water water) {
      oxygen.supply();
      water.supply();
   }
}
public class Oxygen {
  public void supply(){
  }
}

相关

提到相关,种类比较多,可是了解起来仍是比较简略,即一类目标和别的一类目标之间存在某种联系。这种相相联系分为单项相关、双向相关、自相关、多重相关。在面向目标语言中,如果表明存在相相联系,那么通常会将一个类的目标作为别的一个类的成员变量。

单向相关

例如用户在商城中购买东西之前都需求去设置地址,那么用户和地址之间便是单向相相联系。

整了解救烂怂代码?我是这么做的

表明办法:尖括号+实线,尖括号指向用户的成员变量,即地址。

小代码:

    public class User {
      private Address address;
      ...
    }
    public class Address{
      ...
    }
双向相关

例如用户购买产品,产品一起也会被不同的人购买,那么这种行为便是双向相关。

整了解救烂怂代码?我是这么做的

表明办法:实线衔接两个类即可。

小代码:

   public class User {
     private List<Product> products;
     ...
   }
   public class Product{
     private User user;
   }
自相关

关于自相关,其实我们日常开发中也遇到过,尤其是一些递归类的时分,例如树形结构,大树下面套小树。

整了解救烂怂代码?我是这么做的

小代码:

  public class Tree {
    private Tree subTree;
  }
多重相关

多重相相联系表明两个相关目标在数量上的对应联系。在UML中,目标之间的多重性能够直接在相关直线上用一个数字或一个数字规模表明。比方一条河上在某个时刻有好几只鸭子在上面浪,当然也能够没有。可是在那个时刻关于那只鸭子而言,它只能在一条河里面浪。比方以及数量表明说明如下:

整了解救烂怂代码?我是这么做的

小代码:

  private class River {
    private Duck[] ducks;
    ....
  }
  public class Duck {
  }

聚合

首要描绘聚合联系,描绘的是全体与部分的联系。关于聚合来说,成员目标是全体目标的一部分,当然成员目标也能够脱离全体独立存在。这么说的话有点笼统了,打个比方,老猫有最近想要拼装一台台式电脑,所以我买了显卡以及主板等等元器件。关于台式机来说显卡以及元器件是其一部分,可是显卡以及主板又能够独自作为产品进行售卖。所以我们就有了下面这样一幅示意图。

整了解救烂怂代码?我是这么做的

表明办法:空心菱形表明衔招待聚合的那个类目标

小代码:

  public class Computer {
    private KeyBoard keyboard;
    //构造办法注入
    public Computer(KeyBoard keyboard){
       this.keyBoard = keyboard;
    }
  }
  public class KeyBoard {
  }

组合

组合联系和聚合有点相似,也是描绘全体和部分的联系,区别是聚合的话成员目标能够脱离全体独自存在,可是组合是”同生共死”的组合目标联系。例如公司和部分之间的联系。即为组合联系。如果公司都凉凉了,那么还有部分么? 简略一幅示意图如下。

整了解救烂怂代码?我是这么做的

表明办法:实心菱形表明衔招待组合的那个类目标

小代码:

  public class Company {
    private  Department department;
    public Company(Department department){
      this.department = department;
    }
  }
  public class Department {
  }

归纳事例

若是看到此处,信任我们对类图的各种表明办法现已了然于胸了吧。那么我们接下来就来看看老猫制作出来的类图联系吧。

整了解救烂怂代码?我是这么做的

我们能够试试看看对照着老猫上面的整理来读懂这样一个真实的模型类图吧。

怎么制作类图

写了这么多,信任我们对怎么制作类图用什么工具仍是比较好奇的。

  1. 其实在idea中许多时分我们能够直接查看类图。只需在类名上面右键单击,选择 Diagrams -> Show Diagram即可展现如下图:

整了解救烂怂代码?我是这么做的

  1. 在上一篇文章中也有许多小伙伴问老猫流程图是用什么画的。其实都相同的,老猫一般制作这种图就用两种工具软件,一种是drawio,别的一种是wps中的流程图制作。当然其实还有其他制作工具,例如process on等等,我们能够自己去试试。

写在最后

为了让小猫更好地优化整理烂怂代码,老猫花了好几个晚上整理出来了制作的办法。其实无论是多么复杂的类,只需我们掌握清楚其间的类图联系,然后再结合上一篇文章中的事务模型对照起来一起看,就很明晰了。当然,前提是需求有满足的耐心。

当然老猫费劲汗水整理uml的类图制作流程其实还有一个原因,便是接下来我们要敞开“风趣的规划形式之旅”了。小伙伴们,继续关注老猫吧,信任后文更精彩。