[图解]企业应用架构模式2024新译本讲解07-表模块4

1
00:00:00,360 --> 00:00:07,030
这里面实际上就是通过一个方法,一个操作来封装了

2
00:00:08,790 --> 00:00:10,630
它不直接就操纵这里面

3
00:00:10,640 --> 00:00:12,070
不是直接把里面露出来

4
00:00:14,990 --> 00:00:20,430
产品ID进来,返回是产品类型

5
00:00:22,440 --> 00:00:23,660
产品类型,我们前面讲

6
00:00:23,670 --> 00:00:24,780
它是一个枚举的

7
00:00:26,150 --> 00:00:28,650
单独搞了个枚举来表示它

8
00:00:28,660 --> 00:00:31,890
这种封装

9
00:00:32,300 --> 00:00:33,690
什么时候用是值得的

10
00:00:34,760 --> 00:00:37,000
如果说你这里面是比较复杂的

11
00:00:37,530 --> 00:00:38,720
或者容易变化的

12
00:00:38,890 --> 00:00:40,480
封装可以,否则的话

13
00:00:40,860 --> 00:00:42,710
为了又多一个封装

14
00:00:42,980 --> 00:00:44,010
就不值得了

15
00:00:44,880 --> 00:00:45,540
 

1
00:00:00,590 --> 00:00:03,620
这里类型的话

2
00:00:05,870 --> 00:00:08,180
我们看它是哪一个

3
00:00:09,810 --> 00:00:11,780
这里写了,是D

4
00:00:12,460 --> 00:00:19,990
显然它跟这个是不等的

5
00:00:20,000 --> 00:00:20,270


6
00:00:22,960 --> 00:00:24,310
D跟这个也不等

7
00:00:25,060 --> 00:00:26,650
跳到下面来了

8
00:00:29,160 --> 00:00:29,540


9
00:00:29,550 --> 00:00:35,880
然后这里,跟前面封装一样

10
00:00:36,200 --> 00:00:38,710
把什么时候签约时间拿出来

11
00:00:39,870 --> 00:00:40,810
跟这里一样

12
00:00:46,080 --> 00:00:51,630
然后这里面我们前面讲过了

13
00:00:51,640 --> 00:00:58,340
它自己定义了一个分配金钱的一个操作

14
00:00:58,910 --> 00:00:59,950
你要把它分3份

15
00:01:00,840 --> 00:01:01,160
对吧

16
00:01:02,220 --> 00:01:03,530
分配在哪里

17
00:01:03,820 --> 00:01:04,770
就在这里

18
00:01:05,880 --> 00:01:07,640
就在这个合同类里面

19
00:01:07,650 --> 00:01:08,920
它定义了一个操作

20
00:01:09,730 --> 00:01:14,300
参数是金额、份数

21
00:01:17,710 --> 00:01:24,330
然后先定义了一个低值结果变量

22
00:01:25,290 --> 00:01:27,470
然后先把它分

23
00:01:27,480 --> 00:01:32,170
分完之后这里取整

24
00:01:34,370 --> 00:01:37,890
因为我们那个数值只能到分了

25
00:01:39,540 --> 00:01:41,760
比如说,你有7块钱

26
00:01:41,770 --> 00:01:43,080
你分3份怎么分呢

27
00:01:44,340 --> 00:01:45,660
你肯定分不了的

28
00:01:46,230 --> 00:01:47,740
最后你只能分到什么

29
00:01:48,360 --> 00:01:50,300
要么是2块

30
00:01:52,670 --> 00:01:55,270
2块、3块这样

31
00:01:55,280 --> 00:01:58,670
但这个肯定不是,因为这个是以元为单位的

32
00:01:59,530 --> 00:02:00,690
如果你是7分钱

33
00:02:00,820 --> 00:02:01,930
我们说7分钱的话

34
00:02:02,570 --> 00:02:04,300
只能分2、2、3

35
00:02:04,310 --> 00:02:06,420
估计已经是最接近的,没有办法了

36
00:02:07,190 --> 00:02:09,940
当然你是700块(口误)的话

37
00:02:10,190 --> 00:02:13,320
700分,7块钱就是700分的话

38
00:02:14,110 --> 00:02:15,100
700的话

39
00:02:15,110 --> 00:02:20,880
699算是可以分的

