[图解]DDD领域驱动设计伪创新-聚合根01

 

 

 

 

 

 

 

0
00:00:00,070 --> 00:00:06,010
今天我们来说一下领域驱动设计的另外一个伪创新,聚合根

1
00:00:06,870 --> 00:00:09,440
这个我们分为几个部分来讲

2
00:00:12,610 --> 00:00:15,580
前面说过很多遍,伪创新

3
00:00:16,760 --> 00:00:17,510
特点

4
00:00:17,510 --> 00:00:19,010
一个改头换面

5
00:00:19,860 --> 00:00:22,390
把已有的东西换个名字

6
00:00:24,190 --> 00:00:26,370
第二个,画蛇添足

7
00:00:27,900 --> 00:00:30,059
为了体现自己的创新

8
00:00:30,059 --> 00:00:34,810
他在已有的东西上面非得加点东西或者改一点东西

9
00:00:35,960 --> 00:00:38,690
但是由于对这个知识的掌握

10
00:00:39,290 --> 00:00:40,060
可能

11
00:00:40,340 --> 00:00:41,300
不到位

12
00:00:41,690 --> 00:00:43,080
他加上去的

13
00:00:44,170 --> 00:00:45,550
往往是错的

14
00:00:47,230 --> 00:00:48,590
还不如不加

15
00:00:49,690 --> 00:00:52,070
我们前面也说过好几次

16
00:00:52,430 --> 00:00:53,750
学霸

17
00:00:54,150 --> 00:00:55,670
答了一张试卷

18
00:00:56,940 --> 00:00:57,578
然后呢

19
00:00:57,578 --> 00:00:59,280
旁边有一个学渣呢

20
00:00:59,770 --> 00:01:03,230
非得上来帮忙,帮学霸改一改

21
00:01:03,830 --> 00:01:04,560


22
00:01:04,970 --> 00:01:07,007
那一改,大概率是错的

23
00:01:07,007 --> 00:01:08,140
因为你

24
00:01:08,780 --> 00:01:10,201
水平摆在那里嘛

25
00:01:10,201 --> 00:01:10,810
对不对

26
00:01:11,220 --> 00:01:13,070
那还不如什么都不

27
00:01:13,430 --> 00:01:13,658


28
00:01:13,658 --> 00:01:15,940
什么都不干,是最佳的策略

29
00:01:16,750 --> 00:01:19,560
你非得露一手

30
00:01:19,990 --> 00:01:22,060
那往往就出问题了

31
00:01:26,560 --> 00:01:29,050
那聚合或者聚合根

32
00:01:31,400 --> 00:01:33,540
这个概念在

0
00:00:00,920 --> 00:00:05,890
书里面的话,主要的词就这个了,aggregate

1
00:00:06,890 --> 00:00:07,890
意思是

2
00:00:08,480 --> 00:00:10,390
聚合体

3
00:00:11,120 --> 00:00:15,010
另外一个就是root这个,根

4
00:00:16,850 --> 00:00:17,522
然后

5
00:00:17,522 --> 00:00:21,330
翻译就是这个,这样来

6
00:00:22,020 --> 00:00:24,811
当然这里有一个词用得不当

7
00:00:24,811 --> 00:00:27,404
我们后面还会再说这个问题

8
00:00:27,404 --> 00:00:28,800
原文本身用得就不当

9
00:00:29,140 --> 00:00:30,421
为什么不当

10
00:00:30,421 --> 00:00:33,351
我们后面还会说,这个次要问题

11
00:00:33,351 --> 00:00:34,450
我们最后再说

12
00:00:37,340 --> 00:00:39,380
那我们先说一下结论

13
00:00:41,940 --> 00:00:47,832
不管是aggregate,聚合,或者说aggregate root,聚合根

14
00:00:47,832 --> 00:00:48,160


15
00:00:48,930 --> 00:00:49,275


16
00:00:49,275 --> 00:00:50,310
这两个

17
00:00:50,840 --> 00:00:53,130
我认为都不鼓励使用

18
00:00:53,410 --> 00:00:54,370
其中

