软件体系结构

TJU


软件体系结构实验报告

实验一

XML语言描述实验

  • 实验目的:练习使用XML语言对数据进行描述,熟悉并掌握XML文档的基本结构和语法规则
  • 实验内容:选择自己熟悉的数据源,采用XML语言对其建模描述
  • 实验要求
  1. 环境自选,工具自定
  2. XML文件格式良好,包含XML声明、合理的元素嵌套结构、属性、注释
  3. 使用XML Schema对XML文档结构进行描述
  4. XML代码不少于100行,层次不少于3层
  5. 实验报告中包含对数据源的描述以及XML和XML Schema文件代码

我选择了电影信息作为数据源,通过Vscode用XML语言对其建模描述

以三部电影为例,根元素为movieList即电影列表,收录电影及其相关信息

每部电影以movie为父元素,记录其详细信息,其中包括以下信息

  • 电影名称
  • 导演(可以为多个)
    • 姓名
  • 编剧(可以为多个)
    • 姓名
  • 演员(可以为多个)
    • 姓名
    • 性别
    • 出生日期 - 年月日
    • 国籍
  • 电影类型(可以为多种)
  • 片源
    • 制片国家**/**地区
  • 语言
  • 上映信息(按地区划分)
    • 某地区上映的具体时间 - 年月日
  • 电影长度(以分钟为单位)
  • 电影评分(**/**10 - 评分来源于豆瓣)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="lab2.xsl"?> <!-- 引入XSL文件用于可视化展示 -->
<movieList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="lab1.xsd"> <!-- 引入XSD文件描述XML文档结构 -->
<!-- 电影表 -->
<movie>
<!-- 电影 -->
<name>
Spider Man
:
No Way Home
</name> <!-- 名称 -->
<directorList> <!-- 导演表 -->
<director> <!-- 导演 -->
<name>乔·沃茨</name> <!-- 姓名 -->
</director>
</directorList>
<screenwriterList> <!-- 编剧表 -->
<screenwriter> <!-- 编剧 -->
<name>克里斯·麦克纳</name> <!-- 姓名 -->
</screenwriter>
<screenwriter>
<name>埃里克·萨默斯</name>
</screenwriter>
<screenwriter> <!-- 编剧 -->
<name>斯坦·李</name> <!-- 姓名 -->
</screenwriter>
<screenwriter> <!-- 编剧 -->
<name>史蒂夫·迪特寇</name> <!-- 姓名 -->
</screenwriter>
</screenwriterList>
<starList>
<!-- 演员表 -->
<star>
<!-- 演员 -->
<name>汤姆·赫兰德</name> <!-- 姓名 -->
<gender></gender> <!-- 性别 -->
<birthday>
<!-- 出生日期 -->
<year>1996</year> <!-- 年 -->
<month>06</month> <!-- 月 -->
<date>01</date> <!-- 日 -->
</birthday>
<nationality>UK</nationality> <!-- 国籍 -->
</star>
<star>
<name>赞达亚</name>
<gender></gender>
<birthday>
<year>1996</year>
<month>09</month>
<date>01</date>
</birthday>
<nationality>USA</nationality>
</star>
<star>
<name>本尼迪克特·康伯巴奇</name>
<gender></gender>
<birthday>
<year>1976</year>
<month>07</month>
<date>19</date>
</birthday>
<nationality>UK</nationality>
</star>
</starList>
<typeList> <!-- 类型表 -->
<type> <!-- 类型 -->
<name>动作</name> <!-- 名称 -->
</type>
<type>
<name>科幻</name>
</type>
<type>
<name>冒险</name>
</type>
</typeList>
<derivation>
<!-- 片源 -->
<country>USA</country> <!-- 制片国家 -->
<region>Iceland</region> <!-- 制片地区 -->
</derivation>
<language>English</language> <!-- 语言 -->
<release>
<!-- 上映(以上映地区划分) -->
<information>
<!-- 信息 -->
<region>中国台湾</region> <!-- 地区 -->
<detail>
<!-- 具体上映时间 -->
<year>2021</year> <!-- 上映年份 -->
<month>12</month> <!-- 上映月份 -->
<date>15</date> <!-- 上映日期 -->
</detail>
</information>
<information>
<region>美国</region>
<detail>
<year>2021</year>
<month>12</month>
<date>17</date>
</detail>
</information>
</release>
<length>148</length> <!-- 片长(分钟) -->
<evaluation>8.0</evaluation> <!-- 评分(/10) -->
</movie>
<movie>
<!-- 电影 -->
<name>长津湖</name> <!-- 名称 -->
<directorList> <!-- 导演表 -->
<director> <!-- 导演 -->
<name>陈凯歌</name> <!-- 姓名 -->
</director>
<director>
<name>徐克</name>
</director>
<director>
<name>林超</name>
</director>
</directorList>
<screenwriterList> <!-- 编剧表 -->
<screenwriter> <!-- 编剧 -->
<name>兰晓龙</name> <!-- 姓名 -->
</screenwriter>
<screenwriter>
<name>黄建新</name>
</screenwriter>
</screenwriterList>
<starList>
<!-- 演员表 -->
<star>
<!-- 演员 -->
<name>吴京</name> <!-- 姓名 -->
<gender></gender> <!-- 性别 -->
<birthday>
<!-- 出生日期 -->
<year>1974</year> <!-- 年 -->
<month>04</month> <!-- 月 -->
<date>03</date> <!-- 日 -->
</birthday>
<nationality>China</nationality> <!-- 国籍 -->
</star>
<star>
<name>易烊千玺</name>
<gender></gender>
<birthday>
<year>2000</year>
<month>11</month>
<date>28</date>
</birthday>
<nationality>China</nationality>
</star>
<star>
<name>段奕宏</name>
<gender></gender>
<birthday>
<year>1973</year>
<month>05</month>
<date>16</date>
</birthday>
<nationality>China</nationality>
</star>
<star>
<name>朱亚文</name>
<gender></gender>
<birthday>
<year>1984</year>
<month>04</month>
<date>21</date>
</birthday>
<nationality>China</nationality>
</star>
<star>
<name>李晨</name>
<gender></gender>
<birthday>
<year>1978</year>
<month>11</month>
<date>24</date>
</birthday>
<nationality>China</nationality>
</star>
</starList>
<typeList> <!-- 类型 -->
<type> <!-- 类型 -->
<name>剧情</name> <!-- 名称 -->
</type>
<type>
<name>历史</name>
</type>
<type>
<name>战争</name>
</type>
</typeList>
<derivation>
<!-- 片源 -->
<country>China</country> <!-- 制片国家 -->
<region>Mainland</region> <!-- 制片地区 -->
</derivation>
<language>Chinese</language> <!-- 语言 -->
<release>
<!-- 上映(以上映地区划分) -->
<information>
<!-- 信息 -->
<region>中国大陆</region> <!-- 地区 -->
<detail>
<!-- 具体上映时间 -->
<year>2021</year> <!-- 上映年份 -->
<month>09</month> <!-- 上映月份 -->
<date>30</date> <!-- 上映日期 -->
</detail>
</information>
</release>
<length>176</length> <!-- 片长(分钟) -->
<evaluation>7.4</evaluation> <!-- 评分(/10) -->
</movie>
<movie>
<!-- 电影 -->
<name>三傻大闹宝莱坞</name> <!-- 名称 -->
<directorList> <!-- 导演表 -->
<director> <!-- 导演 -->
<name>拉吉库马尔·希拉尼</name> <!-- 姓名 -->
</director>
</directorList>
<screenwriterList> <!-- 编剧表 -->
<screenwriter> <!-- 编剧 -->
<name>维德胡·维诺德·乔普拉</name> <!-- 姓名 -->
</screenwriter>
<screenwriter>
<name>拉吉库马尔·希拉尼</name>
</screenwriter>
<screenwriter>
<name>阿希贾特·乔希</name>
</screenwriter>
</screenwriterList>
<starList>
<!-- 演员表 -->
<star>
<!-- 演员 -->
<name>阿米尔·汗</name> <!-- 姓名 -->
<gender></gender> <!-- 性别 -->
<birthday>
<!-- 出生日期 -->
<year>1965</year> <!-- 年 -->
<month>03</month> <!-- 月 -->
<date>14</date> <!-- 日 -->
</birthday>
<nationality>India</nationality> <!-- 国籍 -->
</star>
<star>
<name>卡琳娜·卡普尔</name>
<gender></gender>
<birthday>
<year>1980</year>
<month>09</month>
<date>21</date>
</birthday>
<nationality>India</nationality>
</star>
<star>
<name>马达范</name>
<gender></gender>
<birthday>
<year>1970</year>
<month>06</month>
<date>01</date>
</birthday>
<nationality>India</nationality>
</star>
<star>
<name>沙尔曼·乔希</name>
<gender></gender>
<birthday>
<year>1979</year>
<month>03</month>
<date>17</date>
</birthday>
<nationality>India</nationality>
</star>
<star>
<name>奥米·瓦依达</name>
<gender></gender>
<birthday>
<year>1982</year>
<month>01</month>
<date>10</date>
</birthday>
<nationality>USA</nationality>
</star>
</starList>
<typeList> <!-- 类型 -->
<type> <!-- 类型 -->
<name>剧情</name> <!-- 名称 -->
</type>
<type>
<name>喜剧</name>
</type>
<type>
<name>爱情</name>
</type>
<type>
<name>歌舞</name>
</type>
</typeList>
<derivation>
<!-- 片源 -->
<country>India</country> <!-- 制片国家 -->
<region></region> <!-- 制片地区 -->
</derivation>
<language>Hindi</language> <!-- 语言 -->
<release>
<!-- 上映(以上映地区划分) -->
<information>
<!-- 信息 -->
<region>中国大陆</region> <!-- 地区 -->
<detail>
<!-- 具体上映时间 -->
<year>2011</year> <!-- 上映年份 -->
<month>12</month> <!-- 上映月份 -->
<date>08</date> <!-- 上映日期 -->
</detail>
</information>
<information>
<region>印度</region>
<detail>
<year>2009</year>
<month>12</month>
<date>25</date>
</detail>
</information>
</release>
<length>171</length> <!-- 片长(分钟) -->
<evaluation>9.2</evaluation> <!-- 评分(/10) -->
</movie>
</movieList>

