[图解]企业应用架构模式2024新译本讲解03-事务脚本+表数据入口

1
00:00:00,570 --> 00:00:06,290
这里先创建一个service的对象

2
00:00:07,000 --> 00:00:12,470
然后调用对象的方法、操作

3
00:00:12,480 --> 00:00:13,750
就是事务脚本

4
00:00:14,700 --> 00:00:15,900
然后参数是1

5
00:00:16,660 --> 00:00:19,490
也就是合同ID 

6
00:00:19,620 --> 00:00:21,170
我们给它打一个断点

7
00:00:21,180 --> 00:00:24,820
我们在这里,这地方好了

8
00:00:25,740 --> 00:00:31,740
前面都是预热的

9
00:00:39,530 --> 00:00:42,040
往下走

10
00:00:43,760 --> 00:00:45,320
然后这里,在这里

11
00:00:45,330 --> 00:00:49,730
然后你看,这里创建数据入口

12
00:00:51,920 --> 00:00:55,390
然后查询,返回数据表

13
00:00:57,150 --> 00:01:05,040
这个查询就是Gateway的一个操作了

14
00:01:05,540 --> 00:01:10,130
它定义了一些SQL语句

15
00:01:11,320 --> 00:01:13,660
你看,Gateway开始定义了SQL语句

16
00:01:14,530 --> 00:01:15,570
SQL字符串

17
00:01:16,180 --> 00:01:20,120
然后这个符号

18
00:01:20,130 --> 00:01:23,000
就相当于存储过程里面

19
00:01:24,400 --> 00:01:26,170
参数的变量的符号

20
00:01:27,280 --> 00:01:28,470
所以这个地方

21
00:01:29,890 --> 00:01:31,710
应该放在存储过程里面更合适

22
00:01:31,720 --> 00:01:35,010
周围都是C#的语法

23
00:01:35,020 --> 00:01:36,530
这里你看,插一个字符串

24
00:01:37,350 --> 00:01:38,220
还不如怎么样

25
00:01:38,230 --> 00:01:41,710
直接把这个放到数据库那边

26
00:01:42,410 --> 00:01:44,910
作为存储过程,你这里调用

27
00:01:45,390 --> 00:01:49,240
你调用存储过程那个名字就可以了

28
00:01:49,250 --> 00:01:49,720


29
00:01:49,890 --> 00:01:51,200
参数这里就不变了

30
00:01:51,210 --> 00:01:53,200
直接加参数一模一样了

31
00:01:53,820 --> 00:01:54,900
没有必要放在这里

32
00:01:58,870 --> 00:02:01,820
但很多人喜欢在C#、Java里面

33
00:02:01,830 --> 00:02:04,550
写SQL语句

34
00:02:04,560 --> 00:02:06,580
那只能写很简单的

35
00:02:07,750 --> 00:02:09,390
一复杂了你就写不了

36
00:02:09,400 --> 00:02:12,410
实际上,你要彻底的事务脚本的话

37
00:02:12,420 --> 00:02:14,170
应该干脆就什么

38
00:02:14,450 --> 00:02:16,000
直接把所有的运算

39
00:02:16,640 --> 00:02:19,580
都放在存储过程里面来做

40
00:02:20,090 --> 00:02:23,750
如果我们的类的结构做得好

41
00:02:24,640 --> 00:02:27,940
它完全可以通过标准的集合运算

42
00:02:28,530 --> 00:02:30,680
很优雅的把这个结果给拿出来

43
00:02:31,880 --> 00:02:34,290
包括你看这里,if什么之类的

44
00:02:34,780 --> 00:02:36,610
后面在哪里,这里

45
00:02:37,730 --> 00:02:39,270
If

46
00:02:40,080 --> 00:02:41,900
这都是硬编码

47
00:02:41,910 --> 00:02:45,940
if类型等于这个,这种都是硬编码

