第5章 软件体系结构设计
软件体系结构设计及其实现

软件体系结构设计及其实现随着信息技术的高速发展,软件已经成为现代社会不可或缺的一个组成部分。
在软件的开发过程中,软件的体系结构设计非常关键。
软件体系结构设计是软件开发过程中的第一步,也是最重要的一步。
好的软件体系结构设计可以为整个软件开发过程奠定良好的基础,也可以为软件的后期维护和升级提供更多的便利。
但是,软件体系结构设计并不是一件简单的事情,需要考虑多方面的因素,并且需要综合各种专业知识。
一、软件体系结构设计的定义和特点软件体系结构是指在系统设计中,对软件系统整体组织结构和各个组成部分之间的关系,进行的系统性设计和描述。
软件体系结构不仅是设计软件系统的框架,也是实现软件系统的基础,同时也是对软件系统进行管理、维护和升级的重要基础。
软件体系结构设计的特点包括以下几点。
(一)高度抽象软件体系结构设计是对软件系统的整体组织结构和各个组成部分之间的关系进行的设计和描述。
因此,软件体系结构设计需要具有高度抽象的特点。
软件体系结构设计不涉及具体的编程实现细节,而是从整体的角度考虑问题,对系统进行宏观把握。
因此,软件体系结构设计需要考虑到更多的概念和模型,需要进行更为有意义的抽象。
(二)多样性在软件体系结构设计中,考虑到软件的应用范围和需求,软件体系结构的模型和模式也有很多种不同的选择。
不同的软件体系结构设计模式都有各自的优缺点,因此,软件开发过程中需要进行充分的需求分析和规划,才能够选择合适的设计模式。
(三)可分析性软件体系结构设计是软件开发的基础,需要保证软件系统的稳定和可靠。
因此,在进行软件体系结构设计时,需要考虑到各种约束条件和因素。
设计出来的体系结构需要具有可分析性,这样才能够进行系统化的测试和验证,确保软件的质量。
二、软件体系结构设计的要素软件体系结构设计需要考虑到很多不同的要素,下面我们来看一下主要的几个要素。
(一)模块化设计模块化设计是软件体系结构设计中最基础的一点,也是最重要的一点。
将复杂的软件分为若干个模块,使得各个模块之间相互独立,可以方便地进行设计、开发、测试和维护。
软件工程导论(第5章)

11
5.1.2 选取若干个合理的方案
至少选取低成本、中等成本和高成本三种方案。
每种方案准备四份资料:
系统流程图; 组成系统的物理元素清单; 成本/效益分析; 实现这个系统的进度计划。
12
5.1.3 推荐最佳方案
分析员应该综合分析对比各种合理方案的利
弊,推荐一个最佳的方案,并且为推荐的方 案制定详细的实现计划。
发出较高质量的软件系统。
7
第一部分:设计过程 第二部分:设计原理 第三部分:启发原则 第四部分:软件结构图 第五部分:面向数据流的设计方法
8
5.1 设 计 过 程
总体设计过程通常由两个主要阶段组成: 系统设计:确定系统的具体实现方案。 结构设计:确定软件结构。 9个步骤: ① 设想供选择的方案 ② 选取合理的方案 ③ 推荐最佳方案 ④ 功能分解 ⑤ 设计软件结构 ⑥ 设计数据库 ⑦ 制定测试计划 ⑧ 书写文档 ⑨ 审查和复审
和理解; 可以使软件容易测试和调试,因而有助于提高软 件的可靠性; 能够提高软件的可修改性; 有助于软件开发工程的组织管理。
32
模块化五条标准
模块可分解性
把问题分解为子问题 模块可组装性 可复用 模块可理解性 无需参考其他模块,易于构造和修改 模块连续性 微小修改只导致对个别模块 模块保护性 异常影响局限在模块内部
“隐蔽”意味着模块彼此间仅仅交换那些为了完成系统功能而 必须交换的信息。 “局部化”是指把一些关系密切的软件元素物理地放得彼此靠 近。局部化有助于实现信息隐蔽。
设计和确定模块时,使得一个模块内包含的信息(过程和 数据)对于不需要这些信息的模块来说,是不能访问的。 模块内部的数据与过程,应该对不需要了解这些数据与过 程的模块隐藏起来。只有那些为了完成软件的总体功能而 必需在模块间交换的信息,才允许在模块间进行传递。
软件体系结构5 第5章 软件质量属性