使用XML Schema对XML文档结构进行描述,描述了各个元素的类型并给可以不唯一的元素设置取值范围,详细代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="movieList"> <!-- 声明电影列表 -->
<xs:complexType> <!-- 声明为复杂类型 -->
<xs:sequence>
<xs:element name="movie" maxOccurs="unbounded"> <!-- 声明电影并设置其数量无限制 -->
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" /> <!-- 声明电影名称及其类型 -->
<xs:element name="directorList"> <!-- 声明导演表 -->
<xs:complexType> <!-- 设置导演表为复杂类型 -->
<xs:sequence>
<xs:element name="director" maxOccurs="unbounded"> <!-- 声明导演并设置其数量无限制 -->
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" /> <!-- 声明导演姓名及其类型 -->
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="screenwriterList"> <!-- 声明编剧表 -->
<xs:complexType> <!-- 设置编剧表为复杂类型 -->
<xs:sequence>
<xs:element name="screenwriter" maxOccurs="unbounded"> <!-- 声明编剧并设置其数量无限制 -->
<xs:complexType> <!-- 设置编剧为复杂类型 -->
<xs:sequence>
<xs:element name="name" type="xs:string" /> <!-- 声明编剧姓名及其类型 -->
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="starList"> <!-- 声明演员表 -->
<xs:complexType> <!-- 设置演员表为复杂类型 -->
<xs:sequence>
<xs:element name="star" maxOccurs="unbounded"> <!-- 声明演员并设置其数量为无限制 -->
<xs:complexType> <!-- 设置演员为复杂类型 -->
<xs:sequence>
<xs:element name="name" type="xs:string" /> <!-- 声明演员姓名及其类型 -->
<xs:element name="gender" type="xs:string" /> <!-- 声明演员性别及其类型 -->
<xs:element name="birthday"> <!-- 声明演员出生日期 -->
<xs:complexType> <!-- 设置演员出生日期为复杂类型 -->
<xs:sequence>
<xs:element name="year" type="xs:integer" /> <!-- 声明演员出生日期中的年 -->
<xs:element name="month" type="xs:integer" /> <!-- 声明演员出生日期中的月 -->
<xs:element name="date" type="xs:integer" /> <!-- 声明演员出生日期中的日 -->
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="nationality" type="xs:string" /> <!-- 声明演员国籍及其类型 -->
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="typeList"> <!-- 声明电影类型表 -->
<xs:complexType> <!-- 设置电影类型表为复杂类型 -->
<xs:sequence>
<xs:element name="type" maxOccurs="unbounded"> <!-- 声明电影类型并设置其数量无限制 -->
<xs:complexType> <!-- 设置电影类型为复杂类型 -->
<xs:sequence>
<xs:element name="name" type="xs:string" /> <!-- 声明电影类型名称及其类型 -->
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="derivation"> <!-- 声明电影片源 -->
<xs:complexType> <!-- 设置电影片源为复杂类型 -->
<xs:sequence>
<xs:element name="country" type="xs:string" /> <!-- 声明电影制作国家及其类型 -->
<xs:element name="region" type="xs:string" /> <!-- 声明电影制作地区及其类型 -->
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="language" type="xs:string" /> <!-- 声明电影默认语言及其类型 -->
<xs:element name="release"> <!-- 声明电影发布模块 -->
<xs:complexType> <!-- 设置电影发布模块为复杂类型 -->
<xs:sequence>
<xs:element name="information" maxOccurs="unbounded"> <!-- 声明电影发布信息并设置其数量无限制 -->
<xs:complexType> <!-- 设置电影发布信息为复杂类型 -->
<xs:sequence>
<xs:element name="region" type="xs:string" /> <!-- 声明电影发布地区及其类型 -->
<xs:element name="detail"> <!-- 声明电影发布具体信息 -->
<xs:complexType> <!-- 设置电影发布具体信息为复杂类型 -->
<xs:sequence>
<xs:element name="year" type="xs:integer" /> <!-- 声明电影在该地区发布的年份及其类型 -->
<xs:element name="month" type="xs:integer" /> <!-- 声明电影在该地区发布的月份及其类型 -->
<xs:element name="date" type="xs:integer" /> <!-- 声明电影在该地区发布的日期及其类型 -->
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="length" type="xs:integer" /> <!-- 生命电影长度及其类型(以分钟为单位) -->
<xs:element name="evaluation" type="xs:decimal" /> <!-- 生命电影评分及其类型, 这里由于评分不一定为整数, 所以类型为decimal -->
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