48
00:02:46,630 --> 00:02:48,640
这种应该变成数据值才对的

49
00:02:49,460 --> 00:02:51,610
不应该放在代码里面硬编码

50
00:02:53,190 --> 00:02:55,430
包括像这种,3,都是硬编码

51
00:02:56,710 --> 00:02:57,890
它不应该出现在这里

52
00:02:58,870 --> 00:03:00,850
代码里面出现的应该是概念

53
00:03:01,780 --> 00:03:03,320
不能出现一个硬编码这样

54
00:03:03,560 --> 00:03:04,930
包括这个

55
00:03:05,340 --> 00:03:06,910
这个也是硬编码

56
00:03:08,660 --> 00:03:12,380
直接就是一个值

57
00:03:13,100 --> 00:03:15,690
当然这个案例本身它是比较简单了

58
00:03:15,700 --> 00:03:20,580
但是我们要知道,这里面是有问题的

59
00:03:21,170 --> 00:03:25,350
先定义了一些SQL字符串

60
00:03:28,160 --> 00:03:32,360
然后这里,前面是连接了,建立连接

61
00:03:32,370 --> 00:03:33,760
然后这里把定义好的

62
00:03:34,370 --> 00:03:35,320
SQL的字符串

63
00:03:35,330 --> 00:03:37,320
赋值给Command对象是吧

64
00:03:37,800 --> 00:03:40,560
然后添加参数,来把这个值传给它

65
00:03:41,460 --> 00:03:47,040
1,把参数传给它

66
00:03:48,050 --> 00:03:51,290
然后执行,返回结果

67
00:03:52,330 --> 00:03:54,390
就是一个数据表

68
00:03:54,400 --> 00:04:00,130
DataTable这样一个对象

69
00:04:00,140 --> 00:04:00,690
一个表

70
00:04:02,490 --> 00:04:12,180
这样来,在哪里

71
00:04:24,250 --> 00:04:25,840
你看,这是一个事务脚本(口误)

72
00:04:26,150 --> 00:04:28,310
这个相当于调用另外一个过程

73
00:04:29,350 --> 00:04:31,860
Gateway,不是事务脚本,这是事务脚本

74
00:04:31,870 --> 00:04:35,690
调用了Gateway的查询的方法

75
00:04:36,070 --> 00:04:41,690
就是我们刚才讲的,Gateway里面,这个地方

76
00:04:45,430 --> 00:04:48,330
Gateway里面它包含了命令

77
00:04:48,460 --> 00:04:50,490
选择、查询、插入、更新等等

78
00:04:53,240 --> 00:04:54,990
你看,这里有一个

79
00:05:02,750 --> 00:05:06,600
Money,这是一个自定义的类

80
00:05:07,750 --> 00:05:08,820
Money定义一个这个

81
00:05:09,110 --> 00:05:14,350
然后你看这里,这个类是按照企业应用架构模式

82
00:05:14,360 --> 00:05:15,710
Money模式实现的类

83
00:05:16,160 --> 00:05:17,390
我们来说一下Money

84
00:05:17,400 --> 00:05:18,150


85
00:05:19,610 --> 00:05:21,200
如果类型是

86
00:05:21,950 --> 00:05:27,070
你看,这里是把值取出来了

87
00:05:27,640 --> 00:05:28,430
值取出来

88
00:05:32,020 --> 00:05:33,240
往下走

89
00:05:33,730 --> 00:05:38,030
这里你看,有一个

90
00:05:38,040 --> 00:05:43,230
你看这里,allocate这个地方

91
00:05:44,430 --> 00:05:49,000
这个地方相当于把钱分为3份

92
00:05:49,970 --> 00:05:51,750
为什么不能够直接除以3

93
00:05:51,760 --> 00:05:53,960
而是要用Money

94
00:05:56,280 --> 00:05:57,950
类的allocate方法

95
00:05:59,520 --> 00:06:01,310
实际上就是货币的问题了

