1
00:00:01,400 --> 00:00:06,070
接下来,我们来看一下表模块这个模式了
2
00:00:07,380 --> 00:00:11,160
这个模式同样是
3
00:00:11,170 --> 00:00:13,600
领域逻辑类型的模式
4
00:00:16,030 --> 00:00:17,690
跟在事务脚本后面
5
00:00:23,330 --> 00:00:32,310
表模块,它的名字,你看,以表来组织的模块了
6
00:00:33,690 --> 00:00:36,290
你看它的定义,处理某一个数据库表
7
00:00:37,430 --> 00:00:39,420
不一定是表,也可以是视图
8
00:00:40,450 --> 00:00:44,960
所有行的业务逻辑的一个单一实例
9
00:00:45,890 --> 00:00:48,020
之前的译文都没有着重说单一
10
00:00:48,300 --> 00:00:50,310
因为原文它有个single
11
00:00:51,570 --> 00:00:54,490
所以单一实例
12
00:00:54,500 --> 00:00:55,810
也就是说一个实例
13
00:00:55,820 --> 00:00:58,290
处理所有的
14
00:00:59,820 --> 00:01:02,220
跟所有行相关的逻辑
15
00:01:04,700 --> 00:01:06,690
既然它只有一个实例的话
16
00:01:07,670 --> 00:01:08,460
意味着什么
17
00:01:08,950 --> 00:01:10,750
如果你要处理单行
18
00:01:10,760 --> 00:01:16,270
那就是得用ID这个参数了
19
00:01:19,450 --> 00:01:22,360
这点跟表数据入口是很类似的
20
00:01:23,340 --> 00:01:25,410
表数据入口也是一个实例处理
21
00:01:25,900 --> 00:01:27,860
一个表里面所有行,只不过它处理的
22
00:01:27,870 --> 00:01:30,640
是数据方面的逻辑
23
00:01:31,560 --> 00:01:35,430
而我们这个是领域逻辑,是业务逻辑
24
00:01:37,970 --> 00:01:38,920
这个表模块
25
00:01:38,930 --> 00:01:41,800
你看它名字,是跟实体类一模一样
26
00:01:44,280 --> 00:01:47,360
所以它会给人造成一种误解或错觉
27
00:01:47,370 --> 00:01:48,800
以为这个就是面向对象
28
00:01:49,970 --> 00:01:50,600
实际上不是
29
00:01:51,280 --> 00:01:55,660
你看,它这里面连属性都没有
30
00:01:56,510 --> 00:01:59,620
面向对象,它说行为跟属性结合
31
00:01:59,980 --> 00:02:01,230
有状态
32
00:02:02,070 --> 00:02:05,840
状态把这两个黏连起来
33
00:02:06,880 --> 00:02:09,040
你属性都没有,哪有什么状态
34
00:02:09,620 --> 00:02:11,400
所以它只是名字是这个而已
35
00:02:12,210 --> 00:02:14,590
实例化之后得到的一个对象
36
00:02:14,600 --> 00:02:17,190
也不是代表一个合同,而是什么
37
00:02:17,900 --> 00:02:19,190
代表一个合同表
38
00:02:19,880 --> 00:02:21,120
里面的所有的合同
39
00:02:22,430 --> 00:02:23,930
它不是一个合同对象
40
00:02:24,470 --> 00:02:26,380
所以它不管调用什么操作
41
00:02:26,390 --> 00:02:30,110
你看,ID ID ID ID,这里
42
00:02:30,120 --> 00:02:30,510
对吧
43
00:02:34,130 --> 00:02:38,370
所以它本质上还是面向过程
44
00:02:39,020 --> 00:02:40,020
不是面向对象
45
00:02:43,450 --> 00:02:45,440
这个跟事务脚本相比
46
00:02:47,020 --> 00:02:49,470
实际上就是把面向过程伪装了一下
47
00:02:50,300 --> 00:02:54,940
把它伪装成类似对象的形式
48
00:02:55,500 --> 00:02:57,830
面向过程就是我们前面事务脚本
49
00:02:58,210 --> 00:02:59,420
就是一个什么service
50
00:02:59,910 --> 00:03:01,230
然后里面一个个方法
51
00:03:01,240 --> 00:03:02,510
你看,这些方法
52
00:03:03,740 --> 00:03:04,840
这里,这个方法
53
00:03:06,000 --> 00:03:06,800
还有这些方法
54
00:03:08,140 --> 00:03:10,420
我们前面那个事务脚本都有,对吧
55
00:03:11,930 --> 00:03:14,000
只不过它是放在什么service里面
56
00:03:14,010 --> 00:03:19,550
而现在,装模作样地把它分到类里面去
57
00:03:20,120 --> 00:03:23,120
这个类,这个类,有个责任分配
58
00:03:23,990 --> 00:03:26,540
但实际上它还是面向对象(口误:过程)的
59
00:03:28,600 --> 00:03:30,490
只不过这里是把这个逻辑
60
00:03:30,620 --> 00:03:31,850
再按这个表
61
00:03:33,340 --> 00:03:35,220
或者是实体类分了一下组
62
00:03:36,750 --> 00:03:38,320
前面事务脚本也有分组
63
00:03:38,410 --> 00:03:40,280
可能是按用例、按主题
64
00:03:40,750 --> 00:03:42,100
主题实际上应该就类似于
65
00:03:42,110 --> 00:03:43,850
用例的一个集合了
66
00:03:44,110 --> 00:03:46,720
来分组
67
00:03:46,730 --> 00:03:49,430
而这里是按照类分组
68
00:03:52,460 --> 00:03:55,860
分组的时候操作要放到哪个类
69
00:03:57,640 --> 00:04:01,700
要看主要用到的数据
70
00:04:02,960 --> 00:04:06,470
如果这个操作用的数据
71
00:04:06,480 --> 00:04:09,270
是跟合同这个表里面数据有关的
72
00:04:10,060 --> 00:04:11,000
就放在合同里
73
00:04:12,000 --> 00:04:12,790
这个放在这里
74
00:04:12,800 --> 00:04:15,390
这个放这里,很可能意味着什么
75
00:04:16,420 --> 00:04:19,430
这里面用到的数据跟这个表有关
76
00:04:20,100 --> 00:04:24,140
这点倒是和面向对象的责任分配
77
00:04:24,470 --> 00:04:25,820
专家原则
78
00:04:26,150 --> 00:04:27,170
专家模式
79
00:04:27,180 --> 00:04:29,280
就是说,你分配的责任
80
00:04:29,290 --> 00:04:34,370
跟你拥有的资源是匹配的
81
00:04:34,540 --> 00:04:36,170
这个地方很相像
82
00:04:39,100 --> 00:04:42,390
这是我们的表模块的模式
1
00:00:01,140 --> 00:00:05,230
接下来,就是书里面的序列图了
2
00:00:06,840 --> 00:00:07,760
前面是类图
3
00:00:08,680 --> 00:00:12,300
这个序列图就展示了这个表模块
4
00:00:14,840 --> 00:00:16,900
还有表数据入口
5
00:00:17,950 --> 00:00:19,310
它们怎么协作的
6
00:00:21,220 --> 00:00:25,030
首先,这个表示层过来一个请求
7
00:00:25,920 --> 00:00:31,120
然后,它先通过表数据入口
8
00:00:31,130 --> 00:00:35,050
这个时候,这个表示层跟表数据入口
9
00:00:35,060 --> 00:00:36,730
是直接依赖的
10
00:00:36,860 --> 00:00:39,890
直接调用这个表数据入口
11
00:00:42,380 --> 00:00:43,430
然后,它这里
12
00:00:44,550 --> 00:00:47,500
由它来把数据库里面的数据
13
00:00:47,510 --> 00:00:49,620
组装成一个记录集
14
00:00:53,230 --> 00:00:58,130
然后再由这个表示,记录集返回到这里
15
00:00:58,140 --> 00:01:01,640
然后再由表示找这个表模块
16
00:01:01,770 --> 00:01:04,520
表模块这里属于业务层,或者领域层
17
00:01:05,940 --> 00:01:10,870
然后以记录集为参数创建表模块
18
00:01:10,880 --> 00:01:14,260
然后针对这个表模块
19
00:01:14,430 --> 00:01:19,940
调用它的一个领域逻辑的操作
20
00:01:20,600 --> 00:01:25,580
让它应用这个领域逻辑,这样的一个过程
21
00:01:26,340 --> 00:01:32,290
这里,记录集,我们在做数据库开发的时候
22
00:01:32,500 --> 00:01:33,770
特别是早年的时候
23
00:01:33,780 --> 00:01:35,890
没有用映射器的时候
24
00:01:36,660 --> 00:01:37,900
基本上都用到的
25
00:01:38,730 --> 00:01:40,690
实际上就是内存里面的一个
26
00:01:41,920 --> 00:01:44,780
把数据库的这种结构放在内存里面
27
00:01:44,990 --> 00:01:46,740
临时放置在内存里面
28
00:01:48,050 --> 00:01:50,200
而且还可以断开连接
29
00:01:50,210 --> 00:01:52,840
也不影响你记录集里面使用
30
00:01:52,930 --> 00:01:54,960
只要你这个程序没有终止
31
00:01:57,400 --> 00:02:02,090
记录集,是书里面的一个称呼了
32
00:02:02,540 --> 00:02:03,970
不同的平台的话
33
00:02:03,980 --> 00:02:06,230
它有的叫法不一样
34
00:02:06,520 --> 00:02:09,220
有的叫记录集
35
00:02:10,580 --> 00:02:11,980
有的叫结果集
36
00:02:11,990 --> 00:02:13,380
有的叫数据集
37
00:02:14,290 --> 00:02:16,060
都是差不多的
38
00:02:16,070 --> 00:02:18,020
当然微妙上会有些区别
39
00:02:18,780 --> 00:02:20,370
这个概念是差不多的
40
00:02:20,380 --> 00:02:25,400
比如说,这是.net平台上面的数据集
41
00:02:28,070 --> 00:02:31,420
一个数据集有若干个数据表
42
00:02:33,750 --> 00:02:35,750
然后这个表里面有很多行
43
00:02:36,570 --> 00:02:43,510
这是它的角色,也就是它定义的属性的名称