外部质量
易用性
易用性是指用户使用软件的容易程度。 现代人的生活节奏快,做什么事都想图个方便。所以把易用性作为 重要的质量属性对待无可非议。导致软件易用性差的根本原因 : 理工科大学教育存在缺陷:没有开设人机工程学、美学、心理学这 些必修课,大部分开发人员不知道如何设计易用的软件产品。开发 人员犯了“错位”的毛病:他以为只要自己用起来方便,用户也就 会满意。软件的易用性要让用户来评价。当用户真的感到软件很好 用时,一股温暖的感觉油然而生,于是就用“界面友好”、“方便 易用”等词来评价软件产品。
外部质量
兼容性
兼容性是指不同产品(或者新老产品)相互交换信息的能力。例如 两个字处理软件的文件格式兼容,那么它们都可以操作对方的文件, 这种能力对用户很有好处。兼容性又称为互操作性。 兼容性的商业规则:弱者设法与强者兼容,否则无容身之地;强者 应当避免被兼容,否则市场将被瓜分。金山软件公司的WPS与微 软的Word之争。WPS一定要与Word兼容,否则活不下去。但是 Word绝对不会与WPS兼容,除非WPS又在中国占有绝对优势。 中国联通和中国移动的手机互联互通问题。(互联网的价值与用户 数量的平方成正比)
质量目标与商业目标
质量定义
古时候人们ห้องสมุดไป่ตู้为长得结实、饭量大就是健康,这显然是不科 学的。现代人总是通过考察多方面的生理因素来判断是否健 康,如测量身高、体重、心跳、血压、血液、体温等。如果 上述因素都合格,那么表明这人是健康的。如果某个因素不 合格,则表明此人在某个方面不健康,医生会对症下药。 软件质量是许多质量属性的综合体现,各种质量属性反映了 软件质量的方方面面。人们通过改善软件的各种质量属性, 从而提高软件的整体质量。
响应度量(Response Measure):以某种方式对其进行度量,对 需求进行测试。
软件体系结构与设计原则

●05
第五章 依赖倒置原则
DIP概述
依赖倒置原则(Dependency Inversion Principle,简称DIP)是面向对象设计原则的一 种,其定义了高层模块不应该依赖于低层模块, 二者都应该依赖于抽象;抽象不应该依赖于细节, 细节应该依赖于抽象。DIP的优点包括降低模块间 的耦合性,提高代码的灵活性和可维护性等。DIP 能够在实际应用中提高系统的稳定性和可扩展性。
统具有良好的结构和设计质量。
●02
第二章 单一职责原则
SRP概述
单一职责原则(Single Responsibility Principle, SRP)是指一个类应该只有一个引起变化的原因, 即一个类只负责一项职责。SRP的优点包括降低
类的复杂度、提高可维护性和可读性。实际应用 场景中,SRP可以帮助开发者更好地设计和组织
软件体系结构与设计原则
制作人: 时间:2024年X月
目 录
第1章 简介 第2章 单一职责原则 第3章 开放封闭原则 第4章 里氏替换原则 第5章 依赖倒置原则 第6章 接口隔离原则
第7章 总结
●01
第1章 简介
软件体系结构概述
软件体系结构是指软件系统中的元素以及元素之 间的关系。它定义了软件系统的整体结构,有助 于分离关注点并提高系统的可维护性。软件体系 结构与设计原则密切相关,设计原则可以指导软
参与开源项目
与他人合作,提升软件设计能力
提高软件设计水平
注重设计模式
测试驱动开发
保持代码简洁
持续优化
学习各种设计模式 并灵活运用
先写测试用例再编 写代码,保证代码
质量
避免冗余代码,提 高可读性
不断优化代码和架 构,提高系统性能
软件体系结构设计方法ppt课件