40
00:02:21,410 --> 00:02:24,070
699可以分,剩下1分怎么分

41
00:02:25,030 --> 00:02:26,270
剩下1分的话

42
00:02:26,280 --> 00:02:29,750
你只能分给某一个了

43
00:02:30,330 --> 00:02:33,550
有一个是得234的

44
00:02:33,560 --> 00:02:38,300
其它是233、233,这样分

45
00:02:38,310 --> 00:02:44,250
那么这个实际上就展示了这个过程

46
00:02:44,260 --> 00:02:45,130
低值结果,高值结果

47
00:02:45,140 --> 00:02:46,380
高值结果

48
00:02:46,390 --> 00:02:49,410
就是往上加一分钱了

49
00:02:51,100 --> 00:02:52,170
然后看余数

50
00:02:52,450 --> 00:02:53,520
看余数是多少

51
00:02:55,810 --> 00:02:57,530
然后余数前面的元素

52
00:02:57,740 --> 00:02:59,720
所以,余数是多少

53
00:03:00,210 --> 00:03:03,470
余数因为它就已经是整数了

54
00:03:04,590 --> 00:03:07,060
所以这里面的话,余数前面的元素

55
00:03:07,750 --> 00:03:11,380
就是高值的结果

56
00:03:11,910 --> 00:03:18,480
余数后面的元素就,这写错了

57
00:03:19,320 --> 00:03:20,530
标错了

58
00:03:20,920 --> 00:03:22,320
就用低值的结果

59
00:03:24,750 --> 00:03:28,150


60
00:03:36,310 --> 00:03:40,350
然后就把这三个插进去了

61
00:03:40,560 --> 00:03:41,790
怎么插入

62
00:03:41,920 --> 00:03:45,130
就调用这个表模块的

63
00:03:45,140 --> 00:03:47,080
一个插入的操作

64
00:03:50,690 --> 00:03:51,940
先定义一个新行

65
00:03:51,950 --> 00:03:54,480
然后取下一个ID

66
00:03:55,710 --> 00:03:58,290
之前那个作用

67
00:03:58,300 --> 00:04:02,160
你看,取下一个ID怎么实现的

68
00:04:03,580 --> 00:04:12,170
这里有一个锁,在这里定义,我们前面

69
00:04:13,550 --> 00:04:14,870
你看,定义了一个

70
00:04:15,120 --> 00:04:17,430
它类型就是对象

71
00:04:17,640 --> 00:04:19,670
一个静态的对象,就代表这个锁

72
00:04:22,680 --> 00:04:26,030
然后,你看这个是怎么做

73
00:04:27,880 --> 00:04:31,740
锁的目的就是为了保证原子操作

74
00:04:31,750 --> 00:04:35,360
就是说被锁住的这段里面的

75
00:04:35,370 --> 00:04:37,620
当然这里代码只有一行

76
00:04:38,350 --> 00:04:40,830
当然这一行里面可能它会分很多个指令了

77
00:04:40,840 --> 00:04:41,230
对不对

78
00:04:42,300 --> 00:04:45,710
就是说,如果有多个线程

79
00:04:46,410 --> 00:04:47,570
来执行这段代码

80
00:04:47,580 --> 00:04:50,090
如果A线程执行到

81
00:04:50,100 --> 00:04:52,470
这里面的时候,还没执行完

82
00:04:52,890 --> 00:04:54,680
B线程已经执行到这里了

83
00:04:57,040 --> 00:04:58,630
B线程执行到这里的时候

84
00:04:58,640 --> 00:05:00,190
它一看被锁住了

85
00:05:01,800 --> 00:05:03,480
有锁,它就等待

86
00:05:04,120 --> 00:05:05,250
等待A执行完了

87
00:05:05,260 --> 00:05:07,210
这个锁不存在了,被释放了

88
00:05:07,890 --> 00:05:10,420
保证多线程执行

89
00:05:11,170 --> 00:05:14,050
这段代码有多个线程

90
00:05:14,060 --> 00:05:15,050
同时执行的时候

91
00:05:16,810 --> 00:05:19,630
另外一个后面的线程

92
00:05:19,640 --> 00:05:21,470
要等待前面的线程

93
00:05:21,480 --> 00:05:22,990
把这一段执行完了

