本文主要是介绍[图解]建模树型结构和不变式:类建模(高阶+ )片段,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1137
01:16:18,150 --> 01:16:20,500
所以要么是这两个都有
1138
01:16:22,110 --> 01:16:25,420
才能够把这个方法安排在这个结点上
1139
01:16:28,010 --> 01:16:29,840
否则如果只有一个
1140
01:16:30,420 --> 01:16:31,890
那么只能安排一个
1141
01:16:32,710 --> 01:16:34,510
比如说,如果你只有父结点
1142
01:16:34,520 --> 01:16:37,310
那么查找所有父结点
1143
01:16:37,320 --> 01:16:39,110
查找直接父结点,就可以安排
1144
01:16:39,120 --> 01:16:41,530
因为这是能查的
1145
01:16:44,490 --> 01:16:48,550
而子结点这个是查不了了
1146
01:16:48,560 --> 01:16:51,160
因为你没有这个信息
1147
01:16:52,070 --> 01:16:53,350
只能通过仓储来查
1148
01:16:54,510 --> 01:16:58,950
同样,如果说你只有子结点属性
1149
01:16:58,960 --> 01:16:59,830
没有父结点
1150
01:17:00,310 --> 01:17:01,420
这个就可以查
1151
01:17:01,970 --> 01:17:07,250
这个查不了,父结点
1152
01:17:07,260 --> 01:17:08,810
只能通过仓储来查
1153
01:17:10,720 --> 01:17:14,560
这样来,怎么查
1154
01:17:14,570 --> 01:17:17,040
假设有一个也好,两个也好
1155
01:17:18,190 --> 01:17:19,460
如果有父结点
1156
01:17:19,470 --> 01:17:20,780
那么这个就是可用的
1157
01:17:20,790 --> 01:17:22,860
如果有子结点,这就是可用的
1158
01:17:23,250 --> 01:17:25,470
如果两个都有,这两个都可用
1159
01:17:28,120 --> 01:17:30,030
父结点这个,跟刚才一样的
1160
01:17:30,040 --> 01:17:31,670
只不过刚才是什么
1161
01:17:32,370 --> 01:17:34,730
这是仓储里面的递归的
1162
01:17:34,740 --> 01:17:37,780
我们这里是结点上递归,所有父结点
1163
01:17:37,790 --> 01:17:43,730
然后如果它的父结点不为空
1164
01:17:44,080 --> 01:17:48,520
这是条件,你不为空,就继续递归了
1165
01:17:49,200 --> 01:17:52,530
把这个结果添加到查询结果
1166
01:17:52,980 --> 01:17:54,940
然后这里,你看
1167
01:17:57,670 --> 01:18:00,270
针对父结点再查找所有父结点
1168
01:18:01,410 --> 01:18:01,750
1169
01:18:02,080 --> 01:18:06,820
然后把这个结果再添加到查询结果
1170
01:18:08,840 --> 01:18:10,620
AddRange实际上就是什么
1171
01:18:10,630 --> 01:18:12,020
相当于把集合
1172
01:18:12,030 --> 01:18:15,250
类似于我们
1173
01:18:16,300 --> 01:18:18,650
insert into什么
1174
01:18:19,070 --> 01:18:23,080
然后后面是select from什么
1175
01:18:23,580 --> 01:18:28,340
把一个集合插到另外一个集合里面去
1176
01:18:29,230 --> 01:18:31,140
Add是添加一个元素
1177
01:18:32,270 --> 01:18:33,510
这个添加一个集合
1178
01:18:37,200 --> 01:18:38,470
这个也是一样
1179
01:18:38,600 --> 01:18:43,150
如果子结点,递归查找子结点
1180
01:18:45,290 --> 01:18:49,700
跟刚才那个一样
1181
01:18:50,470 --> 01:18:52,300
这个也是添加集合
1182
01:18:52,670 --> 01:18:54,580
针对每一个结点来添加
1183
01:18:54,710 --> 01:18:56,810
一样的
1184
01:18:57,870 --> 01:18:59,500
我们来看一下
1185
01:19:00,810 --> 01:19:05,360
把方法放在结点上来查找的代码
1186
01:19:08,350 --> 01:19:10,230
这里,查找所有父结点
1187
01:19:10,680 --> 01:19:12,360
查找所有子结点,这里
1188
01:19:12,740 --> 01:19:18,200
然后,递归查找,在主程序这里
1189
01:19:18,210 --> 01:19:20,630
我们也,刚才使用仓储这个
1190
01:19:20,720 --> 01:19:22,270
我们把它注释掉
1191
01:19:26,120 --> 01:19:27,320
改成使用结点的
1192
01:19:27,450 --> 01:19:30,270
使用结点,你看,这里查找子结点
=============
1
00:00:00,400 --> 00:00:03,600
下一个知识点,我们来说一下不变式
2
00:00:06,990 --> 00:00:10,810
在往下讲具体的概念和细节之前
3
00:00:11,740 --> 00:00:14,430
我们还是以刚刚讲完的树
4
00:00:15,400 --> 00:00:17,660
作为我们的例子
5
00:00:17,870 --> 00:00:19,710
先举个例子
6
00:00:19,720 --> 00:00:20,790
然后再往下讲
7
00:00:22,100 --> 00:00:25,450
刚才我们讲到树形结构的建模方案
8
00:00:25,460 --> 00:00:25,770
9
00:00:26,290 --> 00:00:27,840
我们也说到树的特征
10
00:00:28,710 --> 00:00:31,900
有且只有一个没有父结点的根结点
11
00:00:34,150 --> 00:00:36,220
¥%……&我就不重复说了
12
00:00:36,230 --> 00:00:37,820
刚才已经说过很多遍了
13
00:00:39,840 --> 00:00:43,480
类图,假设我们用简单的递归
14
00:00:44,910 --> 00:00:46,020
就是右边这个类图
15
00:00:48,630 --> 00:00:54,000
这个类图,看,左边这三条
16
00:00:54,630 --> 00:00:56,540
下面这两条是可以满足的
17
00:00:57,700 --> 00:00:58,850
是可以看出来的
18
00:01:00,310 --> 00:01:04,710
但是这条满足不了
19
00:01:07,850 --> 00:01:12,750
我们可以随意设置父结点子结点
20
00:01:15,550 --> 00:01:19,740
但是没有办法实现约束
21
00:01:22,840 --> 00:01:23,430
说明什么
22
00:01:24,280 --> 00:01:28,130
光靠这个结点本身的知识是不够的
23
00:01:30,250 --> 00:01:31,730
那就需要另外一个概念
24
00:01:32,930 --> 00:01:36,990
实际上刚才我们也用了另外一个概念
25
00:01:37,000 --> 00:01:37,390
26
00:01:37,930 --> 00:01:39,330
仓储的概念
27
00:01:39,340 --> 00:01:41,500
如果说只有结点
28
00:01:42,380 --> 00:01:45,100
涉及到整个结点集合的运算的时候
29
00:01:45,110 --> 00:01:46,100
我们用的仓储
30
00:01:46,510 --> 00:01:47,850
但仓储这个概念
31
00:01:48,350 --> 00:01:51,740
实际上它不是我们核心领域的
32
00:01:51,750 --> 00:01:53,980
它也不属于哪个领域的概念
33
00:01:56,670 --> 00:02:02,080
更合理的,我们需要添加一个树的概念
34
00:02:02,090 --> 00:02:08,470
就是说,这个知识是由树这个类来封装的
35
00:02:10,790 --> 00:02:12,030
那就类似下面这个了
36
00:02:12,160 --> 00:02:15,600
树有很多结点,结点之间怎么样
37
00:02:15,730 --> 00:02:18,590
这个是跟之前一样的
38
00:02:20,100 --> 00:02:26,040
而这个就可以表达成树的一个约束
39
00:02:26,250 --> 00:02:30,600
一个不变式,任何一个树的实例
40
00:02:31,950 --> 00:02:34,390
它在稳定状态下的时候
41
00:02:35,110 --> 00:02:38,640
它应该满足,它的属性
42
00:02:38,770 --> 00:02:40,580
它的属性就是结点了
43
00:02:40,590 --> 00:02:43,620
很多结点,结点集合
44
00:02:44,330 --> 00:02:47,870
属性应该满足这个约束
45
00:02:47,880 --> 00:02:51,160
就是说,父结点为空的
46
00:02:52,090 --> 00:02:54,850
这样的一个结点,只有一个
47
00:02:55,140 --> 00:02:58,880
有且只有一个,等于1
48
00:03:01,010 --> 00:03:04,350
这是用OCL语法写的
49
00:03:04,780 --> 00:03:07,260
如果我们用编程语言
50
00:03:07,270 --> 00:03:08,740
比如用C#写
51
00:03:09,180 --> 00:03:12,850
我们可以改成LINQ的语法
52
00:03:13,170 --> 00:03:15,170
结点.Count
53
00:03:19,640 --> 00:03:21,840
这样来,这个时候
54
00:03:22,090 --> 00:03:23,320
这个树就代替了
55
00:03:24,510 --> 00:03:27,000
我们之前举例的时候的仓储了
56
00:03:30,470 --> 00:03:32,050
这个是更合理的
57
00:03:32,970 --> 00:03:35,850
能不引进一个
58
00:03:35,860 --> 00:03:38,380
或能不使用这种额外的
59
00:03:39,340 --> 00:03:40,620
非核心域的概念
60
00:03:40,630 --> 00:03:42,020
我们尽量不使用
61
00:03:42,910 --> 00:03:43,900
实在没办法了
62
00:03:44,760 --> 00:03:46,420
需要使用了再使用
63
00:03:49,990 --> 00:03:53,710
我们可以把它代到代码里面来看一下
这篇关于[图解]建模树型结构和不变式:类建模(高阶+ )片段的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!