软件工程中的结构化设计_第1页
软件工程中的结构化设计_第2页
软件工程中的结构化设计_第3页
软件工程中的结构化设计_第4页
软件工程中的结构化设计_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第四章 结构化设计,对软件进行需求分析和建模后,便开始了软件设计,需求规格说明是软件设计的重要输入,它为软件设计提供了基础。 软件设计过程是将需求规格说明转化为软件实现方案的过程。软件设计包括概要设计和详细设计,本章则主要介绍软件概要设计和详细设计的过程,结构化设计原理 模块独立 启发规则 表示软件结构的图形工具,面向数据流的设计方法 人机界面设计 过程设计,4.1 结构化设计概述,任务:回答How to do? 阶段划分:概要设计、详细设计 主要内容: 体系结构设计 数据设计 接口设计 过程设计 结构化设计模型与结构化分析模型的关系: 软件设计必须依据对软件的需求分析来进行的,而结构化分析的

2、结果为结构化设计提供了最基本的输入信息,软件开发阶段的信息流,编码,测试,设计,4.2 软件设计的概念和原理,模块化 抽象 逐步求精 信息隐藏,1. 模块化,模块(Modular): 独立命名,可独立访问的具有一定功能的一段程序。 模块化设计(Modular Design): 按适当的原则把软件划分为一个个较小的、相关而又相对独立的模块。每个模块可独立开发、测试,最后组装成完整的软件。 在结构化方法中,过程、函数和子程序等都可作为模块;在面向对象方法中,对象是模块,对象内的方法也是模块。 模块分解并不是越小越好,理想模块,理想模块的特点: 只解决一个问题。 功能都应该明确,使人容易理解。 理想