实验二

XML内容可视化实验

  • 实验目的:练习使用XSL语言对XML数据文件进行可视化展示,熟悉并掌握XSL文档的基本结构和语法规则
  • 实验内容:对实验一中撰写的XML数据,采用XSL语言对其排版显示
  • 实验要求
  1. 环境自选,工具自定
  2. 实验报告中包含数据的可视化展示界面以及XSL代码

通过Vscode使用XSL语言将实验一中的数据进行可视化,通过表格来展示电影信息,结果图如下所示

1

由于演员通常为多个并且包含其详细信息,所以Star List项也是一个表格,包含演员的姓名、性别等详细信息

此外,电影在不同地区的发布或上映时间也可能不同,同理Release项也是一个表格,存储各个地区的具体上映时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
</head>
<body>
<center> <!-- 使元素居中 -->
<h1 style="margin:17px; font-weight:900">Movie List</h1> <!-- 设置表格名称为电影列表并调整标题样式 -->
<table border="7"> <!-- 使用表格来展示XML中与电影相关的数据 -->
<tr bgcolor="#000"> <!-- 设置表头 -->
<th align="left" style="color:#fff">Name</th> <!-- 电影名称 -->
<th align="left" style="color:#fff">Director</th> <!-- 导演 -->
<th align="left" style="color:#fff">Screenwriter</th> <!-- 编剧 -->
<th align="left" style="color:#fff">Star List</th> <!-- 演员表 -->
<th align="left" style="color:#fff">Type</th> <!-- 电影类型 -->
<th align="left" style="color:#fff">Derivation</th> <!-- 片源 -->
<th align="left" style="color:#fff">Language</th> <!-- 语言 -->
<th align="left" style="color:#fff">Release</th> <!-- 发布/上映信息 -->
<th align="left" style="color:#fff">Length</th> <!-- 电影长度 -->
<th align="left" style="color:#fff">Evaluation</th> <!-- 评分 -->
</tr>
<xsl:for-each select="movieList/movie"> <!-- 使用循环填充表格内部信息, 在movieList/movie层级开始循环获取数据 -->
<tr> <!-- 填充表格内的一行数据 -->
<td> <!-- 对应表头中的电影名称 -->
<xsl:value-of select="name" /> <!-- 引用电影名称 -->
</td>
<td> <!-- 对应表头中的导演, 由于导演有多个但不涉及具体信息, 就多行显示所有导演姓名即可 -->
<xsl:for-each select="directorList/director"> <!-- 在movieList/movie/directorList/director层级开始循环获取数据 -->
<xsl:value-of select="name" /> <!-- 引用电影导演表中的导演姓名 -->
<br></br> <!-- 换行 -->
</xsl:for-each>
</td>
<td> <!-- 对应表头中的编剧, 与导演同理, 多行显示所有编剧姓名 -->
<xsl:for-each select="screenwriterList/screenwriter"> <!-- 在movieList/movie/screenwriterList/screenwriter层级开始循环获取数据 -->
<xsl:value-of select="name" /> <!-- 引用电影编剧表中的编剧姓名 -->
<br></br> <!-- 换行 -->
</xsl:for-each>
</td>
<td> <!-- 对应表头中的演员表, 并且涉及演员的多个属性, 所以这项使用表格展示 -->
<table border="4">
<tr bgcolor="#007aff"> <!-- 设置表头 -->
<th align="left" style="color:#fff">Name</th> <!-- 演员姓名 -->
<th align="left" style="color:#fff">Gender</th> <!-- 演员性别 -->
<th align="left" style="color:#fff">Birthday</th> <!-- 演员出生日期 -->
<th align="left" style="color:#fff">Nationlity</th> <!-- 演员国籍 -->
</tr>
<xsl:for-each select="starList/star"> <!-- 使用循环填充演员表表格内部的信息, 在movieList/movie/starList/star层级开始循环获取数据 -->
<tr>
<td> <!-- 对应演员表表头中的演员姓名 -->
<xsl:value-of select="name" /> <!-- 引用演员的姓名 -->
</td>
<td> <!-- 对应演员表表头的演员性别 -->
<xsl:value-of select="gender" /> <!-- 引用演员的性别 -->
</td>
<td> <!-- 对应演员表表头的演员出生日期, 以xxxx/xx/xx的形式呈现 -->
<xsl:value-of select="birthday/year" /> <!-- 引用演员出生日期中的年份 -->
<span>/</span> <!-- 分隔符 -->
<xsl:value-of select="birthday/month" /> <!-- 引用演员出生日期中的月份 -->
<span>/</span> <!-- 分隔符 -->
<xsl:value-of select="birthday/date" /> <!-- 引用演员出生日期中的日期 -->
</td>
<td> <!-- 对应演员表表头的演员国籍 -->
<xsl:value-of select="nationality" /> <!-- 引用演员的国籍 -->
</td>
</tr>
</xsl:for-each>
</table>
</td>
<td> <!-- 对应表头的电影类型, 与导演同理, 多行显示所有类型名称 -->
<xsl:for-each select="typeList/type"> <!-- 在movieList/movie/typeList/type层级开始循环获取数据 -->
<xsl:value-of select="name" /> <!-- 引用电影类型的名称 -->
<br></br> <!-- 换行 -->
</xsl:for-each>
</td>
<td> <!-- 对应表头的电影片源信息 -->
<xsl:value-of select="derivation" /> <!-- 引用电影的片源 -->
</td>
<td> <!-- 对应表头的电影语言 -->
<xsl:value-of select="language" /> <!-- 音容电影的语言 -->
</td>
<td> <!-- 对应表头的电影发布/上映信息, 与演员表类似, 可能涉及不同地区的多个上映信息, 所以同样用表格显示 -->
<table border="4">
<tr bgcolor="#007aff"> <!-- 设置表头 -->
<th align="left" style="color:#fff">Region</th> <!-- 电影上映地区 -->
<th align="left" style="color:#fff">Time</th> <!-- 电影上映时间 -->
</tr>
<xsl:for-each select="release/information"> <!-- 在movieList/movie/derivation/release/information层级开始循环获取数据 -->
<tr>
<td> <!-- 对应上映表表头的上映地区 -->
<xsl:value-of select="region" /> <!-- 引用电影上映地区 -->
</td>
<td> <!-- 对应上映表表头的上映时间, 同样以xxxx/xx/xx的形式显示 -->
<xsl:value-of select="detail/year" /> <!-- 引用电影上映时间中的年份 -->
<span>/</span> <!-- 分隔符 -->
<xsl:value-of select="detail/month" /> <!-- 引用电影上映时间中的月份 -->
<span>/</span> <!-- 分隔符 -->
<xsl:value-of select="detail/date" /> <!-- 引用电影上映时间中的日期 -->
</td>
</tr>
</xsl:for-each>
</table>
</td>
<td> <!-- 对应表头的电影长度 -->
<xsl:value-of select="length" /> <!-- 引用电影长度 -->
</td>
<td> <!-- 对应表头的电影评分 -->
<xsl:value-of select="evaluation" /> <!-- 引用电影评分 -->
</td>
</tr>
</xsl:for-each>
</table>
</center>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

实验三

