





 1
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
 这样来