96
00:06:01,870 --> 00:06:03,010
所以我们要说一下

97
00:06:05,520 --> 00:06:07,730
Fowler的书里面也说了这个问题

98
00:06:09,220 --> 00:06:17,060
这个就是刚才那段代码的类图了

99
00:06:19,510 --> 00:06:24,220
我是用UModel把它逆转过来

100
00:06:25,350 --> 00:06:26,740
用UModel这个工具,你用EA也可以的

101
00:06:27,470 --> 00:06:28,190
用EA也可以

102
00:06:28,200 --> 00:06:34,330
我是用UModel来把它逆向工程得到

103
00:06:34,340 --> 00:06:37,540
你看,有几个常数

104
00:06:39,090 --> 00:06:40,900


105
00:06:40,910 --> 00:06:43,580
这里头列出来,然后有几个方法

106
00:06:45,070 --> 00:06:45,820
这是入口的

107
00:06:47,090 --> 00:06:48,170
然后manager有这个

108
00:06:49,690 --> 00:06:51,420
然后service有这两个方法

109
00:06:52,450 --> 00:06:54,420
这是主程序

110
00:06:58,340 --> 00:07:00,170
UModel还有另外一个好处

111
00:07:02,330 --> 00:07:04,800
就是逆向生成序列图

112
00:07:05,870 --> 00:07:08,070
你看这个层次

113
00:07:08,320 --> 00:07:10,270
后面变量什么它都列出来

114
00:07:10,280 --> 00:07:12,770
因为我层次列得比较深

115
00:07:12,780 --> 00:07:14,090
如果列得浅一点

116
00:07:14,100 --> 00:07:15,630
后面这些就可以不用出现

117
00:07:15,640 --> 00:07:16,730
实际上就两个类

118
00:07:17,610 --> 00:07:18,960
一个是

119
00:07:18,970 --> 00:07:19,720
RecognitionService

120
00:07:21,100 --> 00:07:23,270
这是控制类,或者应用服务类

121
00:07:23,280 --> 00:07:26,370
这是入口类

122
00:07:28,270 --> 00:07:31,340
两个,然后你看,创建一个

123
00:07:31,350 --> 00:07:35,870
然后调用,返回

124
00:07:35,880 --> 00:07:39,580
然后,这里有分支

125
00:07:39,750 --> 00:07:44,360
如果类型是这个,走这个

126
00:07:47,760 --> 00:07:48,390
这是

127
00:07:48,670 --> 00:07:53,000
UModel比EA要好的一个地方

128
00:07:53,010 --> 00:07:55,600
可以帮你分析这个程序的结构

129
00:07:58,160 --> 00:08:00,560
当然如果代码已经写得比较清晰了

130
00:08:00,570 --> 00:08:01,880
你直接看代码也看得出来

131
00:08:06,590 --> 00:08:15,160
Money就是金钱类

132
00:08:16,470 --> 00:08:19,500
金钱包括一个是数额,一个是币种

133
00:08:19,920 --> 00:08:21,020
不能说100 

134
00:08:21,230 --> 00:08:22,820
100什么,100块

135
00:08:24,780 --> 00:08:28,800
还是100卢布

136
00:08:28,810 --> 00:08:32,460
100日元

137
00:08:35,390 --> 00:08:36,220
还是100

138
00:08:37,460 --> 00:08:39,650
印度那边,卢比

1
00:00:00,300 --> 00:00:03,590
所以,涉及到币种

2
00:00:04,150 --> 00:00:04,900
这是一个问题

3
00:00:05,830 --> 00:00:07,290
所以币种就有一个什么

4
00:00:07,300 --> 00:00:11,370
必须运算是在同一个币种

5
00:00:11,380 --> 00:00:14,400
你不能说100美元加100日元

6
00:00:16,600 --> 00:00:19,120
如果你要有个兑换的话