C2体系结构风格实验

  • 实验目的:练习使用C2体系结构风格对软件系统进行建模,并应用C2语言对体系结构进行描述
  • 实验内容:自选软件项目背景,应用C2风格对该软件系统进行设计,并应用C2语言对项目包含的构件及连接件进行描述
  • 实验要求
  1. 项目背景自选,可以不使用工具
  2. 项目构件实体类型不少于3种,连接件不少于2种
  3. 实验报告中包含项目的C2结构图,以及构件和连接件的C2语言描述

根据C2体系结构风格的特点:

  • 构件之间不能直接连接,相对独立
  • 构件和连接件都需要有顶部和底部
  • 构件的顶部或底部只能与连接件的底部或顶部相连
  • 连接件之间可以通过顶部和底部连接
  • 构件可以感知上一层构件而不能感知下一层构件
  • 构件之间通过连接件的异步消息机制进行交互

以饭店经营管理系统为例,由系统安排任务,不同部门(即模块)负责不同工作内容,使用C2体系结构风格进行建模,建模结构图与C2语言描述如下所示

2

对Restaurant饭店经营管理系统构件的描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
component Restaurant is
interface
top_domain is
out
run();
manage();
toOrder();
toService();
toCuisine();
in
order();
service();
cuisine();
behavior
startup always_generate order, service, cuisine;
received_messages order may_generate delivery xor dineIn;
received_messages service may_generate placeOrder xor bookSeat xor bill;
received_messages cuisine may_generate make xor recycle xor sack;
end Restaurant;

对Order订单系统构件的描述

1
2
3
4
5
6
7
8
9
10
11
12
component Order is
interface
bottom_domain is
out
order();
toDineIn();
toDelivery();
in
fromRestaurant();
behavior
received_messages fromRestaurant always_generate dineIn xor delivery;
end Order;

对Service服务系统构件的描述

1
2
3
4
5
6
7
8
9
10
11
12
13
component Service is
interface
bottom_domain is
out
service();
toPlaceOrder();
toBookSeat();
toBill();
in
fromRestaurant();
behavior
received_messages fromRestaurant always_generate placeOrder xor bookSeat xor bill;
end Service;

对Cuisine菜品系统构件的描述

1
2
3
4
5
6
7
8
9
10
11
12
13
component Cuisine is
interface
bottom_domain is
out
service();
toMake();
toRecycle();
toSack();
in
fromRestaurant();
behavior
received_messages fromRestaurant always_generate make xor recycle xor sack;
end Cuisine;

对系统体系结构的描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
architecture RestaurantManager is
conceptual_components
Restaurant; Order; Service; Cuisine;
connectors
connector ManageConn is message_filter no_filtering;
connector OrderConn is message_filter no_filtering;
connector ServiceConn is message_filter no_filtering;
connector CuisineConn is message_filter no_filtering;
architecture_topology
connector ManageConn connections
top_ports OrderConn; ServiceConn; CuisineConn;
bottom_ports Restaurant;
connector OrderConn connections
top_ports DineIn; Delivery;
bottom_ports ManageConn;
connector ServiceConn connections
top_ports PlaceOrder; BookSeat; Bill;
bottom_ports ManageConn;
connector CuisineConn connections
top_ports Make; Recycle; Sack;
bottom_ports ManageConn;
end RestaurantManager;

对餐厅管理系统的描述

1
2
3
4
5
6
system RestaurantManager_1 is
architecture RestaurantManager with
Order instance DineIn, Delivery;
Service instance PlaceOrder, BookSeat, Bill;
Cuisine instance Make, Recycle, Sack;
end RestaurantManager_1;

实验四

软件体系结构风格实验

  • 实验目的:理解B/S和C/S两种体系结构风格的组成结构
  • 实验内容:自选软件项目背景,对该项目进行需求分析,并应用B/S或C/S风格对该软件系统进行设计
  • 实验要求
  1. 项目背景自选,工具自定
  2. 用层次图描述系统的层次化结构,包含系统的模块组成以及各模块之间的关联关系
  3. 给出B/S或C/S体系结构风格的应用方案,以及选取该风格的原因分析

首先需要理解C/S与B/S两种架构的概念

  • C/S架构即Client/Server(客户端/服务端)架构,具有强大的数据操作和事务处理能力,对于硬件和软件的变化显示出极大的适应性和灵活性,使系统中的功能构建充分隔离;但开发成本较高,客户端程序设计复杂,形式单一,移植困难,不利于推广使用
  • B/S架构即Browser/Server(浏览器/服务器)架构,节约开发成本,用通用浏览器代替客户端实现功能;但系统扩展能力差,安全性难以控制,数据查询的响应速度较慢,动态交互性较弱

以医院预约挂号问诊为例,首先医院需要安排问诊时间,病人根据医院要求进行预约挂号,支付相应费用后提前取票看诊,层次图如下所示

3

我认为该系统应使用B/S体系结构风格进行设计

医院的目的是为了治疗病人,提供医疗服务。挂号和预约是当前患者就诊非常重要的一个环节。对于PC端,如果可以简化操作流程,降低系统要求,那么久可以给患者减少不必要的麻烦,例如下载客户端,繁琐的预约操作;对于移动端,小程序公众号等服务发展迅速,慢慢减少了对于手机APP的依赖,此外,开发人员可以做出良好的移动适配来满足手机端的用户需求,也减少了下载应用程序这一步骤,只需进入医院的官网即可进行后续操作。挂号预约需要的是方便快捷,我认为B/S体系结构风格完全可以满足系统需求

实验五

软件体系结构描述——逻辑视图

  • 实验目的:学习软件体系结构的逻辑视图描述,掌握用例图的基本功能和使用方法
  • 实验内容:自选软件项目背景,对该项目需求进行分析,完成系统的需求建模,给出系统的逻辑视图
  • 实验要求
  1. 项目背景自选,工具自定
  2. 给出系统的详细用例模型,包含UML用例图和用例规约描述

逻辑视图主要支持系统的功能需求,描述系统提供给最终用户的服务,将系统分解成一系列来自不同问题领域的功能抽象。以云课堂教学系统(类似于智慧树的线上教学系统)为例,逻辑视图如下所示

4

实验六

软件体系结构描述——进程视图

  • 实验目的:学习软件体系结构的进程视图描述,掌握顺序图、活动图、状态图的基本功能和使用方法
  • 实验内容:根据实验五建立的用例模型,对项目进行业务分析,说明业务流程,完成系统的行为模型,给出系统的进程视图
  • 实验要求
  1. 给出系统的行为模型,包含顺序图描述系统的业务过程、活动图描述系统的主要活动、状态图描述系统的主要状态,给出以上三种 UML 图模型

进程视图侧重于系统的运行特性,主要关注一些非功能性的需求,强调并发性、分布性、系统集成性和系统容错能力,可描述多层抽象,分别关注不同的方面。同样以云教学课堂系统为例,进程视图如下所示

5

6

7

8

9

10

11

12

实验七

软件体系结构描述——开发视图

  • 实验目的:学习软件体系结构的开发视图描述,练习从需求分析中抽象出类的方法,掌握类图的基本功能 和使用方法
  • 实验内容:根据以上实验中建立的逻辑视图和进程视图,完成系统的静态建模,给出系统的开发视图
  • 实验要求
  1. 给出系统的类模型,包含完整的 UML 类图及其关联关系表示

开发视图主要侧重于软件模块的组织和管理,考虑软件内部的需求,充分考虑由于具体开发工具的不同而带来的局限性,通过系统输入输出关系的模型图和子系统图来描述。同样以云课堂教学系统为例,开发视图如下

