JavaScript面向对象之UML类图

UML类图

什么是UML类图

UML(Unified Modeling Language)类图,中文意思为“统一建模语言”,我们之所以要在面向对象中介绍它,是因为,我们在后面的设计模式中,每一种模式,都有它对应的类图,它作为一种概述的表达来反应我们的设计,我们可以不用面对代码,只面对这样的类图,来进行前期的设计讨论。对于UML,其内容也是非常多,我们只关注其“类图”概念,这样和我们讲的面向对象和将来要将的设计模式关系比较紧密。

画图工具

如何画类图

我们先来看一个类图



这是我在画图工具上,拖出了一个类,其默认样式,其中,有一些符号这里先做一个简单的介绍

  1. 我们最终生成的类图,为三行,第一行为“类名”,第二行为属性,第三行为方法。

  2. 其中,“+”表示public,“#”表示protected,“-”表示private

  3. 在定义属性好方法的参数的时候,都可以在其后面用“:”定义其数据类型

下面我们将下面这个类用UML类图的形式表现出来

class People {
    constructor(name, age) {
        this.name = name
        this.age = age
    }
    eat () {
        alert(`${this.name} eat someThing`)
    }

    speak () {
        alert(`My name is ${this.name}, age ${this.age}`)
    }
}

在画UML类图的时候,我们无需关心其内部的实现方法,只需要用类图表现出来即可。按照上面我们的规则,画出的类图如下


UML类图之间的关系

我们在实际开发中,不可能只有一个类,一定是在一些类之间存在着某些关系,如组合,继承等常见的类之间的关系。那么我们如何在UML类图中表示这样的关系呢?
关于UML类图之间的关系呢,也是分好多种,但是我们也只是介绍和我们JS相关的常用关系,其中

  • 泛化,表示继承
  • 关联,表示引用

那么我们如何使用UML类图来表示这种关系呢?我们先开看一下下面这段代码

class People {
    constructor (name, house) {
        this.name = name
        this.house = house
    }

    saySomething () {
        console.log('I am People')
    }
}

class A extends People {
    constructor (name, house) {
        super(name, house)
    }
    saySomething () {
        console.log('I am A')
    }
}

class B extends People {
    constructor (name, house) {
        super(name, house)
    }
    saySomething () {
        console.log('I am B')
    }
}

class House {
    constructor(city) {
        this.city = city
    }

    showCity () {
        console.log(this.city)
    }
}

const aHouse = new House('beijing')
const a = new A('a', aHouse)
const b = new B('b')
b.saySomething()

上面的代码比较简单,其类之间的关系为A和B继承于People,House和People为关联关系,因为我们将House的实例传给个A的构造函数。那么我们如何将上面的类关系用UML类图的形式表现出来呢?如下图:



针对上图,我们解析以下几点

  • 因为A和B的属性全部继承自People,所以A和B的属性行可以不写
  • 继承关系使用直线空心箭头来指向父类
  • House和People为引用关系,People中的house属性为House类型,所以由People指向House,使用直线实心箭头

这样,我们就使用UML类图,对上面的代码进行了描述和设计,我们无需关注代码的实现,在设计初期就能使用UML类图很好的反应出各个类之间的关系。

UML类图总结

  • UML为“一列三行”的表格,每一行分别表示类名、属性、方法
  • UML类图可以通过不同的表格连线表示类之间的关系:泛化(继承)、关联(引用)
  • UML类图远比本文介绍的复杂,后续要多画多练习,结合设计模式(看后续文章)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。