7
00:00:19,130 --> 00:00:20,640
你有一个汇率的问题

8
00:00:22,680 --> 00:00:26,430
另外一个问题就是整数的问题了

9
00:00:27,060 --> 00:00:32,670
因为货币本身它有一个最小的单位

10
00:00:33,400 --> 00:00:37,310
我们人民币是分,最小单位

11
00:00:38,540 --> 00:00:39,570
如果说你这个值

12
00:00:39,580 --> 00:00:41,690
比如说,我有7块钱

13
00:00:43,070 --> 00:00:47,130
我分3份,怎么分

14
00:00:47,140 --> 00:00:48,650
你分,如果得到小数点

15
00:00:50,320 --> 00:00:51,100
这是一个什么

16
00:00:52,270 --> 00:00:53,910
无限的小数

17
00:00:54,600 --> 00:00:56,430
如果说你取整取得不好

18
00:00:56,440 --> 00:01:02,040
你分完之后,你把这三个加起来

19
00:01:03,060 --> 00:01:06,250
结果就少了一分或多了一分

20
00:01:06,870 --> 00:01:07,700
这就麻烦了

21
00:01:08,710 --> 00:01:13,200
像我们当时,我第一个项目就碰到这个问题

22
00:01:14,580 --> 00:01:16,060
我们什么都做好了

23
00:01:16,070 --> 00:01:18,550
然后半夜去上线

24
00:01:20,450 --> 00:01:21,950
上线当天晚上就没有睡

25
00:01:22,240 --> 00:01:25,340
98年的时候,当天晚上就没有睡

26
00:01:26,340 --> 00:01:27,920
然后第二天也没有睡

27
00:01:28,850 --> 00:01:31,870
差不多48个小时才睡觉

28
00:01:33,460 --> 00:01:36,050
就是搞这个,其中一个问题就是

29
00:01:37,260 --> 00:01:39,640
头一天多了一分

30
00:01:40,310 --> 00:01:45,640
第二天又多了两分,这样就很麻烦

31
00:01:45,650 --> 00:01:47,790
后来去查文档

32
00:01:48,010 --> 00:01:50,460
我们刚才之前也讲了

33
00:01:54,960 --> 00:01:59,290
没有什么网络,也没人问看,就是翻看文档

34
00:01:59,840 --> 00:02:04,430
包括SQL Server附带的指南

35
00:02:04,820 --> 00:02:08,240
包括VB的手册等等

36
00:02:10,090 --> 00:02:14,980
后来是我们的领导,高级工程师

37
00:02:14,990 --> 00:02:16,060
当时我们是小兵

38
00:02:18,610 --> 00:02:20,810
很不懈努力去找

39
00:02:21,060 --> 00:02:24,910
终于在一个地方找到问题所在

40
00:02:26,440 --> 00:02:29,120
这个还是非常值得学习的

41
00:02:29,130 --> 00:02:31,750
他坚信自己能够解决

42
00:02:33,110 --> 00:02:37,550
他坚信解决问题的地方就在这个书里面

43
00:02:40,230 --> 00:02:44,350
这个的话,我们很多同学做不到的

44
00:02:44,360 --> 00:02:47,990
有的同学他做题做不对

45
00:02:48,000 --> 00:02:50,190
他来问我,老师,题目是不是有问题

46
00:02:52,130 --> 00:02:53,930
你想想就知道了,这个题目

47
00:02:55,130 --> 00:02:57,530
那么多人做,有问题的话

48
00:02:58,620 --> 00:02:59,600
可能早就改了

49
00:02:59,610 --> 00:03:02,710
第二个,我这个题目出题的时候

50
00:03:03,230 --> 00:03:04,570
那个图画得这么精美

51
00:03:04,580 --> 00:03:06,610
我花那么多心思来画这个图

52
00:03:09,560 --> 00:03:10,350
说明什么