19
00:00:54,690 --> 00:00:58,470
这个aggregate属于冗余概念

20
00:00:59,170 --> 00:01:02,630
而聚合根呢,就属于错误概念

21
00:01:06,380 --> 00:01:09,020
我们来看一下,为什么是这样

22
00:01:11,160 --> 00:01:14,780
首先,我们先把几个概念给

23
00:01:15,480 --> 00:01:17,130
比较一下

24
00:01:18,130 --> 00:01:19,030
第一个

25
00:01:19,320 --> 00:01:20,580
aggregation

26
00:01:22,700 --> 00:01:24,580
我们叫聚合关联

27
00:01:26,030 --> 00:01:29,130
表示类和类之间的一种关联关系

28
00:01:30,830 --> 00:01:32,735
这个是比较常用的

29
00:01:32,735 --> 00:01:35,700
我们在很多书里面频繁出现

30
00:01:36,680 --> 00:01:37,006


31
00:01:37,006 --> 00:01:41,580
第二个,就是刚才的aggregate,就是聚合体

32
00:01:44,920 --> 00:01:49,870
或者说,就是聚合关联里面的整体对象

33
00:01:51,990 --> 00:01:53,310
这个也有用

34
00:01:53,660 --> 00:01:53,924


35
00:01:53,924 --> 00:01:59,470
但是相对于上面这个aggregation这个来说,用得比较少

36
00:02:01,390 --> 00:02:02,380
第三个

37
00:02:03,840 --> 00:02:06,400
aggregate root,这个就是

38
00:02:06,680 --> 00:02:09,960
Evans创造的了,聚合根

39
00:02:11,890 --> 00:02:13,870
我们来举一个例子

40
00:02:14,660 --> 00:02:16,450
把这几个概念给

41
00:02:17,490 --> 00:02:19,630
把它对比一下

42
00:02:20,310 --> 00:02:21,600
我们就用

43
00:02:21,910 --> 00:02:26,684
Grady Booch这个书里面说的一个植物的概念

44
00:02:26,684 --> 00:02:28,048
植物包括什么

45
00:02:28,048 --> 00:02:29,640
说的就是那个

46
00:02:30,520 --> 00:02:31,956
聚合组合关系嘛

47
00:02:31,956 --> 00:02:34,830
什么什么什么什么,植物这个

48
00:02:38,470 --> 00:02:40,327
植入包括这几个

49
00:02:40,327 --> 00:02:41,720


50
00:02:42,250 --> 00:02:43,490
这个这个这个

51
00:02:44,880 --> 00:02:46,660
我们把它画成

52
00:02:47,440 --> 00:02:48,810
类图

53
00:02:49,120 --> 00:02:50,250
植物

54
00:02:50,950 --> 00:02:53,866
由根、茎、叶组成

55
00:02:53,866 --> 00:02:54,960
这是类图

56
00:02:55,240 --> 00:02:55,830


57
00:02:56,680 --> 00:02:57,255

58
00:02:57,255 --> 00:02:58,980
然后这是一个

59
00:02:59,880 --> 00:03:02,870
组合的关联,聚合组合的关联

60
00:03:03,930 --> 00:03:05,720
如果画成对象

61
00:03:06,490 --> 00:03:08,770
那表示一个植物对象

62
00:03:09,360 --> 00:03:13,490
由若干的根对象、叶对象

63
00:03:13,770 --> 00:03:15,010
茎对象

64
00:03:15,290 --> 00:03:17,487
组成,可能根就一个

65
00:03:17,487 --> 00:03:22,616
不知道是不是一个,茎算一个?叶应该很多

66
00:03:22,616 --> 00:03:24,081
可能是多个

67
00:03:24,081 --> 00:03:25,302
也可能一个

68
00:03:25,302 --> 00:03:27,500
反正由很多对象组成

69
00:03:27,830 --> 00:03:28,055


70
00:03:28,055 --> 00:03:31,655
这些对象是来自于这些类的

71
00:03:31,655 --> 00:03:34,130
有的是多,有的是一

72
00:03:36,590 --> 00:03:37,900
那我们来看

