公开讲座——动态面向对象建模

背景

面向对象设计领域的著作汗牛充栋,其中不乏大师精品。然而大部分研究对象(或者说描述对象)都是静态的模型,典型的如——设计模式、SOLID等等。

在开始介绍动态面向对象建模之前,我们先来给动态面向对象建模下个定义。

静态模型

动态模型

备注

静态模型

动态模型

备注

Class

Object

一个Bird类是静态模型;一只麻雀是动态模型。后者考虑具体的这个实例的生命周期——创建、初始化、装配、解构、销毁等等。

Attribute

State

Bird类里面包含一个Eye属性;一只麻雀的左眼。麻雀眼睛是不是要闭上?

Method

Interactions

Bird累里面包含一个Fly方法;一只企鹅的Fly方法是应该抛出异常,还是实现为跳跃?

Class relationship

Object relationship

Bird类是Animal的子类;这只麻雀是另一只麻雀的妈妈。

Responsibility

Business Logic

Bird类负责鸟的鸣叫、飞行、睡眠等操作;一只麻雀睡觉的时候是不是要闭上眼睛。

掌握动态建模的必要性

每个人每天都在做动态建模,所有的设计最终都落实在动态建模上面,无论是有意识的还是无意识的。当你写下 new Order()的的时候你就在决定如何初始化一个订单的实例。这里面有多少个决策点?

  1. Order的属性是在构造函数传入还是用Setters传入?

  2. Order是自己创建还是由框架装配?

  3. Order是否是一个POJO?为什么?

  4. Order是否可以保存自己?Active Record vs Data Mapper

  5. Order是否是Immutable的?

动态建模本身的困难和教学上的困难

一个例子——武夷山茶铺

 根据以下规则计算商品总价:

  • 江浙沪100元以上免运费;

  • 大陆其他地区运费为价格的3%;

  • 澳大利亚加收商品税10%,运费为价格的5%;

  • 其他国际地区加收商品税17%,运费为价格的7%。

客户地址

商品税

订单价格

运费标准

客户地址

商品税

订单价格

运费标准

江浙沪

0

¥100

免运费

江浙沪

0

¥99.99

3%

大陆其他地区

0

¥100

3%

大陆其他地区

0

¥99.99

3%

澳大利亚

10%

¥50

5%

其他国际地区

17%

¥50

7%

我们先来尝试做一次静态建模

你可能注意到后面几个类我已经没有添加field和method了。因为我实在是不确定要加什么东西上去比较合适。

如果一个没有直观的办法被证明是错的,这一定不是一个好的设计,或者至少不是一个好的描述。好的设计激发问题、回答问题、促进沟通、迎接挑战。

进入正题来一次动态建模尝试

每个人打开 https://zenuml.com 自己尝试输入,不要复制粘贴。

第一步:设计最外层的接口

当你画出下面任何一个图的时候,你做了这么一件很重要的事情:

你有了一个,而且它有一个有用的方法

第二步:尝试实现