dushaoshuai / dushaoshuai.github.io

https://www.shuai.host
0 stars 0 forks source link

类图(Class diagrams) #117

Open dushaoshuai opened 1 year ago

dushaoshuai commented 1 year ago

(本文主要关注 Relationships) (想弄清楚这些关系怎样对应到 Go 里) (!!!我好像还是没有分清楚聚合和组合的区别!!!)

定义关系

继承(Inheritance)

Is-A

子类型继承父类型。

classDiagram
    direction LR
    subtype --|> supertype : Inheritance

聚合(Aggregation)

Has-A

一种较弱的联系,两者可以相互独立存在,有各自的生命周期。

classDiagram
    direction LR
    component --o composite : Aggregation

组合(Composition)

Contains-A

一种较强的(强于聚合)联系,一方拥有另一方,两者不能独立存在。

classDiagram
    direction LR
    component --o composite : Composition

实现(Realization)

classDiagram
    direction LR
    class stringsReader["*strings.Reader"]
    class ioReader["io.Reader"]
    <<interface>> ioReader
    stringsReader ..|> ioReader : Realization

依赖(Dependency)

classDiagram
    direction LR
    A ..> B : Dependency

联系(Association)

TODO 就是表示有关系吧。

classDiagram
    direction LR
    A --> B
    C -- D
    E .. F

Go 中的关系如何表示

类型实现接口

个人感觉有两种表示方式,继承和实现,但我更偏向实现吧。

classDiagram
    direction LR
    class stringsReader["*strings.Reader"]
    class ioReader["io.Reader"]
    <<interface>> ioReader
    stringsReader ..|> ioReader : Realization
classDiagram
    direction LR
    class stringsReader["*strings.Reader"]
    class ioReader["io.Reader"]
    <<interface>> ioReader
    stringsReader --|> ioReader : Inheritance

结构体字段

有名字字段和匿名字段(嵌入)先都用组合表示吧。

(可能是没写过真正的 OOP 的原因,我感觉现在无法分辨聚合和组合。)

classDiagram
    direction LR
    class netIPConn["net.IPConn"]{
        - conn
    }
    class netconn["net.conn"]{
        - fd *netFD
    }
    class netnetFD["net.netFD"]{
        - pfd poll.FD
    - family      int
    - sotype      int
    - isConnected bool
    - net         string
    - laddr       Addr
    - raddr       Addr
    }
    netconn --* netIPConn : Composition
    netnetFD --* netconn: Composition

参见