13

实验八

软件体系结构描述——物理视图

  • 实验目的:学习软件体系结构的物理视图描述,掌握构件图和部署图的基本功能和使用方法
  • 实验内容:根据以上实验中建立的逻辑视图、进程视图和开发视图,对项目的物理部署节点进行分析和规划,完成系统的部署建模,给出系统的物理视图
  • 实验要求
  1. 给出系统的部署模型,包含 UML 构件图和部署图

物理视图主要考虑如何把软件映射到硬件上,通常要考虑到系统性能、规模/可靠性等,解决系统拓扑结构、系统安装、通讯等问题;当软件运行于不同的节点上时,各视图中的构件都直接或间接地对应于系统的不同节点上,因此,从软件到节点的映射要有较高的灵活性,当环境改变时,对系统其他视图的影响最小。同样以云课堂教学系统为例,物理视图如下所示

14

15

实验心得

学习软件体系结构之前,我认为只要有优秀的编码能力就可以实现一个项目中各种各样的功能。学习之后我对软件开发有了一个新的认识,那就是编码仅仅是软件开发人员最入门、最基础的能力,而软件架构的设计与软件体系结构的思想就像船的龙骨一样贯穿始终,对软件系统的整体结构进行强化加固。如果软件的设计能力不过关,在开发过程中容易碰到模块冲突、逻辑错误等影响软件系统质量的问题,并且通常难以解决。即便解决了,也可能会带来其他的或者更多的问题,最终导致软件产品开发进度减慢,工作量增大,甚至无法继续进行的情况

软件体系结构是具有一定形式的结构化元素,即构件的集合,包括处理构件、数据构件和连接构件。处理构件负责对数据进行加工,数据构件是被加工的信息,连接构件把体系结构的不同部分组合连接起来。软件体系结构可被看作是一个系统的基础组织,包含各个构件、构件互相之间与环境的关系,还有指导其设计和演化的原则

我认为对于一个系统,其软件体系结构的设计没有最好,只有更好。在今后的理论学习与项目实践过程中,应合理结合软件体系结构的相关知识,清晰的理解项目需求,明确设计原则和目标,除实现功能需求外,应对系统架构有着更高的要求,这样不仅事半功倍,还能让我对软件、软件体系结构以及软件工程有更深层次的理解。最后感谢吴老师这一学期的辛苦教学,使我收获颇丰


软件体系结构大作业报告

校园疫情防控系统

题目:校园疫情防控系统体系结构分析与设计

要求

  1. 需求分析
  • 系统的背景描述和层次化模块组成
  • 用例模型(包含用例图、规约描述)对系统的需求分析和建模
  1. 结构设计
  • 系统中选用的体系结构风格介绍(不少于三种)。及其原因和优势分析
  • "4+1"视图模型
  • 系统的UML模型描述
    1. 类模型(完整的类图以及关联表示)对系统的静态对象建模
    2. 行为模型(顺序图、活动图、状态图、时序图、通信图)对系统的设计建模
    3. 架构模型(包图)对系统的架构建模
    4. 物理模型(构件图、部署图)对系统的部署建模
  1. 分析测试
  • 系统的风险分析(必要时可以自行设定部分数据)
  • 系统的测试方法及过程
  1. 其他课程相关内容
  • SOA、云计算、边缘计算等在该系统中的应用

系统概述

以校园疫情防控系统为题,结合软件体系结构课程相关知识,对该校园疫情防控系统的体系结构进行分析与设计

自2019年全球疫情爆发之后,大到各个国家,小到邻里街坊,都实施了对疫情的相关防控措施。由于此次新型冠状病毒极强的传播力与感染性,全国34个省份无一幸免,为了确保人们的安全,疫情防控已经成为近几年的重中之重。其中校园疫情防控是非常重要的一环,以大学为例,每学期初、期末都会涉及全国各地甚至国外学生返校、离校,大大增加了疫情传播的概率,如不加以管理,必定会造成不可挽回的后果

在此背景下,设计并开发校园疫情防控系统,管理教职员工以及全体学生的出入。所以此系统主要侧重于对学校人员的出校、入校以及在校期间的计划安排的组织、管理、审查等,并及时使全体学校人员掌握最新的防控政策,疫情状况以及各地的出入政策等

为确保学校人员的安全,除实现必须功能外,应避免系统涉及复杂的操作,繁琐的流程。在保证功能实现以及系统质量的前提下,不局限于平台,PC端和移动端共同进行设计与开发,降低上手难度,旨在提供最方便最快捷的校园疫情防控系统

需求分析

系统背景

需求分析是软件产品开发过程中最初始、最基础的工作,也是最重要的工作之一,其成败将直接并最终决定软件开发的成败,并且呈倍增效应

需求分析的关键是使隐含的需求明确,使变更的需求可控,明确系统需求。采用面向对象的方法以及UML工具、领域专家或指导老师的参与可以使需求变更处于可控范围内

对于校园疫情防控系统来说,首先要掌握的就是当前教职员工及学生的感染情况,所以在该系统中需要对用户信息,身体状况都有明确的记录、登记、查看等功能,以便用户自己或校园疫情防控部门查看。必要时每天上传健康码、行程码,记录当日体温、动向以及是否外出、是否接触外来人员等信息

下面来详细介绍一下校园疫情防控系统的核心功能

  1. 用户实名认证

组织学校相关人员进行注册并实名认证,学生可通过学号、身份证号等信息进行认证,同时教职员工可通过员工号、身份证号进行认证。认证通过后可以学号或者员工号作为用户名,用户自行设置密码。在使用后续功能前必须使用用户名和密码进行登录

  1. 校内疫情日报

每一个用户都可以查看校内疫情日报页面,该页面会详细展示学校的疫情统计信息,包括实时学生人数、教职员工人数、体温分布图、当日信息上报人数和比例、感冒发烧人数和比例、校内疫情防控部门的详细地址及联系方式、校内医务室详细地址以及学校当前所采取的出入政策的详细信息

如果是校内疫情防控部门的账号,系统会增加当日未上报具体信息的人员的详细信息以及当前感冒发烧或者体温不正常的人员的详细信息。此外,校内的体温测量仪收集到的数据,以及监控录像也会在此页面呈现。向防控部门提供全面支持,保证学校人员健康与安全

  1. 校外疫情日报

同样为每一个用户而设计,该页面提供校外包括全国各个省市的出入政策,各地核酸检测点的详细地址及联系方式,国内及国外的疫情状况,国内每个省市的每日新增病例、境外输入病例、无症状感染者病例等信息。时刻提醒学校人员提高疫情防控意识,严格遵守各地疫情防控政策,不给国家添麻烦

  1. 学校人员进出申请
  • 校内人员出校申请

校内人员在出校前必须提前申请,填写出校原因、紧急联系方式、离校时间、外出具体行动轨迹、是否当天返校以及是否承诺信息如实填写

申请提交后由校内疫情防控部门来进行审查,审查通过后会给用户发送通知,并提醒用户提前见检查健康码和行程码,戴好口罩,安全出行

  • 校外人员入校申请

校外人员首先要与校内疫情防控部门进行联系确认,询问学校当前实施的进出政策

之后需要填写入校申请,其中包括来访人员个数,各个来访人员的具体信息,进校原因,详细行动路线(包括出发地点、经停地点等),预计到校时间与预计离校时间并承诺如实填写上述信息