73
00:03:39,070 --> 00:03:41,690
aggregation指的就是这个

74
00:03:42,810 --> 00:03:44,470
上面这个关系

75
00:03:46,290 --> 00:03:47,580
聚合关联

76
00:03:48,580 --> 00:03:52,570
而aggregate就是聚合体,指的就是

77
00:03:52,870 --> 00:03:55,393
对象级别的这个整体对象

78
00:03:55,393 --> 00:03:57,000
比如说,植物对象

79
00:03:59,210 --> 00:04:00,590
而聚合根呢

80
00:04:01,570 --> 00:04:03,130
指的也是植物

81
00:04:05,300 --> 00:04:06,330
2和3

82
00:04:06,660 --> 00:04:08,740
其实并没有区别

83
00:04:09,320 --> 00:04:12,230
但是呢,我们后面会说到

84
00:04:13,100 --> 00:04:14,080
Evans

85
00:04:14,360 --> 00:04:14,586


86
00:04:14,586 --> 00:04:16,400
他就搞出一个区别

87
00:04:16,800 --> 00:04:17,043


88
00:04:17,043 --> 00:04:20,940
但这个区别上是不存在的,是错误的

89
00:04:22,020 --> 00:04:23,880
这个我们后面还会再说

90
00:04:26,230 --> 00:04:26,455

91
00:04:26,455 --> 00:04:30,280
这三个概念,我们就把它放在这个位置了


34
00:01:34,035 --> 00:01:36,400
Eric Evans这个书里面是这样的

0
00:00:00,390 --> 00:00:03,380
接下来呢,有一个要事先说明一下的

1
00:00:05,450 --> 00:00:09,030
面向对象里面还有另外一个关联叫组合

2
00:00:12,230 --> 00:00:15,900
组合可以看作是一种更严格的聚合

3
00:00:17,860 --> 00:00:18,081


4
00:00:18,081 --> 00:00:19,410
如果画成类图

5
00:00:19,880 --> 00:00:23,444
把这三个概念之间关系表达出来

6
00:00:23,444 --> 00:00:25,820
相当于UML的元模型嘛

7
00:00:26,300 --> 00:00:27,815
那应该是这样

8
00:00:27,815 --> 00:00:31,280
组合是聚合的一种,聚合是关联的一种

9
00:00:32,700 --> 00:00:34,280
但是呢,我们

10
00:00:35,690 --> 00:00:36,620
这个

11
00:00:37,140 --> 00:00:37,785
主题

12
00:00:37,785 --> 00:00:40,150
这个讨论主题只说到这里

13
00:00:41,620 --> 00:00:44,380
下面这两个的细微区别

14
00:00:44,810 --> 00:00:46,040
不影响

15
00:00:46,690 --> 00:00:48,250
本讨论主题

16
00:00:50,560 --> 00:00:52,379
我们在这个讨论中

17
00:00:52,379 --> 00:00:55,790
用语一律用aggregation、aggregate

18
00:00:57,550 --> 00:01:00,060
这是为了和DDD用语对应

19
00:01:01,050 --> 00:01:04,054
但是不代表说我主张用这两个词

20
00:01:04,054 --> 00:01:06,200
刚才也说过结论了

21
00:01:06,200 --> 00:01:07,917
这两个都不主张用

22
00:01:07,917 --> 00:01:11,780
我只主张用这个词就够了

23
00:01:16,400 --> 00:01:18,855
但是呢,为了和DDD用语对应

24
00:01:18,855 --> 00:01:21,720
我们这个讨论里面一律用这个

25
00:01:22,940 --> 00:01:26,167
这个也就代表了下面这个了

26
00:01:26,167 --> 00:01:27,579
因为这是超类嘛

27
00:01:27,579 --> 00:01:28,790
这个是子类

28
00:01:29,370 --> 00:01:31,540
适用于超类的规律

29
00:01:32,320 --> 00:01:34,869
肯定也适用于子类

30
00:01:34,869 --> 00:01:35,564
对不对

31
00:01:35,564 --> 00:01:37,650
因为你是他的一种嘛

