[面向对象程序设计] 第二章: 对象建模

对象的属性(properties), 消息传递(message passing), 可到达性(navigability)

  • 对象模型
    • 数据 + 操作

[面向对象程序设计] 第二章: 对象建模

  • 冒号后面的Part : 类名

  • 下划线 : 表示一个具体的对象

  • 冒号前面的myScrew : 对象的名字

  • 对象的属性

    • 状态 : 对象中数据的集合
    • 行为 : 对象中函数的集合
    • 标识 : 对象在内存中的地址
    • 名字 : 设计中对象的别名, 可能和代码中名字一样, 也可能不一样.
  • 一些对象模型中的数据会被重复

    • 浪费了存储空间
    • 对持续性的对所有对象更新造成了困难
      [面向对象程序设计] 第二章: 对象建模
  • 冒号后面 : 类名

  • 冒号前面 : 对象名, 可以为空

  • 下划线 : 表示一个具体对象

  • 有方向的箭头 ; 对象间的可到达性 (Navigability), 表示通过Part的对象可以到达/遍历到CatalogueEntry的对象
    [面向对象程序设计] 第二章: 对象建模
    [面向对象程序设计] 第二章: 对象建模

  • 私有属性里的指针 表示 UML图中的 Navigability

[面向对象程序设计] 第二章: 对象建模

  • Message Passing : 箭头上面是消息传递区域
  • cost : 消息名字
  • () : 需要传递的参数
  • 0.02:= : 返回的信息

例子

[面向对象程序设计] 第二章: 对象建模

  • 一个部件包含有三个零件, 这三个零件分别属于两个类

[面向对象程序设计] 第二章: 对象建模

  • 一个部件包含一个零件和一个更小的部件, 更小的部件包含两个零件, 这些零件属于两个类
  • 存在的问题
    • contains 通过指针实现, 但是这个指针的类型不确定, 因为代码中无法同时指向Part和Assembly
  • 解决办法
    • 引入一个新的基类Component, 既可以是Part也可以是Assembly
      [面向对象程序设计] 第二章: 对象建模
  • * : 一个Assembly 对应任意个Component
  • 0…1 : 一个Component 对应一个或者零个Assembly
    • 0 : 一个单独的Part不属于任何Assembly
    • 1 : 一个属于Assembly的Part

[面向对象程序设计] 第二章: 对象建模

  • 上面的contains 使用一个 Component的指针即可

[面向对象程序设计] 第二章: 对象建模

  • 多态性 : 同样的Component类的对象, Part接收到Cost消息后是发送getCost, Assembly接收到Cost消息后是转发Cost

  • 类图

    • 对象图: 只能描述程序可能状态里的一小部分
    • 类图是从一个更加抽象的层面描述软件系统
      • 和对象图类似
      • 显示了属性的类别
      • 继承
      • 关联

[面向对象程序设计] 第二章: 对象建模

  • 类名下没有下划线
  • 属性前的小锁表示私有属性
  • 属性后的为数据类型

面向对象程序的优势

  • 对象封装了数据和操作
  • 对真实世界进行了建模, 真实世界的对象+事件 映射成了 对象+消息