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