32
00:01:40,320 --> 00:01:43,800
表示法我们一律用实心菱形

33
00:01:46,160 --> 00:01:47,950
那为什么不用空心呢

34
00:01:48,230 --> 00:01:48,473


35
00:01:48,473 --> 00:01:49,690
不是说那个

36
00:01:50,120 --> 00:01:53,186
实心菱形是组合的标记吗

37
00:01:53,186 --> 00:01:54,975
那个聚合是空心的

38
00:01:54,975 --> 00:01:57,020
这个后面再说

39
00:02:00,170 --> 00:02:02,721
同样的,在这里

40
00:02:02,721 --> 00:02:04,990
空心和实心的区别

41
00:02:05,520 --> 00:02:06,750
不影响

42
00:02:07,300 --> 00:02:09,020
本讨论主题

43
00:02:09,620 --> 00:02:12,723
我们只说到一个整体部分就行了

44
00:02:12,723 --> 00:02:12,945


45
00:02:12,945 --> 00:02:14,275
它是实心空心

46
00:02:14,275 --> 00:02:15,161
无所谓的

47
00:02:15,161 --> 00:02:17,600
不影响我们这个主题

48
00:02:21,690 --> 00:02:24,280
首先,我们就来看一下

49
00:02:24,830 --> 00:02:27,830
aggregate的问题

50
00:02:28,360 --> 00:02:30,220
聚合体

51
00:02:30,500 --> 00:02:31,360
的问题

52
00:02:34,890 --> 00:02:39,120
刚才我们画了类图了,这个

53
00:02:39,500 --> 00:02:41,555
aggregation指的是这个边

54
00:02:41,555 --> 00:02:42,240
对不对

55
00:02:42,590 --> 00:02:44,970
aggregate指的是这个结点

56
00:02:44,970 --> 00:02:45,500
对吧

57
00:02:46,630 --> 00:02:49,210
结点或者顶点都行

58
00:02:51,640 --> 00:02:54,329
首先我们要说的

59
00:02:54,329 --> 00:02:57,318
这两个的话早就有了

60
00:02:57,318 --> 00:03:00,904
既不是Eric创造的

61
00:03:00,904 --> 00:03:02,100
也不是

62
00:03:02,440 --> 00:03:05,420
后面的人创造的

63
00:03:05,950 --> 00:03:09,031
比较早就有,面向对象的一个概念嘛

64
00:03:09,031 --> 00:03:09,609
对不对

65
00:03:09,609 --> 00:03:10,380
而其中呢

66
00:03:11,230 --> 00:03:13,260
aggregation这个

67
00:03:14,230 --> 00:03:16,480
是常用的

68
00:03:16,900 --> 00:03:18,455
aggregate也用

69
00:03:18,455 --> 00:03:18,900
但是

70
00:03:19,180 --> 00:03:20,510
用得比较少

71
00:03:22,760 --> 00:03:24,100
比如说,我们

72
00:03:25,170 --> 00:03:26,840
去找以前的书

73
00:03:27,630 --> 00:03:27,866


74
00:03:27,866 --> 00:03:30,700
这个书,1991年的这个

75
00:03:32,810 --> 00:03:37,750
你看,这就有一节,讲aggregation的

76
00:03:38,110 --> 00:03:38,524


77
00:03:38,524 --> 00:03:40,180
聚合关联

78
00:03:40,460 --> 00:03:41,160


79
00:03:42,020 --> 00:03:45,110
当然里面也说到,你看,aggregate,这里

80
00:03:45,750 --> 00:03:47,026
aggregate在这里

81
00:03:47,026 --> 00:03:48,120
aggregate在这里

82
00:03:49,710 --> 00:03:50,420
对吧

83
00:03:51,060 --> 00:03:53,890
但是标题是用这个

84
00:03:55,780 --> 00:03:57,660
他不是用这个

85
00:03:59,580 --> 00:03:59,763


86
00:03:59,763 --> 00:04:01,230
没有用这个做标题

87
00:04:01,510 --> 00:04:01,766


88
00:04:01,766 --> 00:04:05,098
显然这个aggregation才是什么