模式驱动的体系结构设计方法从模式导出体系结构 抽象。软件设计模式的目的在于编制一套可重用的 基本原则,用于开发高质量的应用系统。体系结构 模式类似于设计模式,但它关心更粗粒度的系统结 构及其交互。
15
客户 需求规格说明书
通用知识 2:实现
体系结构模式 描述 意图
上下文
问题
解决方案
体系结构描述Biblioteka 4:组合3:应用 体系结构模式
图4 模式驱动的体系结构设计的概念模型
16
3. 系统的管理端业务处理模块
3.1 总的网络拓补结构
系统管理员
数据库 和
Web程序 都在这上
导师
导师
导师
17
3. 系统的管理端业务处理模块
在该系统中采用面向对
象分析作为主要的系统
建模方法,用不同的设
计角度描述角色(管理
有所不同。
3
客户
领域知识
捕捉需求 需求规格 说明书
提取解决方 案的结构
领域知识 工作
解决方案抽象
体系结构 规格说明
领域知识
体系结构
图1 体系结构设计方法的元模型 4
2.软件体系结构设计方法的分析
为了获取对体系结构设计的抽象,人们已经提出 了许多方法。
2.1 体系结构设计方法的分类
(1)工件驱动(Artifact-Driven)的方法 (2)用例驱动(Use-Case-Driven)的方法 (3)模式驱动(Pattern-Driven)的方法 (4)领域驱动(Domain-Driven)的方法
*
者)与系统的其它的 管理员
构件是如何联系的。管
管理端子系统 *
理端的主用例图如右图:
软件工程第五章结构化设计

服务注册中心
发现
注册
服务消费者 调用
服务提供者
并发系统的集中式控制模型
传感器进程 用户界面Fra bibliotek传动装置进程 系统控制器
计算进程 故障处理器
系统控制模型
事件驱动系统
广播模型:发生的事件广播到所有子系统,任何能处理 该事件的子系统都会响应。该模型适用于基于网络的分 布式系统。
广播模型中的子系统注册其感兴趣的特别事件 广播模型的优点是进化比较简单
软件模块化设计
模块是一个独立命名的,拥有明确定义的输入、输出 和特性的程序实体。
软件的模块化设计(Modular Design)。系统是有 一个个模块组装而成。
软件模块化设计优点
可以简化软件的设计和实现 提高软件的可理解性和可测试性 软件更容易得到维护。
软件模块化设计缺点
结构化设计阶段 数据流设计方法 面向数据的设计 结构化程序设计 案例分析
结构化设计概述
结构化设计方法(Structured Design, SD)是基于模 块化、自顶向下细化、结构化程序设计等程序设计技 术基础上发展起来的。
结构化设计方法用模块结构图来表达程序模块之间的 关系。
缺点是子系统都知道是否和什么时候处理事件,这可能会引 起冲突。
中断驱动模型:由中断处理器对来自外部的中断进行检 测,然后在其他组件中处理这些中断。该模型适用于对 定时有严格要求的实时系统。
只用在硬件实时系统中,要求对一些事件能做出及时响应
总线架构
像水管一样随意接入 像PCI总线一样即插即用
第三部分软件设计与建模
结构化软件设计
阳王东
回答问题
什么是软件设计?有哪些阶段和任务? 什么是模块化设计?有哪些原理? 什么是软件结构和体系结构?二者有什么区别? 数据流有哪些类型?如何区分? 数据流映射的步骤是什么? 什么是结构化程序设计?有哪些工具? 什么是JSD方法?具体步骤是什么?
05动态软件体系结构