申请提交后会由校内疫情防控部门来审查,通过后会给校外人员发送通知,并提醒入校前出示健康码以及行程码由工作人员进行检查

此外,申请通过后会发送一个独一无二的进校二维码,在进校时由与健康码和行程码一同交给工作人员进行检查

  1. 校内公共场所安排

食堂、宿舍、教室、自习室、图书馆等校内公共场所均装设体温测量仪、监控摄像头,测量数据与记录视频均可由校内疫情防控部门查看,并作为防控资料由学校保存,为校内人员提供一定程度的安全保障

例如像教室、自习室、图书馆等提供学生上课、学习的公共场所,平台会提供上述场所的具体时间安排,细化到自习室某个房间是否提前预定或者图书馆某一座位是否占用等

  1. 校内疫情防控部门独立模块

本独立模块是疫情防控系统专门为校内疫情防控部门设计,提供体温监测,视频监控,并且会显示所有身体状况异常的用户的详细信息,为防疫部门提供全力支持,保证学校人员的身心健康

  1. 突发情况管理

疫情期间难免会遇到突发状况,例如发高烧、咳嗽、乏力、腹泻等症状,遇到有类似症状的人员,曾到过风险地区或接触过风险地区人员,需要及时在此模块进行报备,让学校可以关心到每一位需要照顾的用户,及时为用户提供医疗支持


校园疫情防控系统的层次化模块组成如下图所示

24

对于校内人员必须先注册登录并实名认证后才可使用后续功能;对于校外人员仅提供校外人员入校申请的服务,无需注册,其他服务均提供给校内全体用户

用例建模

用户管理模块

16

用例名 用户管理
简要描述 对疫情防控系统用户进行管理
参与者 系统用户管理员
涉众 全体用户
相关用例 暂无
前置条件
后置条件 注册并登陆后作为用户可使用后续功能
基本事件流 1. 用户注册
2. 用户登录
3. 用户实名认证

用户个人信息模块

17-用户个人信息模块用例图

用例名 用户个人信息
简要描述 呈现用户个人信息
参与者 已注册用户
涉众 已注册用户
前置条件 注册并实名认证
后置条件
基本事件流 1. 用户编辑个人信息

校内疫情日报模块

18-校内疫情日报模块用例图

用例名 校内疫情日报
简要描述 对学校内部疫情状况进行统计概括
参与者 全体用户
涉众 全体用户
前置条件 用户登录
后置条件
基本事件流 1. 实时统计校内学生、教职员工人数
2. 用户体温分布
3. 当日信息上报人数和比例
4. 校内生病人数和比例
5. 记录校内医务室详细地址以及联系方式
6. 实时提供校内当前采取的出入政策

校外疫情日报模块

19-校外疫情日报模块用例图

用例名 校外疫情日报
简要描述 对校外各地政策和疫情状况进行汇总
参与者 全体用户
涉众 全体用户
前置条件 用户登录
后置条件
基本事件流 1. 汇总全国各个省市的出入政策
2. 提供各地核酸检测点的详细地址及联系方式
3. 记录国内每个省市的每日新增病例、境外输入病例、无症状感染者病例等信息
4. 时刻提醒学校人员提高防控意识,严格遵守各地疫情防控措施

学校人员进出申请模块

20-学校人员进出申请用例图

用例名 学校人员进出管理
简要描述 组织管理学校人员进出,分为校内人员出校申请和校外人员入校申请
参与者 校内疫情防控部门
涉众 需要进出服务的用户
前置条件 校内人员进行登录 | 校外人员直接向防疫部门申请
后置条件
基本事件流 1. 校内人员出校申请,在出校前提交,填写相应字段并承诺如实填写,审核通过后方可出校
2. 校外人员入校申请,与校内疫情防控部门提前沟通,提交入校申请,并承诺如实填写信息审核通过后方可进校

校内公共场所安排模块

21-校内公共场所安排用例图

用例名 校内公共场所安排
简要描述 学校为公共场所提供体温测量和视频监控等服务,实时更新公共场所使用情况,为学校人员提供安全保障
参与者 全体用户
涉众 全体用户
前置条件 用户登录
后置条件
基本事件流 1. 体温测量
2. 视频监控
3. 提供例如教室、自习室、图书馆等公共场所的具体时间安排
4. 提供自习室每个房间的预定情况
5. 提供图书馆座位当前占用情况

校内疫情防控部门独立模块

22-校内疫情防控部门独立模块用例图

用例名 校内疫情防控模块
简要描述 为校内防疫部门专门设计,提供全面服务与支持,保证学校人员的健康与安全
参与者 校内疫情防控部门工作人员
涉众 全体用户
前置条件 用户登录
后置条件
基本事件流 1. 为防疫部门工作人员提供学校人员体温测量数据
2. 显示监控视频供防疫部门查看
3. 给工作人员提供校内当前身体状况异常的用户的具体信息以及身体状况,以便校方能够及时提供医疗支持

突发情况管理模块

23-突发情况管理模块用例图

用例名 突发状况管理
简要描述 疫情期间对于突发状况的管理,让校方清楚校内疫情状况,进而做出合理的应对措施
参与者 校内疫情防控部门
涉众 全体用户
前置条件 用户登录
后置条件
基本事件流 1. 若学校人员遇到发烧、感冒、乏力、腹泻等症状,需及时报备采取相应措施
2. 或者曾经停风险地区或接触风险地区人员同样需要向学校报备
3. 学校通过校内当前疫情状况,调整出入政策,及时通知全体人员并给需要的用户提供医疗支持

结构设计

体系结构

  1. 调用/返回风格 - 层次结构

系统层次清晰明确,每一层为上层服务,并作为下层的客户。用户调用系统工具来实现系统核心功能

25

此外这种风格支持抽象层的设计,将复杂问题分解成增量步骤序列的实现,给相邻层提供相同接口,用不同方法实现,为软件重用提供了强大的支持

  1. C2风格

C2架构风格是一种常见的层次体系架构风格。是由连接件与构件按一定规则绑定并运行的构件网络。在该架构风格中,各个构件通过连接件的异步通信机制进行交互而不能直接连接,这使得构建的替换或更新不影响架构,体现了高内聚,低耦合的思想

39

系统中的构件可以实现应用需求,并能将任意复杂度的功能封装在一起。此外,构件相对独立,构件之间的依赖性较少,这使得系统中的构件或功能可以独立运行,大大增加了可扩展性和延展性

对校园疫情防控系统构件的描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
component CampusPandemicManage is
interface
top_domain is
out
manage();
run();
toUser();
toDailyNews();
toAccess();
toPublic();
toSudden();
toPandemic();
in
order()
feedback()
record();
behavior
startup always_generate user, dailyNews, access, public, sudden, pandemic;
received_messages user may_generate signUp xor signIn;
received_messages dailyNews may_generate inside xor outside;
received_messages access may_generate in xor out;
received_messages public may_generate danger xor record;
received_messages sudden may_generate situation xor record;
received_messages pandemic may_generate order xor record xor notification;
end CampusPandemicManage;

对系统子构件的描述

  • Children:user, dailyNews, access, public, sudden, pandemic;
1
2
3
4
5
6
7
8
9
10
11
12
component Childern is
interface
bottom_domain is
out
run();
manage();
in
fromManager();
behavior
startup always_generate self;
received_messages fromManager may_generate order xor record xor manage;
end Children;