89
00:04:05,098 --> 00:04:06,380
才是重点

90
00:04:06,920 --> 00:04:08,110
那我们可以再看

91
00:04:08,610 --> 00:04:10,570
UML参考手册

92
00:04:11,130 --> 00:04:11,870
你看

93
00:04:12,370 --> 00:04:12,613


94
00:04:12,613 --> 00:04:14,560
aggregate只有一行

95
00:04:15,280 --> 00:04:17,100
而aggregation

96
00:04:17,880 --> 00:04:19,910
有三页半的内容

97
00:04:27,660 --> 00:04:28,540
为什么

98
00:04:29,990 --> 00:04:30,224


99
00:04:30,224 --> 00:04:32,800
为什么这两个待遇不一样

100
00:04:34,110 --> 00:04:36,420
原因就是,聚合

101
00:04:37,190 --> 00:04:39,090
实际是一种关系

102
00:04:39,870 --> 00:04:42,300
整体-部分的关系

103
00:04:43,570 --> 00:04:47,652
说的是两个类之间的整体-部分的关系

104
00:04:47,652 --> 00:04:49,830
它是边,它不是结点

105
00:04:55,940 --> 00:04:58,380
比如说,刚才我们说那个植物

106
00:05:00,300 --> 00:05:01,050
你看

107
00:05:01,700 --> 00:05:05,009
我们刚才只画到了这里,是吧

108
00:05:05,009 --> 00:05:06,940
植物、根、茎叶,对吧

109
00:05:07,810 --> 00:05:12,110
我们说植物是整体,或植物是一个aggregate

110
00:05:12,400 --> 00:05:14,420
是一个聚合体

111
00:05:14,720 --> 00:05:15,580
对吗

112
00:05:16,540 --> 00:05:17,980
好像是对的

113
00:05:19,000 --> 00:05:20,320
但实际上

114
00:05:22,740 --> 00:05:24,300
这样说

115
00:05:24,600 --> 00:05:25,894
没有意义的

116
00:05:25,894 --> 00:05:26,972
或者说,不严谨的

117
00:05:26,972 --> 00:05:27,620
为什么

118
00:05:30,000 --> 00:05:35,070
植物只有在和根茎叶发生关系的时候

119
00:05:35,350 --> 00:05:37,230
才扮演了一个什么

120
00:05:38,050 --> 00:05:39,700
整体的角色

121
00:05:40,230 --> 00:05:41,130
对不对

122
00:05:41,910 --> 00:05:44,810
这个整体-部分只是一个角色

123
00:05:45,220 --> 00:05:46,462
并不是说,你就是整体

124
00:05:46,462 --> 00:05:48,060
你就是部分,不是这样的

125
00:05:48,340 --> 00:05:49,790
看你跟谁比

126
00:05:51,540 --> 00:05:53,503
跟你自己的部件比

127
00:05:53,503 --> 00:05:54,240
你就是

128
00:05:54,630 --> 00:05:55,500
整体

129
00:05:56,950 --> 00:05:57,968
而跟别人比

130
00:05:57,968 --> 00:06:00,005
可能你就是零件

131
00:06:00,005 --> 00:06:00,616
对不对

132
00:06:00,616 --> 00:06:03,060
你看,我们再往外画一圈

133
00:06:03,660 --> 00:06:05,560
画一个生态圈

134
00:06:09,190 --> 00:06:09,940


135
00:06:11,030 --> 00:06:14,120
你看,这里,这个就是整体

136
00:06:14,400 --> 00:06:16,992
这个就是里面的部分了

137
00:06:16,992 --> 00:06:17,700
对不对

138
00:06:20,250 --> 00:06:22,622
所以呢,你不能说,这个是整体

139
00:06:22,622 --> 00:06:24,600
不能这样的

140
00:06:25,490 --> 00:06:26,530
所以呢

141
00:06:29,040 --> 00:06:30,960
任何一个对象

142
00:06:31,280 --> 00:06:32,910
它都可以是整体

143
00:06:33,390 --> 00:06:35,480
也可以是部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值