5.1 动态软件体系结构概述
目前支持动态体系结构机制的主要有 ArchStudio 工具 集 和 软 件 体 系 结 构 助 理 ( Software Architecture Assistant,SAA)。
• ArchStudio 工具集由加州大学Irwine 分校提出,支持交互 式图形化描述和C2风格描述的体系结构的动态修改。 • SAA 由伦敦皇家学院提出,也是一种交互式图形工具,可 以用来描述、分析和建立动态体系结构。
22/33
第5章 动态软件体系结构
5.3 动态体系结构的描述
◇ 动态软件体系结构的形式化描述
◎ 形式化描述主要包括
• 软件体系结构的描述 • 体系结构的重新配置 • 系统行为的描述
23/33
第5章 动态软件体系结构
5.3 动态体系结构的描述
◇ 动态软件体系结构的形式化描述
◎ 形式化描述的方法
• 图形化方法 • 进程代数方法 • 逻辑方法
5.2 软件体系结构动态模型
◇ 基于构件的动态系统结构模型
◎ 实例分析
Server构件 配置器 请求更新 提交更新请求 判 断 通知有更新请求 通知有更新请求 返回准备 就绪信息 返回准备 就绪信息 通知一切就绪 准备执行更新 通知更新执行完毕并返回结果 通知更新 结束 通知更新结束 返回相应信息 通知更新结束 通知更新结束 返回准备 就绪信息 执行 更新 体系结构 配置器 Client 配置器 连接件 Server构件 执行
5.1 动态软件体系结构概述
◎ 由于系统需求、技术、环境、分布等因素的变化而最终 导致软件体系结构的变动,称之为软件体系结构演化。
◎ 软件系统在运行时刻的体系结构变动称为体系结构的动 态性。 ◎ 体系结构的静态修改称为体系结构扩展。 ◎ 体系结构的扩展和动态性都是体系结构适应性和演化性 的研究范畴。
软件工程与软件体系结构设计