对系统体系结构的描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
architecture CampusPandemicManager is
conceptual_components
CampusPandemicManage; User; DailyNews; Access; Public; Sudden; Pandemic;
connectors
connector MainConn is message_filter no_filtering;
connector ViceConn is message_filter no_filtering;
architecture_topology
connector MainConn connections
top_ports User; DailyNews; Access; Public; Sudden; Pandemic;
bottom_ports CampusPandemicManage;
connector ViceConn connections
top_ports Inside; Outside;
bottom_ports DailyNews;
connector ViceConn connections
top_ports In; Out;
bottom_ports Access;
connector ViceConn connections
top_ports Temperature; Scrutiny;
bottom_ports Public;
end CampusPandemicManager;

对校园疫情防控系统的描述

1
2
3
4
5
6
7
8
9
system CampusPandemicManager_1 is
architecture CampusPandemicManager with
User instance student, teacher, staff, pandemic;
DailyNews instance Inside, Outside;
Access instance In, Out;
Public instance Record, Place;
Sudden instance Record, Danger;
Pandemic instance Record, Order;
end CampusPandemicManager_1;
  1. 三层C/S风格与三层B/S风格

C/S与B/S风格各有利弊,在进行系统设计时应该发挥两种体系结构风格的长处

电脑端可以使用B/S风格避免开发高度复杂的客户端。而在手机端使用C/S风格,开发一款快捷应用程序供用户使用

  • 三层C/S风格

40

C/S体系结构定义了工作站与服务器的连接方式,以实现数据和应用分布到多个处理机上。为数据库的数据存取过程提供安全保障,实现了访问并发性的控制,并且给用户提供交互界面,拥有强大的数据操作和事务处理能力,模型思想简单,易于理解和接受,对于硬件和软件的变化显示出极大的适应性和灵活性,并且易于对系统进行扩充和缩小。在C/S体系结构中,系统中的功能构件充分隔离,使各功能模块在逻辑上保持相对独立性,提高可维护性和可扩展性,允许更灵活有效地选用相应的平台和硬件系统进行并行开发,为安全管理提供了坚实的基础

  • 三层B/S风格

41

结合浏览器的多种脚本语言,使用通用浏览器就实现了复杂软件才能实现的强大功能,节约开发成本,达到了零客户端的功能,很容易在运行时自动升级。B/S体系结构还提供了异种机、异种网、异种应用服务的联机、联网、统一服务的最现实的开放性基础

  1. 数据抽象和面向对象组织风格

42

这种风格建立在数据抽象和面向 对象的基础上,数据的表示方法 和它们的相应操作封装在一个抽 象数据类型或对象中。这种风格 的构件是对象,或者说是抽象数 据类型的实例。对象是一种被称 作管理者的构件,因为它负责保 持资源的完整性。对象是通过函 数和过程的调用来交互的。因为对象对其它对象隐藏它的表示,所以可以改变一个对象 的表示,而不影响其它的对象;设计者可将一些数据存取操作的问题分解成一些交互的代理程序的集合

视图模型

逻辑视图和开发视图是用来描述系统的静态结构,而进程视图和物理视图是用来描述系统的动态结构。本次设计的校园疫情防控系统注重于信息管理以及实时控制,使用"4+1"模型可以从多个角度多个方面来描述软件体系结构

  • 逻辑视图

逻辑视图主要支持系统的功能需求,即系统给用户提供的服务。在系统中根据不同的问题领域分解成一系列的功能抽象

26

  • 开发视图

开发视图主要侧重于软件模块的组织和管理,考虑软件内部的需求,如软件开发的容易性、软件的重用和软件的通用性,要充分考虑由于具体开发工具的不同而带来的局限性

27

开发视图通常所用的风格是层次结构风格。设计时要充分考虑,对于各个层次,层次越低,通用性越强,从而保证应用程序的需求发生改变时,所做的改动最小

28

  • 进程视图

进程视图侧重于系统的运行特性,主要关注一些非功能性需求。进程视图强调并发性、分布性、系统集成性和容错能力,详细定义了逻辑视图中的各个类的操作线程。进程视图可以描述成多层抽象,每个级别分别关注不同的方面,在最高层抽象中,进程结构可以看作是构成一个执行单元的一系列任务,他们相互独立分布,通过逻辑网络进行通信

29

30

  • 物理视图

物理视图主要考虑如何把软件映射到硬件上,通常要考虑到系统性能、规模、可靠性等。解决系统拓扑结构、系统安装、通讯等问题。当软件运行于不同的节点上时,各视图中的构件都直接或间接地对应于系统的不同节点上。因此,从软件到节点的映射要有较高的灵活性,进而当环境改变时,对系统其他视图的影响最小

31

UML模型

  • 类模型
类图

27

  • 行为模型
顺序图

29

30

活动图

32

状态图
用户管理系统状态图

33

疫情日报状态图

34

进出管理状态图

35

公共场所安排状态图

36

突发情况管理状态图

37

时序图
用户管理时序图

29

疫情日报时序图

43

进出管理时序图

44

公共场所安排时序图

45

突发状况管理时序图

46

通信图

47

  • 架构模型
包图

38

  • 物理模型
构件图

28

部署图

31

分析测试

风险评估对于任何软件风险管理计划都是一个重要的过程。风险评估应该是基于能够通过定量的方法对软件产品属性进行的度量。软件体系结构级的风险评估是基于动态的方法,该方法用动态复杂性和动态耦合性来定义用于描述体系结构元素的复杂性因子

在任何软件的开发,其主要风险均来自于两个方面,一是软件管理,二是软件体系结构。软件产品的开发是工程技术与个人创作的有机结合。软件开发是人的集体智慧按照工程化的思想进行发挥的过程。软件管理是保证软件开发工程化的手段,而软件体系结构的合理程度是取决于集体智慧发挥的程度和经验的运用

随着软件开发技术的不管更新,软件数量的不断增多,软件复杂程度不断上升,客户对软件产品的要求也在不断提高,随之而来的就是市场对软件开发项目需求的不断变化,这便给软件开发企业和需求企业带来巨大的风险。市场对软件开发项目的需求会直接影响到公司的生存。这对软件开发企业来讲应该是更大的难题

在软件产品开发过程中,由于产品需求本身的隐含性,用户与开发者之间的沟通障碍,以及需求随着时间和用户的变化而变更等原因,可能使需求分析偏离实际需求而最终导致软件产品开发的失败,这种可能性成为需求风险

软件开发项目风险是指在软件生命周期中遇到的所有的预算、进度和控制等各方面的问题,以及由于这些问题而产生的对软件产品各方面的影响

通过状态图来描述系统的行为。软件系统的可靠性依赖于状态的执行顺序和每一个状态的可靠性。状态图是一个有向图,在状态图中,每一个结点Si表示一个状态,从状态Si到状态Sj的迁移通过连接边(Si, Sj)表示

  • 在顺序结构风格中,系统的运行按构建的顺序依次执行