3、模块之间的连接关系简单,具有独立性。 由理想模块构成的系统,容易使人理解,易于编程,易于测试,易于修改和维护。 对用户来说,其感兴趣的是模块的功能,而不必去理解模块内部的结构和原理,模块分解(Decomposition,E(P1+P2)E(P1)+E(P2,设: C(x) 为复杂程度函数 E(x) 为决定解决问题x所需的工作量(时间)函数,如果:C(P1)C(P2,则:E(P1)E(P2,C(P1+P2)C(P1)+C(P2,奇妙的数字 7+2,人类信息处理能力的限度,软件工程基本定理,C(P1+P2)C(P1)+C(P2) E(P1+P2)E(P1)+E(P2,软件工程基本定理,有关模块化,

4、模块化考虑因素: 模块数目 怎样定义一个给定大小的模块 评价模块系统设计方法的标准: 可分解性、可组装性、可理解性、连续性、保护性 模块化的优点: 易阅读和理解,可靠性,可修改性,2. 抽象(Abstraction,抽象即提取出本质而暂不考虑细节。是认识复杂现象过程中使用的思维工具。 在进行软件设计时,抽象与逐步求精、模块化密切相关,可提高软件的可理解性。 高层次抽象 使用问题环境的语言,以概括的方式叙述问题的解决。 较低层次抽象 更过程化的方法 面向问题+面向实现术语结合 最低层次抽象 直接实现的方式叙述问题的解法,3. 逐步求精,细化 为了集中精力解决主要问题而尽量推迟对问题细节的考虑。

5、软件工程过程的每一步都是对软件解法的抽象层次的一次精化。 求精是帮助设计者在设计过程中提示出低层细节,4. 信息隐藏(Information Hiding,又称数据封装(Data Encapculation) 指在设计和确定模块时,使得一个模块内包含的信息(过程和数据),对于不需要这些信息的其他模块来说,是不可访问的。 为软件系统的修改、测试及以后的维护都带来好处 目的 为了提高模块的独立性,栈stack,4.3 模块独立性(Module Independence,模块独立性: 是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其他模块接口是简单的。 模块完成独立的功能 符合信

6、息隐蔽和信息局部化原理 模块间关连和依赖程度尽量小 两个定性的度量标准: 耦合性:模块之间的依赖程度。取决于接口的复杂性、调用的方式及传递的信息。 内聚性:模块内部各成分之间的关联程度,1. 耦合(Coupling,耦合性: 是程序结构中各个模块之间相互关联的度量。 取决于各个模块之间接口的复杂程序、调用模块的方式以及哪些信息通过接口。 耦合性越高,模块独立性越弱,低,高,弱,强,耦合性,模块独立性,非直接耦合(Nondirect Coupling,非直接耦合: 模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。 这种耦合的模块独立性最强。 例如下图中,模块1和2是非直

7、接耦合,数据耦合(Data Coupling,数据耦合: 在两个模块间往返传递的只有数据(或变量或记录或文件),这种耦合称数据耦合。 在模块间只有数据传输,模块接口简单。 在不可避免的耦合中是耦合力最低的,也是较理想的耦合。 如:编程语言中的传值函数,标记耦合(Stamp Coupling,标记耦合(又称特征耦合): 指两个模块之间传递的是数据结构(如记录、数组等)。其实传递的是这个数据结构的地址。 两个模块必须清楚这些数据结构,并按要求对其进行操作,这样就降低了可理解性。 如: 住户详情中包含了“本月用电量”和“本月用水量,将标记耦合改为数据耦合,控制耦合(Control Coupling,

8、控制耦合: 如果一个模块通过传送控制信息(开发、标志、名字等),明显地控制选择另一模块的功能就是控制耦合。 病态耦合,B,控制耦合举例,去除模块间控制耦合的方法,去除模块间控制耦合的方法: 将被调用模块内的判定上移到调用模块中进行; 被调用模块分解成若干单一功能模块,将控制耦合改为数据耦合又例,外部耦合,外部耦合: 当模块受外部环境的约束时就会发生外部耦合。 例如:I/O模块与特定设备,格式与通信协议相关联。 外部耦合必不可少,但这种模块数目应尽量少,公共耦合(Common Coupling,公共耦合: 允许两个以上模块引用或访问同一个公用数据区(也称全局数据区、公共数据环境)。 公共数据区指

9、: 全局数据结构 共享通讯区 内存公共覆盖区等,公共耦合存在的问题,公共耦合存在的问题: 软件可理解性降低(模块间存在错综复杂的联系) 软件可维护性差(修改变量名或属性困难) 软件可靠性差(公共数据区及全程变量无保护措施) 慎用公共数据区和全程变量,内容耦合(Content Coupling,内容耦合: 当一个模块使用另一个模块内部的数据或信息时,或者转移进入另一个模块中时,产生模块间内容耦合。 最不好的耦合形式! 发生内容耦合的情形: 模块直接访问另一模块的内部数据 模块不通过正常入口转到另一模块内 两模块有一部分代码重叠(只可能出现在汇编语言中) 一模块有多个入口,如何降低模块间耦合度,如

10、模块必须存在耦合,应采取下述设计原则: 尽量使用数据耦合, 少用控制耦合, 限制公共环境耦合的范围, 坚决避免使用内容耦合。 降低模块间接口的复杂性 实际上,开始时两个模块之间的耦合不只是一种类型,而是多种类型的混合。这就要求设计人员按照实际情况进行分析、比较和分析,逐步加以改进,以提高模块的独立性,接口复杂性与耦合类型的关系,内聚(Cohesion,内聚性: 衡量一个模块内各个元素彼此结合的紧密程度。 设计目标:高内聚(一个模块的所有成分都直接参与并且对于完成同一功能来说都是最基本的,低,高,强 功能单一,弱 功能分散,内聚性,模块独立性,偶然内聚,偶然内聚: 一个模块完成一组任务,任务之间

11、的关系很松散。 缺点:可理解性差,可修改性差。 例如下图中,M模块中的三个语句没有任何联系,逻辑内聚,逻辑内聚: 这种模块把几种功能组合在一起,每次被调用时,则由传递给模块的判定参数来确定该模块应执行哪一种功能,被调用模块,缺点: 增强了耦合程度(控制耦合),不易修改,效率低,逻辑内聚,时间内聚,时间内聚: 模块完成的功能必须在同一时间内执行,这些功能只因时间因素关联在一起。 如:初始化系统模块、系统结束模块、紧急故障处理模块等,过程内聚,过程内聚: 一个模块内各处理成分的动作各不相同,但它们都受一个控制流的支配,且决定了它们的执行次序,高斯消去法解题流程,通信内聚,通信内聚: 模块中的所有元

12、素都使用相同输入数据,和/或产生相同输出数据。 通常,通信内聚模块是通过数据流图来定义的。 例如,通信内聚举例,产生职工工资报表并计算平均工资模块,顺序内聚,顺序内聚: 一个模块能完成多个操作,前一个操作处理的输出数据是下一个操作处理的输入数据,模块中各成份的工作是有次序的,各成份的关系也较紧密,则称为顺序内聚,功能内聚,功能内聚: 一个模块内的所有成分的处理动作全部为完成某个功能,且只执行一个功能,缺一不可,称为功能内聚。 如:计算实发工资,打印发票等 是最高程度的内聚。 有利于实现软件的重用,从而提高软件开发的效率,耦合、内聚与模块独立性关系,内聚和耦合密切相关,同其它模块强耦合的模块意味

13、着弱内聚,强内聚模块意味着与其它模块间松散耦合。 设计目标:力争强内聚、弱耦合。 二者都反映模块独立性的良好程度。耦合是直接的主导因素,内聚则辅助耦合共同对模块独立性进行衡量,4.5 表示软件结构的图形工具,层次图 HIPO图 结构图,1. 层次图,层次图(H图) 描绘软件的层次结构。 用矩形框表示一个模块,连线表示模块之间的调用关系。 适于在自顶向下设计软件的过程中使用,2. HIPO图,HIPO图 Hierarchy Plus Input/Processing/Output 是一种描述系统结构和模块内部处理功能的工具(技术)。 由H图和IPO图两部分构成。H图描述了整个系统的设计结构以及各

14、类模块之间的关系,IPO图描述了某个特定模块内部的处理过程和输入/输出关系。 在H图里除了最顶层的方框之外,每个方框都加了编号。 和H图中每个方框相对应,应该有一张IPO图描绘这个方框代表的模块的处理过程,IPO图示例,3. 结构图,结构图(Structured Chart, SC) 是精确表达模块结构的图形表示工具。 作为软件设计文档的一部分,清楚地反映出软件模块间的层次调用关系和模块之间的联系,结构图中的主要内容,SC图中的主要内容: 模块 用矩形框表示,框内注明模块的名字或主要功能 模块的调用关系和接口 用箭头(或直线)表示 调用次序为上层调用下层 同层按照数据传递关系确定 模块间的信息

15、传递 数据信息或控制信息 尾端带有空心圆的短箭头表示数据信息 尾端还有实心圆的短箭头表示控制信息,结构图中的四种模块,在系统结构图中有四种类型的模块: 传入模块 传出模块 变换模块,即加工模块 协调模块 在一个好的SC图中,协调模块应在较高层出现,逻辑输 入数据流,逻辑输 出数据流,变换 数据流,结构图中两个附加符号,选择调用,循环调用,结构图的形态特征,结构图的形态特征: 深度、宽度、扇入、扇出,结构图举例,原子模块,结构化设计,目的: 使程序的结构尽可能反映要解决的问题的结构。 任务: 完成目标系统的系统结构图。 本质: 将需求分析阶段所产生的DFD转换成SC图,4.6 面向数据流的设计方

16、法,基于数据流的设计方法可以很方便地将数据流图中表示的数据流映射成软件结构。其设计过程描述如下: 复查并精化数据流图。 确定数据流图中数据流的类型。 导出初始的软件结构图。 逐级分解。 精化软件结构。 导出接口描述和全局数据结构,从DFD导出SC图的步骤,DFD的两种类型,信息流(DFD)的两种类型: 变换型DFD线型 事务型DFD扇型 有一个明显的事务中心,它接受一项事务,根据该事务的特点和性质,选择分配一个适当的处理单元,然后输出结果,事务型DFD,1. 变换分析,Transform Analysis 是将具有变换型的DFD图导出SC图。 基本步骤: 在数据流图上区分系统的逻辑输入、逻辑输

17、出和变换中心部分,并标出它们的分界。 进行一级分解,设计系统模块结构的顶层和第一层。 进行二级分解,设计输入、输出和中心变换部分的中、下层模块,1)在DFD上标出逻辑输入、逻辑输出和变换中心的分界,变换中心,c,e 逻 辑输入,w,u 逻 辑输出,具有变换型数据流图,2)完成第一级分解,Mc,MA,MT,ME,C,e,C,e,U,w,U,w,顶层,第一层,第一级分解后的结构图,2)完成第一级分解,第一级分解后的结构图(另一种画法,3)完成第二级分解:自顶向下分解,设计出每个分支(输入、变换、输出)的中、下层模块,3)完成第二级分解(续,MA,对逻辑输入的分解,C,E,B,A,D,逻辑输入模块的

18、 调用与执行过程,3)完成第二级分解(续,对输出的分解,对变换中心加工的分解,4)获得完整的SC图,运用变换分析方法建立系统的SC图时需注意以下几点,模块设计的次序时,应遵循对一个模块的全部直接下属模块都设计完成后,再转向另一个模块的下层模块的设计。 在设计下层模块时,应考虑模块的耦合和内聚问题,以提高设计初始SC图的质量。 注意“黑盒”技术的使用。 具有高内聚低耦合的模块才是模块独立性比较强的模块,2. 事务分析,是将具有事务型的DFD导出结构图。 基本步骤: 在DFD上确定事务中心,接收部分和发送部分。 画出SC框架,把DFD上的三部分分别映射为事务控制模块、接收模块和动作模块。 分解细化

19、的接收分支和发送分支,完成初始SC图,2. 事务分析,是将具有事务型的DFD导出结构图。 基本步骤: 在DFD上确定事务中心,接收部分和发送部分。 画出SC框架,把DFD上的三部分分别映射为事务控制模块、接收模块和动作模块。 分解细化的接收分支和发送分支,完成初始SC图,事务分析映射方法,该数据流图是事务型。 识别事务中心和每一条操作路径上的流特征。 将DFD映射为事务型SC图。 事务流应该映射到包含一个输入分支和一个分类事务处理分支的程序结构上。分类事务处理分支结构包含一个调度模块,它调度和控制下属的操作模块。 “因子化”分解和细化该事务结构及每一条操作路径的结构。 每一条操作路径的DFD有

20、它自己的信息流特征,可以是变换也可以是事务型。 优化得到的SC图,事务中心,事务源,主模块,给出H,取得A,L,M,N,A,G,H,B,E,C,F,D,转换为结构图,事务分析映射方法,典型事务型DFD也可使用变换分析来分解转换,练习:请将下列给出的采购子系统DFD图转换成SC图,加工名称: 2.1 按书号汇总缺书 2.2 按出版社汇总缺书 2.3 修改教材库存和待 购量,文件名称: F1 教材存量表 F2 缺书登记表 F5 待购教材表 F6 教材一览表 F7 进书登记表,采购子系统的SC图,缺书登记表=班号+姓名+书号+数量,软件结构图注意事项,同一名字的模块在结构图中仅能出现一次。 调用关系

21、只能从上到下。 不严格表示模块的调用次序,习惯上从左到右,有时为了减少连线的交叉,适当地调整同一层模块的左右位置,以保证结构图的清晰。 结构图并不指明什么时候调用下层模块,只表明一个模块调用哪些模块,至于模块内还有没有其他成分则完全没有表示,综合数据流图的映射,确定DFD整体上的类型:除明显有事务类型的,都可认为是变换型。事务型用于高层DFD变换有平行处理的优点。 把与全局特性不同的局部区域孤立出来,确定类型。 按整体与局部的DFD特性,设计软件结构,混合型的结构设计,4. 设计优化,将初始SC根据模块独立性原则进行精化,对模块进行合并、分解修改、调整,得到高内聚、低耦合模块,得到易于实现、易

22、于测试和易于维护的软件结构,产生设计文档的最终SC。 改进软件结构设计的指导原则: 启发式规则,4.4 启发规则,几条常用的启发规则: 程序结构尽可能与问题结构相对应 模块功能的完整 消除重复功能,改进软件结构提高模块独立性 模块规模应该适中 深度、宽度、扇出和扇入都应适当 模块的作用域应该在控制域之内 力争降低模块接口的复杂程序 设计单入口单出口的模块 模块功能应该可以预测,1. 程序结构尽可能与问题结构相对应,两种典型的程序结构: 变换型程序 事务型程序 两种程序结构的共同特征: 上层模块只负责控制、协调 下层模块完成具体的操作,2. 模块功能的完整,完整的模块应包括三部分: 执行规定功能

23、部分 出错处理部分 需返回一系列数据时,应返回是否正确结束(即“文件完/EOF”)标志,3. 消除重复功能,消除模块中重复部分提高模块独立性。 因为同一功能重复多处,不仅浪费编程、测试时间,还会给修改带来麻烦。但消除重复功能并非简单的合并。 正确的方法是: 先分析几个模块中相同功能的部分; 然后把这个功能分离出来,构成它们的一个公共的下层模块,消除重复功能 举例,4. 模块规模应该适中,模块规模,用模块中所包含语句的数量多少来衡量。 模块过大:可理解程度下降 考虑对该模块分解 模块过小:开销大于有效操作,系统接口复杂 考虑是否同它的调用模块合并 几种情况下的小模块不合并: 模块具有独立的功能

24、模块功能可能会发生变化 模块的复用性好,或者其调用模块很复杂,5. 深度、宽度、扇入、扇出合理,深度表示软件结构中控制的层数。 宽度是软件结构内同一个层次上的模块总数的最大值。 扇入,表示一个模块有多少个上级模块直接调用它。 扇出,表示一个模块直接控制(调用)的模块数目。 原则:避免高扇出(7,因为属自然分类情况,易理解,5. 深度、宽度、扇入、扇出合理(续,相关技巧: 良好的结构图往往呈“清真状”,即“顶为尖下层逐渐加宽底层收窄”。 结构图的形态应该均衡,即从顶到底层的路径长短不该过于悬殊,举例:下列模块结构图是否合适,6. 模块的作用域应在控制域之内,定义: 控制域:从结构方面考虑的。是这

25、个模块本身以及所有直接或间接从属于它的模块的集合。 作用域:从功能方面考虑的。是受该模块内一个判定影响的所有模块的集合。 基本目标: 当作用域为控制域的子集时,才能获得弱耦合; 判定模块和受其影响的模块应该尽量靠近,练习:如何消除下列模块结构图中的不合理,7. 降低模块接口的复杂性,接口传递信息应简单且和模块功能一致,8. 设计单入口、单出口模块 防止模块间内容耦合的出现 9. 模块功能应该可以预测 只要输入的数据相同就产生同样的输出,这个模块的功能就是可以预测的。 模块带有内部状态其功能可能是不可预测的。这样的模块难理解、难测试、难维护,设计优化,总之,对软件结构的求精,带有很大的经验性。往

26、往形成的DFD中的加工与SC中的模块之间是一对一的映射关系,然后再修改。但对于一个实际问题,可能把DFD中的两个甚至多个加工组成一个模块,也可能把DFD中的一个加工扩展为两个或更多个模块,根据具体情况灵活掌握设计方法,以求设计出高内聚低耦合的模块所组成的,具有良好特性的软件结构,4.7 人机界面设计,是接口设计的一个重要组成部分。 其质量直接影响用户对软件产品的评价,从而影响软件产品的竞争力和寿命。 设计好人机交互界面: 了解用户应具备的特性 用户类型:外行型、初学型、熟练型、专家型 界面设计类型 设计详细的交互 人机界面设计问题 系统响应时间 用户帮助设施 出错信息处理 命令交互,2. 人机

27、界面设计过程,是一个迭代的过程。 先创建设计模型, 再用原型实现这个设计模型, 由用户试用和评估, 根据用户意见进行修改,3. 界面设计指南,一般交互 信息显示 数据输入指南,4.8 过程设计,详细设计阶段的目的: 为软件结构图中的每一个模块确定采用的算法和模块内数据结构,用某种选定的表达工具给出清晰的描述。 详细设计阶段的任务: 为每一模块确定算法 确定每一模块使用的数据结构 确定模块的外部接口和用户界面 为每一模块设计一组测试用例,详细设计阶段的描述工具,图形 程序流程图、N-S图、PAD图 表格 判定表、判定树 语言代码(伪码) PDL,4.9 过程设计工具1. 程序流程图,程序流程图(

28、Program Flow Chart) 也称为“程序框图” 五种基本控制结构: 顺序型 选择型 当型循环型 直到型循环型 多情况选择型,具有嵌套形式的程序流程图,标准化程序流程图规定符号,X1,起止端点,输入/输出,一般处理,准备或预处理,预定义处理,条件判断,循环上界,循环下界,文件或文档,外接,内接,流程线,虚线,省略线,并行方式,注解或注释,流程符号的使用规则,循环体,循环流程符号的使用,1、循环符号的使用,流程符号的使用规则,2、判断有一个入口,但也允许有多个可选出口,多出口判断流程符号的使用,程序流程图使用约定,图的布局 符号分布均匀,连线保持合理长度,并尽量少用长线 符号的形状 符

29、号的外形和各符号大小的统一,避免使符号变形或各符号大小比例不一。 符号内的说明文字 尽可能简明。若注解符干扰或影响到图形的流程,应将正文写在另外一页上,并注明引用符号。 符号标识符左上角,便于其它文件引用该符号 符号描述符右上角,为便于进一步理解符号的功能 连接符,连接符使用约定,为避免出现流线交叉和使用长线,或某个流程图能在另一页上延续,可用连接符将流线截断。 出口连接符和入口连接符使用同一标识符。 换页截断可用与连接符相连的注解符表示。 例,出口连接符,入口连接符,程序流程图的缺点,箭头、控制流随意转移 不易表示数据结构 不是逐步求精,03.01.2021,请利用程序流程图描述下列问题的程

30、序结构,练习,某汽车修配厂,有一个存有汽车零件的 仓库,其中存有若干种零件,请编写一个查 询程序,用于查询该库中某零件的库存量为 多少,2. 盒图(N-S图,盒图(Nassi and Shneideman, N-S图) 五种图形构件: 顺序型 选择型 当型循环型 到型循环型 多分支选择型(CASE,顺序型,选择型,当型循环型,直到型循环型,多分支选择型,2. 盒图(N-S图)(续,当问题很复杂时,N-S图可能很大,在一张纸上画不下时,可用分层N-S图表示,即将图中的一些部分用一个名字表示,而在另外的纸上用此名字表示相应的部分,调用子程序A,2. 盒图(N-S图)(续,特点: 每个矩形框都只明确

31、定义了功能域。 控制转移不能任意规定,必须遵守结构化程序设计要求。 从图中可很容易地确定局部数据和全局数据的作用域。 在图中很容易表现嵌套关系及模块的层次结构,3. PAD图,PAD图(Problem Analysis Diagram, PAD) 问题分析图,日本日立公司提出 表现程序的逻辑结构 五种基本控制结构: 顺序型 选择型 当型循环型 到型循环型 多分支选择型 允许递归使用,顺序型,选择型,直到型循环型,当型循环型,多分支选择型循环型,PAD图示例,3. PAD图(续,PAD的执行顺序是从上到下,从左到右,直到主干线的下端为止。 特点: 结构清晰并且结构化程度高。 更易读。 易转换为程

32、序。 除描述程序的逻辑结构,还可描述数据结构,PAD图 练习,请为学生成绩管理系统中的学生成绩统计模块设计程序结构。 要求: 统计各专业、各班级的高等数学平均分; 并将统计结果输出; 按平均成绩以班级为单位由高到低排序; 请利用PAD图描述该模块的算法,4. 过程设计语言PDL,过程设计语言(Program Design Language, PDL) 是一种用于描述功能模块的算法设计和加工细节的语言,是一种伪代码(Pseudo code)。 PDL关键词+自然语言 关键词,符合一般程序设计语言的常用语句的语法规则。 自然语言,描述应执行的功能。 特点: 逐步求精,4. 过程设计语言PDL(续,数据说明:其功能是定义数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论