1
00:00:01,090 --> 00:00:06,010
首先我们来看通讯录的一个实例
2
00:00:07,140 --> 00:00:09,570
上过之前的分析设计高阶
3
00:00:09,580 --> 00:00:11,080
或者说以前叫
4
00:00:11,090 --> 00:00:12,760
领域驱动设计的课程的同学
5
00:00:12,770 --> 00:00:16,330
可能幻灯片看到过
6
00:00:18,910 --> 00:00:21,780
我们也是在这个基础上进一步深化的
7
00:00:23,780 --> 00:00:26,330
这个图我就直接拿来借用了
8
00:00:27,440 --> 00:00:29,670
因为这是虚构的
9
00:00:30,350 --> 00:00:32,550
你要再虚构这么一个人
10
00:00:32,960 --> 00:00:35,620
要替换要什么还挺麻烦的
11
00:00:35,870 --> 00:00:39,340
还是拿邓超越邓总来说事了
12
00:00:41,840 --> 00:00:45,290
邓总有这么一些联系方式
13
00:00:45,820 --> 00:00:47,810
当然他还有一些其他的
14
00:00:49,150 --> 00:00:50,720
是非联系方式的
15
00:00:51,620 --> 00:00:52,890
职务什么我们先不管了
16
00:00:52,980 --> 00:00:58,260
我们先看通讯录这部分,直接搬运过来
17
00:00:58,670 --> 00:00:59,860
这肯定是不好的了
18
00:01:01,120 --> 00:01:04,380
这样列过来,倒是直截了当
19
00:01:04,390 --> 00:01:09,680
而且迎合文盲的水平了
20
00:01:09,690 --> 00:01:12,450
但是这个结构是不好的
21
00:01:12,460 --> 00:01:15,880
因为他违反第一范式
22
00:01:16,860 --> 00:01:19,520
同样的一个内容
23
00:01:19,530 --> 00:01:21,150
你搞了多个属性
24
00:01:22,840 --> 00:01:24,480
而且你这123,4怎么办
25
00:01:24,730 --> 00:01:25,680
还有更多怎么办
26
00:01:26,830 --> 00:01:28,180
这个结构显然是不好扩张的
27
00:01:28,730 --> 00:01:33,130
它把数据的变化
28
00:01:33,140 --> 00:01:36,550
就直接体现在了结构的变化上面
29
00:01:37,890 --> 00:01:39,290
我有多个电话,就变成
30
00:01:39,300 --> 00:01:42,580
我有多个电话的字段了,那不行
31
00:01:46,470 --> 00:01:50,470
所以首先要把它分离出去
32
00:01:51,460 --> 00:01:52,700
多个分离出来
33
00:01:53,600 --> 00:01:55,790
电话号码,手机号码
34
00:01:55,800 --> 00:01:57,690
电子邮件,这样来
35
00:01:58,190 --> 00:01:59,340
这个也是可以的
36
00:02:00,850 --> 00:02:04,490
如果说没有太复杂的要求,这样也行
37
00:02:04,500 --> 00:02:05,730
把多个的分离出去
38
00:02:05,740 --> 00:02:09,230
一个的放里面,或者你就放里面
39
00:02:09,240 --> 00:02:10,750
然后标多个就行了
40
00:02:11,210 --> 00:02:14,120
在电话后面加一个*
41
00:02:14,480 --> 00:02:17,430
表示这是多个,也行
42
00:02:17,560 --> 00:02:18,750
不用搞这个出来
43
00:02:23,430 --> 00:02:26,930
但是又有一个问题,就是说
44
00:02:26,940 --> 00:02:30,870
联系手段的废弃
45
00:02:31,260 --> 00:02:33,500
和新兴的添加
46
00:02:33,510 --> 00:02:34,780
出来新的类型的问题
47
00:02:35,030 --> 00:02:36,780
比如说,以前的传真号、MSN
48
00:02:37,220 --> 00:02:40,810
还有传呼机BP机
49
00:02:40,820 --> 00:02:42,050
现在都没有了
50
00:02:43,980 --> 00:02:46,640
当时如果说我们做了一个模型
51
00:02:46,950 --> 00:02:49,210
上面有MSN、有BP机
52
00:02:49,220 --> 00:02:50,330
有传真号
53
00:02:52,240 --> 00:02:53,720
但是没有微信微博
54
00:02:55,500 --> 00:02:58,360
这个结构本身就失效了
55
00:03:00,690 --> 00:03:02,000
如果说不想失效
56
00:03:02,210 --> 00:03:03,410
有的就会拿
57
00:03:03,420 --> 00:03:05,890
比如说,传真意思就是微信的意思
58
00:03:06,490 --> 00:03:09,520
把不用的拿出来用
59
00:03:09,530 --> 00:03:11,230
MSN就是微博的意思
60
00:03:13,510 --> 00:03:15,580
这显然也是不好的
61
00:03:16,900 --> 00:03:18,440
所以这个里面
62
00:03:18,450 --> 00:03:20,740
我们就不能把一些
63
00:03:21,520 --> 00:03:24,810
容易变化的内容
64
00:03:24,820 --> 00:03:28,380
可以直接就硬性的来建模了
65
00:03:29,580 --> 00:03:33,670
必须建模一些比较常驻的
66
00:03:33,680 --> 00:03:38,710
就是说,现在有,以后也有的,这样一些概念
67
00:03:39,950 --> 00:03:42,460
像MSN现在就没有了
68
00:03:42,870 --> 00:03:44,970
20年前有
69
00:03:45,100 --> 00:03:46,250
现在没有了
70
00:03:46,760 --> 00:03:47,620
微信现在有
71
00:03:47,630 --> 00:03:50,210
但是20年前就没有
72
00:03:50,220 --> 00:03:52,440
10年之后有没有就不知道了
73
00:03:56,110 --> 00:04:00,620
所以,哪些概念是我们过去有
74
00:04:00,630 --> 00:04:02,370
现在有、以后也有的
75
00:04:03,870 --> 00:04:04,950
比如说,联系方式
76
00:04:06,950 --> 00:04:09,190
这个是过去有
77
00:04:09,200 --> 00:04:10,510
现在有以后也有的
78
00:04:11,270 --> 00:04:13,120
我们必须要把我们的模型
79
00:04:14,300 --> 00:04:16,100
建立在这样的概念上面
80
00:04:17,050 --> 00:04:21,300
不能直接MSN、传真这样
81
00:04:23,910 --> 00:04:26,990
或者说,我们至少要在这个层次上来操作
82
00:04:28,510 --> 00:04:29,790
来编写我们的程序
83
00:04:31,880 --> 00:04:35,820
下面的这些我们可以把它变成子类
84
00:04:36,090 --> 00:04:38,340
就可以通过泛化来隔离变化
85
00:04:38,740 --> 00:04:43,740
但是我们用来做计算的时候
86
00:04:47,960 --> 00:04:49,070
我们只到这一层
87
00:04:49,460 --> 00:04:52,240
下面这个我们不能直接去使用它的
88
00:04:53,050 --> 00:04:54,040
只能到这一层
89
00:04:56,730 --> 00:04:58,280
通过泛化来隔离变化
90
00:05:01,120 --> 00:05:03,960
显然我们讲到类建模的时候
91
00:05:04,540 --> 00:05:05,530
包括我们前面讲
92
00:05:07,050 --> 00:05:08,810
分析设计高阶的时候也说了
93
00:05:10,380 --> 00:05:12,200
这个幻灯片大家都见过了
94
00:05:13,730 --> 00:05:18,570
就是说,如果能用关联解决的,关联优先
95
00:05:19,310 --> 00:05:23,040
也就是说,我们一个关系
96
00:05:24,210 --> 00:05:29,860
我们可能可以用泛化方式来解决
97
00:05:31,160 --> 00:05:34,500
人分为男人女人两个子集
98
00:05:37,510 --> 00:05:40,310
那就是子类、超类的泛化关系
99
00:05:41,740 --> 00:05:44,980
但是我们也可以说人有性别
100
00:05:46,590 --> 00:05:48,960
我们把男人女人这些
101
00:05:49,970 --> 00:05:52,000
可以看作性别的一个实例
102
00:05:52,010 --> 00:05:56,430
人有性别,这样就完了
103
00:05:58,770 --> 00:06:02,120
然后本来我们是说这上面计税
104
00:06:02,680 --> 00:06:03,630
下面计税
105
00:06:03,640 --> 00:06:08,610
然后各自实现自己的计税的计算方式
106
00:06:08,620 --> 00:06:09,090
107
00:06:10,180 --> 00:06:12,770
如果说这里面还能提炼出来的话
108
00:06:13,440 --> 00:06:15,120
它们的区别就在于一个税率
109
00:06:16,420 --> 00:06:20,080
那么我们就用上面这个
110
00:06:21,160 --> 00:06:23,190
税费=收入*性别.税率,就可以了
111
00:06:24,100 --> 00:06:25,100
不需要下面这个
112
00:06:25,110 --> 00:06:28,640
但如果说更复杂了
113
00:06:29,740 --> 00:06:30,460
没办法了
114
00:06:31,190 --> 00:06:35,010
必须通过行为的差别来解决
115
00:06:36,500 --> 00:06:37,930
必须要引进泛化关系
116
00:06:38,610 --> 00:06:39,400
这个没有问题
117
00:06:40,640 --> 00:06:41,820
当然不引进泛化关系
118
00:06:41,830 --> 00:06:47,230
你在类里面用条件分支也可以
119
00:06:47,360 --> 00:06:50,360
这两个是互相可以替换的
120
00:06:50,530 --> 00:06:52,440
就是说,我们把泛用关系
121
00:06:52,450 --> 00:06:57,270
延迟到不得不用的地方
122
00:06:59,060 --> 00:07:00,300
这个我们前面说过了
123
00:07:02,550 --> 00:07:05,440
所以这里面我们就会说到一个
124
00:07:05,450 --> 00:07:08,830
在各种各样的模式里面
125
00:07:09,000 --> 00:07:10,430
特别是分析模式里面
126
00:07:12,580 --> 00:07:14,140
用的一个转换的方式
127
00:07:15,230 --> 00:07:18,390
把泛化转成类、类类型这样的关联
128
00:07:21,120 --> 00:07:23,630
像刚才性别就是一个类类型
129
00:07:25,860 --> 00:07:28,290
类类型这个,是我这边的称呼了
130
00:07:30,270 --> 00:07:35,040
历史上也有一些
131
00:07:35,050 --> 00:07:38,410
方法学家归纳了类似的模式
132
00:07:39,540 --> 00:07:41,230
它们的叫法各自不同
133
00:07:41,360 --> 00:07:45,620
比如说Odell叫
134
00:07:45,630 --> 00:07:46,740
power type
135
00:07:49,590 --> 00:07:55,820
强力类型
136
00:07:56,350 --> 00:08:03,350
就类型上面的类型,树,树的类别,树种
137
00:08:04,490 --> 00:08:06,200
这是1994年的了