{M(i,j)=0,SiSjfor ii, jkM(i,j)=RiPij,SiSj\left\{ \begin{array}{ll} M(i,j) = 0, S_i不能到达S_j \\ & for \ i \leq i,\ j \leq k \\ M(i,j) = R_iP_{ij}, S_i能够到达S_j \end{array} \right.

  • 在并行/管道-过滤器结构风格中,系统中多个构件可以在同一状态下并行执行

{M(i,j)=RiPij , SiSpM(i,j)=CnSiRnPnj , SiSp , for 1i, jS and 1nkM(i,j)=0,SiSj\left\{ \begin{array}{ll} M(i,j) = R_iP_{ij} \ , \ S_i \notin S_p \\ M(i,j) = \prod_{C_n}^{S_i}R_nP_{nj} \ , \ S_i \in S_p \ , \ for \ 1 \leq i,\ j \leq |S| \ and \ 1 \leq n \leq k \\ M(i,j) = 0, S_i能够到达S_j \end{array} \right.

  • 在容错结构风格中,原始构件和备份构件都放在一个并行结构下,使得运行时当一个构件出现错误时,其他构件能够继续提供服务

M1{Sb1}=R1P12(1+n=3k3(m=2n1(1Rm)))M({Sb1},{Sk1})=Rb1P2(k1)M({Sb1},{Sk2})=Rb1P2(k2)M(1,\{S_{b1}\}=R_1P_{12}(1+\sum_{n=3}^{k-3}(\prod_{m=2}^{n-1}(1-R_m))) \\ M(\{S_{b1}\},\{S_{k-1}\})=R_{b1}P_{2(k-1)} \\ M({\{S_{b1}\},\{S_{k-2}\}})=R_{b1}P_{2(k-2)}

  • 在调用-返回风格中,被调用构件可能被多次调用,而调用构件只会执行一次

1i , jk :{M(i,j)=RiPij , SiSjM(i,j)=Pij , SiSj , SjM(i,j)=0 , SiSj1 \leq i \ , \ j \leq k \ : \left\{ \begin{array}{ll} M(i,j) = R_iP_{ij}\ ,\ S_i能够到达S_j \\ M(i,j) = P_{ij}\ ,\ S_i能够到达S_j\ ,\ S_j是被调用构件 \\ M(i,j) = 0\ ,\ S_i不能到达S_j \end{array} \right.


构件依赖图是用于在体系结构级进行可靠性分析的概率模型;它是控制流图的扩展,用来描述构件及其可靠性、连接件及其可靠性和迁移概率。从场景中开发,通常使用UML的时序图对场景进行建模

构件依赖图

可通过构件依赖图对软件体系结构进行分析与测试

ECi=k=1SPSkTime(Ci)Ci in SkEC_i=\sum_{k=1}^{|S|}PS_k*Time(C_i)_{C_i\ in\ S_k}

  • ECiEC_i:表示CiC_i的平均执行时间
  • RCiRC_i:表示CiC_i的可靠性
  • PSkPS_k:表示场景SkS_k的执行概率
  •  S |\ S\ |:表示场景的总数
  • Time(Ci)Time(C_i):表示构件CiC_i的执行时间,可通过序列图中构件CiC_i在其生命线上的活跃时间总数进行估计
  • CiC_i:表示场景SkS_k中的构件

PTij=k=1SPSk(Interact(Ci,Cj)Interact(Ci,Cll=1,...,N)PT_{ij}=\sum_{k=1}^{|S|}PS_k*(\frac{|Interact(C_i,C_j)|}{|Interact(C_i,C_l|_{l=1,...,N}})

  • CxC_x:表示场景SkS_k中的构件
  • PSkPS_k:表示场景SkS_k的执行概率
  •  S |\ S\ |:表示场景的总数
  • $\ N\ $:表示应用系统中的构件数量
  • Interact(Ci,Cj)|Interact(C_i,C_j)|:表示构件CiC_i和构件CjC_j在场景SkS_k中的交互次数

复杂性分析

  1. 构件的复杂性

cpx(Ci)=k=1SPSk×cpxk(Ci)cpx(C_i)=\sum_{k=1}^{|S|}PS_k\times cpx_k(C_i)

使用场景概率PSkPS_k能够通过上式统计每个构件的操作复杂性度量,其中S|S|表示场景数

  1. 连接件的复杂性

EC(Ci,Cj)=k=1SPSk×ECK(Ci,Cj)EC(C_i,C_j)=\sum_{k=1}^{|S|}PS_k\times EC_K(C_i,C_j)

  • PSkPS_k:表示场景SkS_k的执行概率
  •  S |\ S\ |:表示场景总数

严重性分析

对严重性进行分级,分别为灾难、危机、边际和较小

仅考虑单个构件的失效方式和单个连接件的失效方式

开发体系结构元素的可靠性风险因子

hrfi=cpxi×svrtyihrf_i=cpx_i\times svrty_i

  • cpxi[0,1]cpx_i\in[0,1]:表示第i个构件的动态复杂性
  • svrtyi[0,1]svrty_i\in[0,1]:表示第i个构件的严重性级别

主要是通过复杂性和严重性因素,通过上式为体系结构中的每一个构件和连接件计算其启发式风险因子

hrfij=cpxij×svrtyijhrf_{ij}=cpx_{ij}\times svrty_{ij}

  • cpxij[0,1]cpx_{ij}\in[0,1]:表示第i个构件到第j个构件之间的连接件的动态耦合度,可以通过EC(Ci,Cj)EC(C_i,C_j)计算
  • svrtyij[0,1]svrty_{ij}\in[0,1]:表示第i个构件到第j个构件之间的连接件的严重级别

CDG开发

  1. 通过估计每一个场景执行的频率,来估计每个场景执行的概率
  2. 对每一个场景中的构件通过模拟报告来记录每一个构件的执行时间
  3. 通过场景的使用概率和场景之间的迁移概率来计算构件之间的迁移概率
  4. 通过模拟,为每个构件、连接件估计复杂性因子和严重性指标,通过综合复杂性因子和严重性指标获取每个构件、连接件的风险因子

可靠性风险分析

HRF=1i=1L(1hrfi)HRF=1-\prod_{i=1}^{L}(1-hrf_i)

体系结构的风险因子可以通过聚合单个构件和连接件的风险因子来获得

例如一个有L个构件的执行序列,则该执行序列L的风险因子可通过上式计算

实验心得

学习软件体系结构之前,我认为只要有优秀的编码能力就可以实现一个项目中各种各样的功能。学习之后我对软件开发有了一个新的认识,那就是编码仅仅是软件开发人员最入门、最基础的能力,而软件架构的设计与软件体系结构的思想就像船的龙骨一样贯穿始终,对软件系统的整体结构进行强化加固。如果软件的设计能力不过关,在开发过程中容易碰到模块冲突、逻辑错误等影响软件系统质量的问题,并且通常难以解决。即便解决了,也可能会带来其他的或者更多的问题,最终导致软件产品开发进度减慢,工作量增大,甚至无法继续进行的情况

软件体系结构是具有一定形式的结构化元素,即构件的集合,包括处理构件、数据构件和连接构件。处理构件负责对数据进行加工,数据构件是被加工的信息,连接构件把体系结构的不同部分组合连接起来。软件体系结构可被看作是一个系统的基础组织,包含各个构件、构件互相之间与环境的关系,还有指导其设计和演化的原则

我认为对于一个系统,其软件体系结构的设计没有最好,只有更好。在今后的理论学习与项目实践过程中,应合理结合软件体系结构的相关知识,清晰的理解项目需求,明确设计原则和目标,除实现功能需求外,应对系统架构有着更高的要求,这样不仅事半功倍,还能让我对软件、软件体系结构以及软件工程有更深层次的理解。最后感谢吴老师这一学期的辛苦教学,使我收获颇丰