[图解]企业应用架构模式2024新译本讲解02-表数据入口
1
00:00:00,420 --> 00:00:04,330
这个案例,我们就是用书上的案例了
2
00:00:06,080 --> 00:00:08,860
收入确认的一个案例
3
00:00:09,510 --> 00:00:11,100
书上讲了,收入确认
4
00:00:13,330 --> 00:00:15,270
就是说,你给了钱
5
00:00:15,960 --> 00:00:18,200
但这个钱本身还不能够直接入账
6
00:00:18,210 --> 00:00:24,500
因为这个钱最终是不是能够收进来
7
00:00:25,980 --> 00:00:27,930
这要看服务的进展
8
00:00:27,940 --> 00:00:30,290
这是预付款
9
00:00:30,940 --> 00:00:33,250
定金或者预付款
10
00:00:36,380 --> 00:00:38,500
所以就有一个要把这笔钱
11
00:00:39,250 --> 00:00:41,570
分成很多笔来入账的
12
00:00:42,800 --> 00:00:45,700
这样的一个会计的做法
13
00:00:48,760 --> 00:00:52,940
他这里就设置了一个比较简单的场景
14
00:00:53,620 --> 00:00:55,700
不同类型的产品
15
00:00:56,690 --> 00:00:59,580
入账的方式不一样
16
00:00:59,590 --> 00:01:03,480
比如说,如果是文字处理软件的,就直接入账
17
00:01:03,940 --> 00:01:06,300
如果是电子表格的Excel什么之类的
18
00:01:07,060 --> 00:01:09,050
这样来分几笔入账
19
00:01:09,660 --> 00:01:13,760
数据库软件就这样
20
00:01:16,450 --> 00:01:21,520
这是书里面给出来的类图
21
00:01:22,040 --> 00:01:23,310
产品,然后这里有一个产品类型
22
00:01:23,990 --> 00:01:27,190
它这是简化了,直接一个普通属性
23
00:01:28,620 --> 00:01:30,790
如果要严格应该有一个
24
00:01:31,360 --> 00:01:32,590
产品类型
25
00:01:33,600 --> 00:01:36,530
合同,收入确认
26
00:01:39,400 --> 00:01:41,140
合同有两个属性
27
00:01:41,150 --> 00:01:42,700
一个签约时间
28
00:01:43,440 --> 00:01:46,510
收入,收入确认
29
00:01:46,520 --> 00:01:49,480
这个是相当于把收入分成几笔
30
00:01:50,270 --> 00:01:52,740
这是它的数量(数额),比如分三笔
31
00:01:53,390 --> 00:01:55,060
你收入300
32
00:01:55,310 --> 00:01:56,660
三笔就是每笔100
33
00:01:57,140 --> 00:01:59,100
然后这是入账的时间
34
00:01:59,990 --> 00:02:07,590
这样来
35
00:02:07,600 --> 00:02:11,360
这个是书里面给出的序列图
36
00:02:11,770 --> 00:02:13,400
你看,这有个service
37
00:02:14,860 --> 00:02:17,650
就是刚才类图上面定义的那个类
38
00:02:22,310 --> 00:02:27,710
然后这是Gateway,入口类
39
00:02:28,760 --> 00:02:31,230
然后这是事务脚本操作
40
00:02:32,090 --> 00:02:38,300
查找合同,返回来之后,取数据
41
00:02:38,310 --> 00:02:40,690
然后这里生成
42
00:02:40,900 --> 00:02:44,680
在这个Recognition,收入确认
43
00:02:44,690 --> 00:02:46,600
这个表里面插入一行
44
00:02:48,860 --> 00:02:51,300
插入多行,这里打个星星表示
45
00:02:51,310 --> 00:02:53,600
这个是多个
46
00:02:53,610 --> 00:02:54,960
执行多次的一个操作
47
00:02:56,860 --> 00:03:01,850
实际上,从描述的业务的情况看
48
00:03:02,100 --> 00:03:03,130
实际上这个类图
49
00:03:04,740 --> 00:03:08,180
包括这个序列图都是没有必要的
50
00:03:11,550 --> 00:03:15,380
首先这个就是冗余的,不需要
51
00:03:17,520 --> 00:03:17,950
为什么
52
00:03:18,360 --> 00:03:22,760
你看,收入是算出来的
53
00:03:22,770 --> 00:03:26,050
是根据这个算出来的
54
00:03:27,920 --> 00:03:29,520
既然是可计算的
55
00:03:31,240 --> 00:03:33,340
那么显然它就是冗余的
56
00:03:35,920 --> 00:03:37,560
如果你只是为了把它算出来
57
00:03:37,570 --> 00:03:39,240
把它填到这个表里面
58
00:03:41,750 --> 00:03:44,100
你干嘛要算出来事先填好呢
59
00:03:45,390 --> 00:03:46,790
等他需要的时候再算
60
00:03:46,800 --> 00:03:48,970
不就完了
61
00:03:49,410 --> 00:03:50,550
你单独把它算出来
62
00:03:50,560 --> 00:03:52,870
填到这个表里面,这一步就是冗余的
63
00:03:55,050 --> 00:03:57,270
就像我们生成报表一样
64
00:03:58,630 --> 00:04:01,230
假设你在没有人看的情况下
65
00:04:01,240 --> 00:04:02,750
你事先生成报表
66
00:04:04,420 --> 00:04:06,300
然后有人看了,直接看报表
67
00:04:07,990 --> 00:04:09,340
这个是冗余的,为什么
68
00:04:11,540 --> 00:04:13,640
因为这个报表的数据既然可以生成
69
00:04:13,650 --> 00:04:14,480
那应该是什么
70
00:04:14,950 --> 00:04:16,110
在有人看的时候
71
00:04:16,120 --> 00:04:17,630
再现场算
72
00:04:17,640 --> 00:04:19,590
然后生成,反馈给他看
73
00:04:21,290 --> 00:04:22,930
这样,逻辑上才没有冗余
74
00:04:24,200 --> 00:04:27,330
如果你事先生成了放那里,那就是冗余的
75
00:04:28,530 --> 00:04:29,840
为什么要引入冗余
76
00:04:30,300 --> 00:04:32,930
只有一个理由,就是你在性能上考虑
77
00:04:34,010 --> 00:04:37,550
如果说,现场当时算的话,可能会比较慢
78
00:04:38,160 --> 00:04:39,180
我事先算好了
79
00:04:39,190 --> 00:04:41,530
放那里,你直接去查那个表
80
00:04:42,810 --> 00:04:44,480
或者访问类的对象
81
00:04:46,210 --> 00:04:47,100
只有这个理由
82
00:04:47,960 --> 00:04:50,550
但为了性能带来冗余
83
00:04:51,370 --> 00:04:53,340
我们前面课程也说了
84
00:04:54,020 --> 00:04:55,090
必须要很谨慎的
85
00:04:55,260 --> 00:04:57,810
但很多人就把这个当成无能的遮羞布
86
00:05:01,590 --> 00:05:03,830
他根本就不觉得这有什么不妥
87
00:05:03,840 --> 00:05:05,030
也不觉得有什么冗余
88
00:05:06,400 --> 00:05:07,940
也不知道冗余有什么危害
89
00:05:10,770 --> 00:05:13,130
然后跟他说,他说万一有性能问题
90
00:05:14,900 --> 00:05:16,530
他就把这个拿出来做理由
91
00:05:18,610 --> 00:05:21,320
Martin Fowler这里也不例外
92
00:05:21,930 --> 00:05:22,840
包括后面Fowler
93
00:05:22,850 --> 00:05:25,520
还有其他一些处理也是有问题的
94
00:05:25,530 --> 00:05:28,090
后面案例我们也会提到
95
00:05:29,690 --> 00:05:36,580
那应该怎么做,应该是建模它的规则
96
00:05:40,360 --> 00:05:41,280
产品类型
97
00:05:41,840 --> 00:05:42,400
什么规则
98
00:05:42,490 --> 00:05:44,720
就是Fowler这里说的规则
99
00:05:46,270 --> 00:05:50,720
某种类型的产品,它应该分几份入账
100
00:05:51,330 --> 00:05:53,470
入账的间隔是多少天
101
00:05:54,040 --> 00:05:54,660
就可以了
102
00:05:54,670 --> 00:05:59,370
比如说,类型是电子表格的,分三份入账
103
00:06:01,900 --> 00:06:07,020
那么份数就是3,间隔就是30天
104
00:06:07,830 --> 00:06:08,110
对
105
00:06:09,270 --> 00:06:10,310
记住这个规则
106
00:06:10,320 --> 00:06:11,910
这才是本质
107
00:06:14,270 --> 00:06:14,990
应该建模的是这个
108
00:06:16,400 --> 00:06:18,130
或者说,再详细一点
109
00:06:18,140 --> 00:06:19,530
分几次
110
00:06:19,540 --> 00:06:21,630
每次多少份额
111
00:06:21,920 --> 00:06:23,430
份额不一定是平均的
112
00:06:24,340 --> 00:06:25,380
可以分很多份
113
00:06:25,390 --> 00:06:28,060
可以先放10%
114
00:06:28,150 --> 00:06:29,660
下次放20%
115
00:06:30,020 --> 00:06:32,380
下一次放30%,这样都可以
116
00:06:35,800 --> 00:06:37,470
应该建模规则
1
00:00:00,320 --> 00:00:03,100
为什么Fowler这里是这样做
2
00:00:03,110 --> 00:00:04,660
还有另外一个原因就是
3
00:00:05,160 --> 00:00:08,110
他没有把这个规则概念提炼出来
4
00:00:08,120 --> 00:00:11,080
而是把它写在代码里面变成硬编码
5
00:00:12,420 --> 00:00:15,590
我们一会看一下案例
6
00:00:16,250 --> 00:00:20,920
我在网上找了一个复刻的案例的代码
7
00:00:21,310 --> 00:00:24,280
因为Fowler书里面
8
00:00:24,290 --> 00:00:25,880
他给出了代码片段
9
00:00:25,890 --> 00:00:27,560
但代码片段本身
10
00:00:28,070 --> 00:00:29,950
并不是直接能执行的
11
00:00:32,160 --> 00:00:37,680
我找了一个模仿书上的案例
12
00:00:37,690 --> 00:00:40,550
复刻的,下载地址在这里
13
00:00:41,380 --> 00:00:43,790
如果有更好的,大家也可以去找更好的
14
00:00:44,230 --> 00:00:48,480
我找到的这个,是用C#
15
00:00:49,340 --> 00:00:56,260
然后用SQLite作为存储,表结构
16
00:00:56,510 --> 00:00:59,500
它跟这里面是一致的了
17
00:01:00,360 --> 00:01:01,790
三个类,三个表
18
00:01:03,360 --> 00:01:05,560
然后,1对多
19
00:01:05,570 --> 00:01:10,750
所以这里面1方放在多方作为外键
20
00:01:11,960 --> 00:01:17,950
而这个,它使用了一个复合主键,在这里
21
00:01:18,610 --> 00:01:22,910
这边合同的ID
22
00:01:23,430 --> 00:01:27,090
和入账时间的ID(口误)
23
00:01:27,100 --> 00:01:29,620
入账时间
24
00:01:29,630 --> 00:01:32,170
这两个结合在一起
25
00:01:32,180 --> 00:01:33,450
一个复合主键
26
00:01:34,340 --> 00:01:40,590
这个的话可以,就是说,意思就是什么
27
00:01:41,130 --> 00:01:47,010
相当于把这个看作是一个组合的关系了
28
00:01:50,930 --> 00:01:51,760
组合关系
29
00:01:52,650 --> 00:01:53,510
实心菱形
30
00:01:55,110 --> 00:01:55,820
为什么组合
31
00:01:55,830 --> 00:02:01,330
你看,这个是主键
32
00:02:03,050 --> 00:02:04,290
这是主键,PK
33
00:02:05,190 --> 00:02:06,180
那么意味着什么
34
00:02:06,540 --> 00:02:08,270
它不是外键,它是主键
35
00:02:08,280 --> 00:02:10,870
意味着一旦这个合同要是消失了
36
00:02:11,430 --> 00:02:13,580
这里肯定也得消失
37
00:02:14,350 --> 00:02:15,570
你主键都没有了
38
00:02:17,550 --> 00:02:18,630
但这个外键就不一样
39
00:02:18,640 --> 00:02:23,490
你看这个外键
40
00:02:24,530 --> 00:02:30,390
在这里,那么这个消失了
41
00:02:30,850 --> 00:02:31,920
这个会不会消失
42
00:02:33,210 --> 00:02:37,380
这个严格来说你消失这个产品消失了
43
00:02:39,070 --> 00:02:46,000
那么这个合同它引用那个产品不在了
44
00:02:46,010 --> 00:02:47,970
45
00:02:47,980 --> 00:02:50,450
但是信息保留下来
46
00:02:52,830 --> 00:02:54,270
它还是可以保留下来的
47
00:02:54,970 --> 00:02:57,180
只不过引用空掉了
48
00:02:58,160 --> 00:03:00,120
而这个本身它是在物理上
49
00:03:00,130 --> 00:03:01,800
你数据库里面就不能存在
50
00:03:01,810 --> 00:03:04,430
因为你主键这个都被删掉了
51
00:03:04,600 --> 00:03:07,630
你不是外键,你外键可以为空
52
00:03:07,640 --> 00:03:08,710
你主键怎么为空
53
00:03:12,450 --> 00:03:15,230
所以可以这样来理解
54
00:03:16,360 --> 00:03:20,230
下面这个都跟这个一致了
55
00:03:20,600 --> 00:03:22,030
它再加了一个名称
56
00:03:23,090 --> 00:03:24,030
加了一个名称
57
00:03:26,540 --> 00:03:28,390
我们来看一下它的代码
1
00:00:01,300 --> 00:00:03,050
这个就是它的代码
2
00:00:03,870 --> 00:00:05,710
你看,右边这个很简单
3
00:00:05,720 --> 00:00:07,790
就这么几个类 DBManager
4
00:00:07,800 --> 00:00:08,750
然后Gateway
5
00:00:09,630 --> 00:00:12,530
然后Service
6
00:00:12,660 --> 00:00:14,010
RecognitionService
7
00:00:14,700 --> 00:00:16,800
然后还有一个主程序就是
8
00:00:16,810 --> 00:00:18,960
它是控制台的程序,main这里
9
00:00:19,670 --> 00:00:22,090
然后这里,控制台写出来
10
00:00:22,100 --> 00:00:23,610
命令行写出来,就完了
11
00:00:28,140 --> 00:00:31,930
我们来看它的几个类,DbManager
12
00:00:31,940 --> 00:00:33,170
就定义了一个连接
13
00:00:33,260 --> 00:00:36,390
这里指明了数据库的位置
14
00:00:36,560 --> 00:00:38,870
就在它同一个目录下面
15
00:00:39,310 --> 00:00:40,950
SQLite就很简单
16
00:00:40,960 --> 00:00:42,670
就一个DB文件就完了
17
00:00:44,890 --> 00:00:50,230
然后Gateway,就是刚才说的入口
18
00:00:52,610 --> 00:00:57,070
然后,service就是事务脚本类
19
00:00:58,220 --> 00:00:58,650
类是这个
20
00:00:59,060 --> 00:01:06,170
定义了一些,这是计算插入
21
00:01:06,670 --> 00:01:08,400
然后这个是查询的了
22
00:01:08,410 --> 00:01:09,720
查询返回的
23
00:01:15,600 --> 00:01:16,670
就这么多
24
00:01:17,030 --> 00:01:18,300
我们运行看一下
25
00:01:18,310 --> 00:01:20,970
我们随便打一个断点
26
00:01:21,420 --> 00:01:24,870
前面这一段一开始就是填充数据了
27
00:01:24,880 --> 00:01:27,430
它这个案例就直接在这里填充数据了
28
00:01:29,050 --> 00:01:31,360
可以把数据填进去,这么几个数据填进去
29
00:01:32,040 --> 00:01:34,350
前面都是做预热的
30
00:01:34,360 --> 00:01:36,150
包括创建表什么,都在这里
31
00:01:36,820 --> 00:01:38,410
这段不用管
32
00:01:38,500 --> 00:01:39,690
直接在哪里,在这里
相关文章:

[图解]企业应用架构模式2024新译本讲解02-表数据入口
1 00:00:00,420 --> 00:00:04,330 这个案例,我们就是用书上的案例了 2 00:00:06,080 --> 00:00:08,860 收入确认的一个案例 3 00:00:09,510 --> 00:00:11,100 书上讲了,收入确认 4 00:00:13,330 --> 00:00:15,270 就是说,你给…...

SSE(Server Sent Event) 踩坑留念
整条链路是 客户端A --> 服务端 A —> 服务端 B 我负责服务端 A 此时要注意 Client 中的 processes 的写法 Post(value “/v2/xx”, processes MediaType.TEXT_EVENT_STREAM) 这样写是一直报错的 改成下面的写法才可以 Post(value “/v2/xx”, processes MediaT…...

plt.xticks()的作用
参考: https://blog.csdn.net/weixin_41796265/article/details/131442400 plt.xticks() 是 Matplotlib 库中的一个函数,用于设置坐标轴刻度的位置和标签。 它的作用包括: 设置 x 轴刻度的位置:可以通过传递一个数组或列表来设…...

开发者的福音:免去搭建服务,让你的应用开发变得像吃蛋糕一样简单!
传统应用开发的"噩梦" 想象一下,你正在准备一场盛大的晚宴,但必须从零开始建造厨房、种植食材、甚至学习烹饪技巧。这就是传统应用开发的现状——你不仅要设计数据库、编写API接口,还要处理对象存储、实时数据库、云数据库等一系列…...

AVL树的模拟实现
我们上期提到了二叉搜索树,只是简单的讲了一下原理,那么今天我们就讲一下AVL树。 目录 AVL树的概念AVL树的实现AVL树的架构insert插入引用pair对象引进parent指针仅插入数据调节平衡因子情况1:插入在父亲的右边,父亲的平衡因子后…...

php 一个数组中的元素是否在一个字符串中包含
php 一个数组中的元素是否在一个字符串中包含 要检查一个数组中的元素是否在一个字符串中出现,你可以使用strpos()函数。这个函数返回子字符串首次出现的位置索引,如果没有找到,它会返回false。 $array [apple, banana, cherry]; $string …...

conda修改环境名称后,无法安装包,显示no such file
1问题描述 原本创建环境时设置的名字不太合适,但是因为重新创建环境很麻烦,安装很多包。。所以想直接对包名进行修改,本人采用的方式是直接找到conda环境的文件目录,然后修改文件名,简单粗暴。确实修改成功了…...

linux安装mysql【linux】
linux安装mysql【linux】 前言版权推荐CentOS7.9安装mysql8.0【linux】yum安装rpm安装 最后 前言 2024-5-13 15:52:22 以下内容源自《【linux】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://jss…...

C 语言实例 - 表格形式输出数据
将 1~100 的数据以 10x10 矩阵格式输出。 #include <stdio.h>int main() {int i, j, count;for(i 1; i < 10; i) {for(j i; j <100; j 10 )printf(" %3d", j);printf("\n");}return 0; }运行结果: 1 11 21 31 41 51 61 …...
markdown语法保存
这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...

数据结构(八)二叉树、哈希查找
文章目录 一、树(一)概念1. 前序遍历:根左右2. 中序遍历:左根右3. 后序遍历:左右根4. 层序遍历:需要借助队列实现 (二)代码实现:二叉树1. 结构体定义2. 创建二叉树1. 注意…...

uniApp 创建Android.keystore证书IOS的证书
Android 证书 1、安装JRE环境 可从Oracle官方下载jre安装包:https://www.oracle.com/technetwork/java/javase/downloads/index.html 打开命令行(cmd),输入以下命令: //切换工作目录到f:路径 D: //将jre命令添加到…...

怎么藏族翻译中文在线翻译?更好地了解藏族文化
怎么藏族翻译中文在线翻译?着全球化的发展,语言交流的重要性日益凸显。藏族,作为中国的一个古老而神秘的民族,其语言对于很多人来说充满了神秘感。然而,在今天的数字化时代,我们有了更多的工具来打破语言壁…...

模拟集成电路(5)----单级放大器(共栅级)
模拟集成电路(5)----单级放大器(共栅级) 有一些场合需要一些小的输入电阻(电流放大器) 大信号分析 − W h e n V i n ≥ V B − V T H ∙ M 1 i s o f f , V o u t V D D − F o r L o w e r V i n I d 1 2 μ n C o x W L ( V…...

学习笔记——数据通信基础——数据通信网络(网络工程师)
网络工程师 网络工程,就是围绕着网络进行的一系列的活动,包括∶网络规划、设计、实施、调试、排错等。网络工程设计的知识领域很宽广,其中路由和交换是计算机网络的基本。 网络工程师∶是在网络工程领域,掌握专业的网络技术&…...

将本地项目上传到 gitee 仓库
1、创建 gitee 仓库 到 gitee 官网,新建仓库 配置新建仓库 完成仓库的创建 项目上传到仓库 上传项目需要安装git git官方下载地址:git下载地址 安装完成,前往本地项目所在文件夹,右击选择 Git Bash Here 刚下载完成需要配置G…...

Django学习
1.pycharm社区版创建django PyCharm社区版如何创建Django项目并运行_pycharm社区版打开django-CSDN博客 2.Django TemplateDoesNotExist: rest_framework 当我们使用djangorestframework框架时,首先下载pip install djangorestframework 参考博文Django Templat…...

说唱程序员
Yo yo yo,这里是代码的战场,程序员的秀场, 键盘敲击声,是我们的节奏响亮。 夜深人静时,我们与Bug正面刚, 调试、优化,每一行代码都得刚强。 我们不懂数理化,只是喜欢瞎搞哈…...

058.最后一个单词的长度
题意 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 难度 简单 示例 1: 输入:s "Hello World" 输…...

决策树模型-预测用户是否购买某母婴产品
1,场景描述 假设我们是京东的数据分析师,负责分析母婴产品的购买行为。我们想预测用户是否会购买一款新上线的母婴产品。为了进行预测,我们将利用用户的历史购买数据、浏览行为和其他特征,通过决策树模型进行分析,并提…...

工具使用-网络性能测试工具(iperf)-TCP 和 UDP 的吞吐量-包转发率参数的理解
时间戳:2024年5月26日15:18:39 iperf 和 netperf 都是最常用的网络性能测试工具,测试 TCP 和 UDP 的吞吐量。它们都以客户端和服务器通信的方式,测试一段时间内的平均吞吐量。 接下来,我们就以 iperf 为例,看一下 TC…...

什么是JS引擎
JS引擎(JavaScript引擎)是负责在浏览器或Node.js等环境中解析和执行JavaScript代码的软件组件。它是JavaScript运行时的核心,将JavaScript代码转换为机器语言,使其能够在计算机上执行。 不同的浏览器和运行环境使用不同的JS引擎。…...

前端手写文件上传;使用input实现文件拖动上传
使用input实现文件拖动上传 vue2代码: <template><div><div class"drop-area" dragenter"highlight" dragover"highlight" dragleave"unhighlight" drop"handleDrop"click"handleClick&quo…...

Flutter 中的 PhysicalModel 小部件:全面指南
Flutter 中的 PhysicalModel 小部件:全面指南 Flutter 的 PhysicalModel 小部件提供了一种简单而高效的方式来给应用添加物理效果,如阴影和层次感。它本质上是一个矩形的 Container,带有圆角边框和可选的阴影,能够模仿真实世界中…...

Flutter 中的 Center 小部件:全面指南
Flutter 中的 Center 小部件:全面指南 在Flutter的世界里,Center是一个简单而强大的布局小部件,它能够将子组件放置在父组件的中心位置。无论是水平中心、垂直中心,还是两者都居中,Center都能轻松实现。本文将详细介绍…...

windows 执行node报错 800A1391
在项目下执行node -v的时候,抛了这个错误,一开始没发现有啥问题 现在一看,这个报错里的node怎么是个文件... 出现这个问题,是因为项目下,有个同名的文件叫node.js,搞得windows一时不知道是想打开node.js文…...

无人机操作界面来了,起点就很高呀。
无人机操作界面设计需要考虑以下几个方面: 易用性:无人机操作界面应该简单直观,易于操作和理解。操作按钮和控键应该布局合理,易于触摸或点击。重要的操作功能应该易于找到和使用,避免用户迷失或困惑。实时反馈&#…...

Android 11 AudioPolicyService 启动流程
AudioPolicyService在init进程中启动,源码路径:frameworks/av/media/audioserver/audioserver.rc service audioserver /system/bin/audioserverclass coreuser audioserver# media gid needed for /dev/fm (radio) and for /data/misc/media (tee)grou…...

java中static关键字面试五连问
抽象(abstract)方法是否可同时是静态的(static)? 抽象方法本来将来就是要被重写的,而静态方法不能被重写,所以是错误的 是否可以从一个静态(static)方法内部发出对非静态方法的调…...

基于文本来推荐相似酒店
基于文本来推荐相似酒店 查看数据集基本信息 import pandas as pd import numpy as np from nltk.corpus import stopwords from sklearn.metrics.pairwise import linear_kernel from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extrac…...