94
00:05:23,940 --> 00:05:25,210
把它释放出来了

95
00:05:26,850 --> 00:05:30,460
它才能够执行它的那一段程序

96
00:05:32,020 --> 00:05:34,120
这样才不会导致冲突

97
00:05:34,910 --> 00:05:37,020
像标识,我正在递增了

98
00:05:39,410 --> 00:05:41,020
原来那个数还没改

99
00:05:41,240 --> 00:05:43,650
结果你另外一个线程进来又递增一个

100
00:05:45,510 --> 00:05:48,220
最后得出来可能是两个一样的

101
00:05:48,230 --> 00:05:50,260
新的标识,冲突了

102
00:05:50,960 --> 00:05:53,160
所以你等我把递增做完了

103
00:05:54,440 --> 00:05:57,450
才能够轮到你来做下一步

104
00:05:59,240 --> 00:06:02,070
保证操作的原子性

105
00:06:04,470 --> 00:06:07,120
但这个的话我们自己来实现

106
00:06:08,270 --> 00:06:12,290
没有必要,最好是交给平台来做

107
00:06:12,460 --> 00:06:13,930
交给相应第三方

108
00:06:14,140 --> 00:06:20,610
不能写在我们这个领域的代码里面来

109
00:06:20,620 --> 00:06:21,210
不应该

110
00:06:22,320 --> 00:06:23,820
但这个是演示,无所谓了

111
00:06:25,900 --> 00:06:27,280
然后继续

1
00:00:01,260 --> 00:00:02,560
后面就是一样了

2
00:00:03,090 --> 00:00:03,760
ID

3
00:00:06,780 --> 00:00:13,590
一个字段一个字段往里面赋值

4
00:00:13,600 --> 00:00:16,410
赋好了,这一行就把它添加到

5
00:00:17,310 --> 00:00:20,190
Table的行的集合里面来

6
00:00:20,860 --> 00:00:22,570
实际上就是我们刚才类图上

7
00:00:24,800 --> 00:00:28,400
Table跟行之间的角色名

8
00:00:28,780 --> 00:00:32,040
添加,下面一样

1
00:00:00,360 --> 00:00:01,540
我们就一直运行

2
00:00:02,190 --> 00:00:05,280
后面一样

3
00:00:13,440 --> 00:00:14,550
计算完了

4
00:00:15,560 --> 00:00:21,240
实际上就是往表里面插入数据

5
00:00:22,290 --> 00:00:24,400
然后下面一样的

1
00:00:01,390 --> 00:00:02,310
你看,这一步

2
00:00:03,010 --> 00:00:07,800
我们现在是在主程序里面

3
00:00:08,140 --> 00:00:11,960
这一步就新建了一个收入确认的表模块

4
00:00:12,320 --> 00:00:14,260
然后调用这个表模块的操作

5
00:00:14,350 --> 00:00:16,990
我们来看怎么做

6
00:00:18,170 --> 00:00:22,840
构造,一样的

7
00:00:23,340 --> 00:00:25,140
前面都已经见过了

8
00:00:26,890 --> 00:00:28,610
好,接下来看,收入确认这个

9
00:00:33,290 --> 00:00:34,670
这个实际上就相当于

10
00:00:35,770 --> 00:00:39,930
传入的参数是合同ID

11
00:00:40,840 --> 00:00:42,940
这是某个日期

12
00:00:43,700 --> 00:00:45,260
那么通过这个来计算

13
00:00:45,270 --> 00:00:48,260
某合同、某日期之前已确认的收入

14
00:00:49,000 --> 00:00:52,500
相当于根据这个来查询,得到结果

15
00:00:55,340 --> 00:00:57,680
那么这里面查询的内容

16
00:00:57,690 --> 00:01:00,920
主要是在收入确认这个表里面

17
00:01:00,930 --> 00:01:06,890
所以操作就会放在这个表模块里面

18
00:01:08,230 --> 00:01:09,150
放在这里面

19
00:01:12,100 --> 00:01:16,280
跟我们的面向对象专家原则

20
00:01:16,890 --> 00:01:18,230
分配责任那个是类似的

21
00:01:20,190 --> 00:01:22,270
用到谁的数据最多

22
00:01:22,360 --> 00:01:26,570
那么它就有可能,最应该成为这个类的操作