未来的挑战与机遇
面临新技术挑战,开发新机遇
持续学习与创新
不断学习适应新技术发展 创新实践提升软件架构水平
总结
软件架构的演进和未来趋势对于软件工程和软件 体系结构设计至关重要。借助人工智能、云原生、 边缘计算、区块链等技术,设计可持续的软件架 构是未来发展的必然选择。面对挑战与机遇,持
续学习和创新是保持竞争优势的关键。
安全性优化
保护用户数据和系统安全 预防恶意攻击和信息泄露
质量保证流程
建立完善的测试流程
性能优化方法
使用性能监控工具
最佳实践案例
学习成功项目经验
实践指南
总结
软件质量与性能优化是软件工程的重要组成部分。 通过质量保证技术和性能优化策略,可以提高软 件质量和用户体验,加快软件开发周期,降低维 护成本。不断学习和实践最佳方法,能够在软件
区块链技术应用
AI技术融入架构设 计
边缘智能化处理
灵活部署与扩展性 提升
安全性与可追溯性 提升
可持续软件架构设计
环境友好设计
减少能源消耗和碳排放
社会责任考量
社会价值和道德规范
业务可持续性考虑
商业模式与资源利用
小结与展望
软件工程与软件体 系结构相互关系
紧密相连,相互促进发展
综合实践经验
实践中不断积累优化方案
性指软件是否易于使用。
质量保证技术
测试策略
确保软件功能正确 性
静态代码分析
发现潜在问题
自动化测试
提高测试效率
性能测试
验证软件性能
性能优化
响应时间优化
通过优化算法和代码结构来提 高响应速度 减少不必要的计算和IO操作
资源利用率优化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.基于事件的隐式调用(Event-based Implicit Invocation) (1)基本结构与词汇表 该结构中的模块既提供一组过程,也提供一组事件。 系统由可以发布事件的构件组成,另一些构件为注册 接收这些发布的事件,这些构件将自己的过程同一事 件相关。 词汇表是[构件=模块;连接器=事件与过程隐式调用] (2)特征 软件体系结构中的构件可以声明或者广播一个或者多 个事件,而不是直接调用过程。系统中的其它成分可 以通过将一个过程连接到一个事件来表达自己对该事 件的兴趣。当该事件激发时会隐含地调用其它模块。
软件体系结构风格(style)又称软件体系结 构习惯模式(idiomatic paradigm)。体系 结构风格定义了一个系统家族,即一个体系结 构定义一个词汇表和一组约束:词汇表中包含 一些构件和连接器类型,而这组约束指出系统 是如何将这些构件和连接器组合起来的。 Define classes of software systems based on the form of the solution and which can be applied across problem domain.
有用的系统 基本工具 内核
软部件:实现 在层次结构中 的虚拟机 连接件:层次 与层次之间交 互的协议
层次化组织原则:每一 层向其上层提供服务, 并利用下层的服务。
用户
5.3 软件体系结构风格
(2)特征 层次结构虚拟机与层次间的协议。 (3)优点 首先支持抽象程度递增的系统设计,使得设计者可以 把一个复杂系统按递增的步骤分解开来。其次,功能 的改变只会影响相邻的上下层。最后,这种结构可以 支持重用。 (4)缺点 层次划分不容易,很难找到一个合适的正确的层次抽 象方法。
5.仓库系统及知识库(Repositories)
(1)基本结构与词汇表 在该结构中,有两种不同的软件构件:一种表示当 前状态的中心数据结构,另一种是一组相互独立的处 理中心数据的构件。不同的仓库系统与外部构件有不 同的交互方式。控制方式的选择决定了仓库系统的类 型。 仓库系统可以分为两类:数据库和黑板系统 (Blackboard)。 黑板系统有知识源、黑板数据结构和控制三个部分组 成。 词汇表是[构件=中心数据仓库和在仓库上操作的独立 构件的集合;连接器=通知路径]
5.1 软件体系结构
第二,框架模式观点虽然与结构观点有相似点, 但前者更加强调系统的整体连贯性,主要针对 特定领域和问题,而不仅仅是研究系统的组成。 第三,动态模型包括系统的总体配置的变化、 建立/禁止预定义的通讯、互连通道和计算进 程等。 第四,进程模式观点强调软件体系结构中的构 造过程中的步骤和进程,在这一观点下软件体 系结构是一个进程描述的结果。
5.2数据体系结构设计
在软件应用中,数据体系结构对软件体系结构的 设计有深远的影响,其具体表现在: 1)在软件体系结构设计层,数据的结构设计是 软件体系结构设计的一个重要方面; 2)在构件设计层,数据结构及其操纵它们的相 关算法的设计对创建高质量的应用是至关重要的; 3)在应用层,数据模型到数据库的映射,是实 现应用系统业务目标的关键; 4)在业务层,存在于数据库或数据仓库中的数 据是进行数据挖掘和知识发现的基础,该内容对 业务系统的成功具有举足轻重的影响。
UNIX的command shell是这种结构
2.数据抽象和面向对象组织 (Data Abstraction and ObjectOriented Organization)
(1)基本结构与词汇表 在该结构中,数据表示和与之相连的最基本操 作都被封装在一个抽象数据类型或者对象中。 词汇表是[构件=对象;连接器=方法调用] (2)特征 其特征包括两个方面是:对象负责维持其本身 的完整性;信息隐藏。
有原则地使用软件体系结构风格具有如下意义: 它促进了设计的复用,使得一些经过实践证实 的解决方案能够可靠地解决新问题。 它能够带来显著的代码复用,使得体系结构风 格中的不变部分可共享同一个解决方案。 便于设计者之间的交流与理解。 通过对标准风格的使用支持了互操作性,以便 于相关工具的集成。 在限定了设计空间的情况下,能够对相关风格 作出分析。 能够对特定的风格提供可视化支持。
与此同时,人们目前尚不能准确回答的问题是: 系统设计的哪个要点可以用风格来描述; 能否用系统的特性来比较不同的风格,如何确 定用不同的风格设计系统之间的互操作; 能否开发出通用的工具来扩展风格; 如何为一个给定的问题选择恰当的体系结构风 格,或者如何通过组合现有的若干风格来产生 一个新的风格。
管道和过滤器体系架构模式把系统任务分成 为几个独立的处理步骤。这些步骤采用通过 系统的数据流连接。一个步骤的输出是下一 个步骤的输入。每个处理步骤由一个过滤器 组件实现,它处理或者转化数据,并且系统的输 入可以是多种数据源.
这种结构有若干不变特征: 1. 过滤器一定是独立的实体,即各个过滤器之 间不能共享状态。 2. 过滤器与其连接的上下游过滤器相互独立, 即不知道,更不能假定,分别与其输入和输出 相连接的其他过滤器的信息。它们的规格说明 中只能涉及限制哪些数据可以出现在它的输入 管道中和保证它将输出何种类型的计算结果, 但它们不能识别在与它们相连的管道的另一边 究竟是谁。如图5.1所示。
5.3 软件体系结构风格
常见的软件体系结构风格涉及: 设计词汇表是什么?或者构件和连接器的类型 是什么? 可容许的结构模式是什么? 基本的计算模型是什么? 风格的基本不变性是什么? 其使用的常见例子是什么? 使用此风格的优缺点是什么? 其常见特例是什么?
5.3 软件体系结构风格
种类 本类型的规格说明都包括管线、受约束的管 道和有名管道三类。管线限制过滤器的拓扑 结构只能是线性序列。受约束的管道限制在 其上流通的数据量。有名管道要求在两个过 滤器之间流通的数据经过严格地定义。
5.3 软件体系结构风格
优点 它允许设计者将一个系统的整体输入/输出行为 理解为各个独立过滤器行为的一个简单的合成。 该体系结构支持重用。 维护系统和增强功能容易。 缺点 容易导致批处理方式。 在维护或者响应两个分离但相关的数据流时容易 受阻。 增加了分析与编码的工作量,增加了复杂性,降 低了性能。
第五章 软件体系结构设计
5.1 软件体系结构
在软件编码之前,进行软件的分析和设计,已成 为软件行业的标准做法。 软件体系结构仅关注大型设计,为开发团队的设 计者提供指导。软件体系结构的设计过程是一个 具有多个步骤的过程,其主要任务是从信息需求 中综合出数据结构、程序结构、接口特征和过程 细节。
5.1 软件体系结构
软件体系结构是一个软件系统的基本组织,它 体现在构件、构件间的相互关系以及构件与环 境的关系中;它还包括指导系统设计和进化的 原则。 软件体系结构并非是可执行的软件,它是一种 设计表示,通过该表示使得软件体系结构师能 够分析其所完成的设计是否满足软件需求,以 减少软件构造过程中存在的风险。
软件体系结构的三要素
程序构件(模块)的层次结构 构件之间交互的方式 数据的结构
软件设计的一个目标是建立软件的体系结构表 示。将这个表示当作一个框架,从事更详细的 设计活动。
在软件体系结构设计中应保持的性质
结构 体系结构设计定义系统的构件、构件打 包的方式和相互交互的方式
附属的功能 体系结构设计描述设计出的体系 结构如何实现功能、性能、可靠性、安全性、 适应性,以及其它的系统需求。 可复用 体系结构设计应描述为一种可复用的 模式,能复用已有构造块,并可供以后类似系 统族的设计使用。
5.2数据体系结构设计
数据体系结构设计出现在高抽象层,构建表示 数据或信息的模型。这一数据模型被逐步求精 为特定的实现表示,该表示可以被应用系统处 理。 构件级的数据设计关注于被一个或多个软件构 件直接访问的数据结构表示,在实际应用中, 数据设计在分析模型的创建期间就已经开始。
5.3 软件体系结构风格
5.1.2 为什么软件体系结构重要 1)软件体系结构可以用于各风险承担者之间的沟通; 2)软件体系结构设计突出了早期设计的选择,这些选 择对随后的设计和实现工作乃至最终项目的成功影响 深远; 3)软件体系结构建立了一个相对较小、但易于理解和 掌握的模型,该模型描述了系统如何构成,以及这些 构件如何一起工作; 4)软件体系结构设计结论是软件测试的基础与前提, 在软件体系结构上考虑测试,其目的是找出体系结构 设计的错误和缺陷,产生指导代码测试的测试计划和 测试用例; 5)软件体系结构对新的团队成员的培训是必不可少的, 这可让新成员快速跟上开发进度;此外,软件体系结 构的培训还对客户、管理者、测试者和操作员有用。
5.1 软件体系结构
5.1.1 软件体系结构的概念 体系结构:是高层的建模,它描述事物最重要 的性质。 M.Shaw:软件体系结构定义为程序/系统各 构件的结构以及它们之间的内部关系和指导它 们的设计并随时间而演变的原理和方针。
5.1 软件体系结构
M.Shaw的具体观点如下: 第一,从结构模式观点上看,软件体系结构包 括软件构件、构件之间的联系和系统构造、方 式、约束、语义、分析、属性、基本原理和系 统需求。
对象 对象
对象
过程ቤተ መጻሕፍቲ ባይዱ用 对象 对象
图2 抽象数据类型和对象
(3)优点 封装性。信息隐藏。抽象性。类特性。继承性等。
(4)缺点 由于对象之间的交互是通过明确的对象函数调用进行 的,所以当一个对象需要实现一个特定功能的时候, 必须知道哪一个对象提供这种服务,这就降低了系统 的灵活性。管道和过滤器模型不需要明确指明数据的 来源和去向。