53
00:03:10,360 --> 00:03:12,510
既然这个图画得这么精美

54
00:03:13,210 --> 00:03:14,640
我花了心思画这个图

55
00:03:15,220 --> 00:03:18,690
可能我当时考虑是比较周到的

56
00:03:22,380 --> 00:03:26,590
这个周到,就值得你再去认真,再去思考

57
00:03:26,600 --> 00:03:28,310
再去看书,去思考一下

58
00:03:28,320 --> 00:03:30,150
如果说,我这题目出得很潦草

59
00:03:30,700 --> 00:03:31,900
上面都是错别字什么的

60
00:03:32,390 --> 00:03:33,860
你可以怀疑,老师你的题目

61
00:03:34,460 --> 00:03:36,410
是不是出错了

62
00:03:36,930 --> 00:03:38,720
但是,如果说我题目出得很精致

63
00:03:39,600 --> 00:03:41,150
上面的图也很精致

64
00:03:41,160 --> 00:03:42,550
文字也没有什么错误

65
00:03:43,840 --> 00:03:44,740
但你没做对

66
00:03:46,070 --> 00:03:47,460
应该先反省自己

67
00:03:49,190 --> 00:03:50,730
这个是题外话了

68
00:03:50,740 --> 00:03:53,970
我们回想一下我们以前的情况

1
00:00:02,280 --> 00:00:04,680
就是说,你分完之后合起来

2
00:00:05,190 --> 00:00:07,570
这个值依然要相等

3
00:00:11,790 --> 00:00:13,020
这是我们刚才说过的

4
00:00:13,390 --> 00:00:19,070
代码的截图,已经说过了,都不多说了

5
00:00:21,950 --> 00:00:27,470
所以Money类这里,它就解决这个问题

6
00:00:27,720 --> 00:00:30,500
就是说,分完后相加,等于原值

7
00:00:30,740 --> 00:00:32,340
这里书上也说了

8
00:00:32,850 --> 00:00:35,050
这是我们修改过的译文

9
00:00:35,860 --> 00:00:37,680
你想把一笔钱分给多个目标

10
00:00:37,690 --> 00:00:41,990
不想损失零钱,分配或者分割

11
00:00:42,940 --> 00:00:46,390
allocate这里,给出了代码

12
00:00:48,790 --> 00:00:50,380
这个代码本身的话

13
00:00:52,520 --> 00:00:53,360
这里面没有包括

14
00:00:53,370 --> 00:00:58,010
它已经包含在相关的库里面了

15
00:00:58,140 --> 00:01:01,190
这里面就没有,在相关的库里面了

16
00:01:01,200 --> 00:01:04,240
这地方

1
00:00:02,120 --> 00:00:04,880
我们把这个代码运行完毕

2
00:00:06,040 --> 00:00:06,810
刚才到这里

3
00:00:08,070 --> 00:00:09,390
实际上这个地方

4
00:00:09,750 --> 00:00:12,000
这里,控制台还没出来

5
00:00:12,860 --> 00:00:13,810
继续往下走

6
00:00:15,160 --> 00:00:16,740
直接运行好了

7
00:00:19,340 --> 00:00:19,420

8
00:00:20,550 --> 00:00:23,450
你看这里,就出来了

9
00:00:25,130 --> 00:00:27,640
数据库,入账

10
00:00:28,900 --> 00:00:32,070
在这里

11
00:00:34,660 --> 00:00:36,480
然后就直接在这个地方写出来

12
00:00:36,610 --> 00:00:39,470
在这地方写出来

13
00:00:39,720 --> 00:00:43,410
你计算得到那个数值之后

14
00:00:45,000 --> 00:00:46,480
直接在这里输出

15
00:00:47,040 --> 00:00:49,130
一个两个三个,合同1

16
00:00:49,140 --> 00:00:54,120
2,3。合同1是数据库

17
00:00:54,520 --> 00:01:01,540
这样来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值