23
00:01:30,300 --> 00:01:35,510
这里,首先第一步,就构建筛选条件

24
00:01:35,990 --> 00:01:37,480
构建一个查询条件了

25
00:01:38,140 --> 00:01:46,350
然后使用Table的一个操作

26
00:01:47,150 --> 00:01:50,400
select操作,然后把这个条件放进去

27
00:01:50,610 --> 00:01:51,880
筛选出符合条件的行

28
00:01:55,400 --> 00:01:58,400
得到这一行以后,它放到这里来了

29
00:01:58,530 --> 00:02:00,380
行的一个集合了

30
00:02:00,390 --> 00:02:07,280
然后它就根据这些行来累计行里面的字段

31
00:02:08,140 --> 00:02:09,280
金额

32
00:02:09,290 --> 00:02:10,640
金额字段累计起来

33
00:02:11,180 --> 00:02:12,210
但像这个的话

34
00:02:12,220 --> 00:02:15,640
如果是用SQL语句

35
00:02:15,650 --> 00:02:18,220
或者是用集合运算的

36
00:02:18,230 --> 00:02:19,900
像LINQ这样的语句的话

37
00:02:20,340 --> 00:02:23,230
直接用聚合函数就可以了

38
00:02:23,400 --> 00:02:26,530
没有必要让自己又单独搞一遍这样

39
00:02:26,540 --> 00:02:27,690
但没有关系

40
00:02:27,700 --> 00:02:31,350
这只是演示,聚合函数就可以了

41
00:02:32,240 --> 00:02:33,940
包括前面的所有的一切

42
00:02:34,880 --> 00:02:38,280
实际上,只要我们的表结构是合理的

43
00:02:38,410 --> 00:02:43,430
完全就可以通过一个查询语句把它写出来

44
00:02:43,600 --> 00:02:46,530
又这个,又那个,没有必要

45
00:02:48,090 --> 00:02:52,760
实际上最终的目的就是要做这个

46
00:02:52,770 --> 00:02:55,400
计算某合同某日期之前的已确认收入

47
00:02:55,950 --> 00:02:59,460
包括前面讲的,我们前面也说到过了

48
00:02:59,800 --> 00:03:01,750
写收入确认表都没有必要

49
00:03:01,760 --> 00:03:03,070
因为是冗余的数据

50
00:03:04,590 --> 00:03:07,610
我们就完全可以通过简单的

51
00:03:07,620 --> 00:03:11,260
这种标准的集合运算

52
00:03:12,950 --> 00:03:14,150
直接得到我们的结果

53
00:03:14,440 --> 00:03:17,010
这个我们最后再演示

54
00:03:18,550 --> 00:03:21,600
没有必要来这样做,但这个演示的话

55
00:03:23,250 --> 00:03:24,300
我们就按照书上这样

56
00:03:25,050 --> 00:03:25,870
来把它过一下

57
00:03:26,680 --> 00:03:30,830
来比较一下,自己来完成这个

58
00:03:30,840 --> 00:03:34,030
没有必要,好,得到结果了

59
00:03:34,690 --> 00:03:35,330


60
00:03:37,830 --> 00:03:41,740
然后这里就把它写到控制台

61
00:03:42,900 --> 00:03:46,010
控制台,就是这一行

62
00:03:47,010 --> 00:03:49,690
在这之前的收入是3333

63
00:03:51,020 --> 00:03:52,650
显然这是分3份了

64
00:03:53,570 --> 00:03:55,230
3333那三份

65
00:03:56,060 --> 00:03:58,730
后面可能就有3334什么的

66
00:04:01,200 --> 00:04:02,550
我们继续往下走

67
00:04:03,580 --> 00:04:05,540
先执行到这里

68
00:04:08,670 --> 00:04:14,400
好,我们看666.67,这是数据库

69
00:04:14,490 --> 00:04:19,840
另外两项就没有显示了

70
00:04:20,830 --> 00:04:22,350
这是数据库的

71
00:04:22,360 --> 00:04:23,630
这是电子表格的

72
00:04:24,760 --> 00:04:26,470
另外一个合同了,合同2

73
00:04:26,480 --> 00:04:27,650
合同3

74
00:04:31,530 --> 00:04:32,750
我们看合同3

75
00:04:36,690 --> 00:04:43,820
文字处理器的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值