内聚性与耦合性

内聚性与耦合性
内聚性与耦合性

耦合性与内聚性

(2010-06-20 12:13:39)

转载

标签:

分类:概念文章

耦合性

内聚性

it

1) 耦合性

?耦合性是对一个软件结构内部不同模块间联系紧密程度的度量指标。

?决定耦合性高低的主要因素

由于模块间的联系是通过模块接口实现的,因此,模块耦合性的高低主要取决于模块接口的复杂程度、调用模块的方式以及通过模块接口的数据。模块间的耦合性主要可划分为如下几种类型。

(1) 数据耦合。若两个模块之间仅通过模块参数交换信息,且交换的信息全部为简单数据,则称这种耦合为数据耦合。数据耦合的耦合性最低,通常软件中都包含有数据耦合。数据耦合的例子如下所示:

sum(int a,int b)

{int c;

c=a+b;

return(c);

}

main()

{int x,y;

printf("x+y= %d",sum(x,y));

}

(2) 公共耦合。若两个或多个模块通过引用公共数据相互联系,则称这种耦合为公共耦合。例如,在程序中定义了全局变量,并在多个模块中对全局变量进行了引用,则引用全局变量的多个模块间就具有了公共耦合关系。

(3) 控制耦合。若模块之间交换的信息中包含有控制信息(尽管有时控制信息是以数据的形式出现的),则称这种耦合为控制耦合。控制耦合是中等程度的耦合,它会增加程序的复杂性。控制耦合的例子如下所示:

void output(flag)

{if (flag) printf("OK! ");

else printf("NO! ");

}

main()

{ int flag;

output(flag);

}

(4) 内容耦合。若一个模块对另一模块中的内容(包括数据和程序段)进行了直接的引用甚至修改,或通过非正常入口进入到另一模块内部,或一个模块具有多个入口,或两个模块共享一部分代码,则称模块间的这种耦合为内容耦合。内容耦合是所有耦合关系中程度最高的,会使因模块间的联系过于紧密而对后期的开发和维护工作带来很大的麻烦。

2) 内聚性

内聚性是对一个模块内部各个组成元素之间相互结合的紧密程度的度量指标。模块中组成元素结合的越紧密,模块的内聚性就越高,模块的独立性也就越高。理想的内聚性要求模块的功能应明确、单一,即一个模块只做一件事情。模块的内聚性和耦合性是两个相互对立且又密切相关的概念。

经实践证明,保证模块的高内聚性比低耦合性更为重要,在软件设计时应将更多的注意力集中在提高模块的内聚性上。模块的内聚性主要可划分为如下几种不同的类型。

(1) 偶然内聚。若一个模块由多个完成不同任务的语句段组成,各语句段之间的联系十分松散或根本没有任何联系,则称此模块的内聚为偶然内聚。

(2) 逻辑内聚。这种模块是把几种功能组合在一起,每次调用时,则由传递给模块的判定参数来确定该模块应执行哪一种功能。

(3) 时间内聚。若一个模块包含了需要在同一时间段中执行的多个任务,则称该模块的内聚为时间内聚。例如,将多个变量的初始化放在同一个模块中实现,或将需要同时使用的多个库文件的打开操作放在同一个模块中,都会产生时间内聚的模块。

(4) 过程内聚。若一个模块中的各个部分相关,并且必须按特定的次序执行,则称该模块的内聚为过程内聚。在结构化程序中,通常采用程序流程图作为设计软件和确定模块划分的工具,因此,这样得到的模块往往具有过程内聚的特性。

(5) 通信内聚。若一个模块中的各个部分使用同一个输入数据或产生同一个输出数据,则称该模块的内聚为通信内聚。

(6) 顺序内聚。若一个模块中的各个部分都与同一个功能密切相关,并且必须按照先后顺序执行(通常前一个部分的输出数据就是后一个部分的输入数据),则称该模块的内聚为顺序内聚。

(7) 功能内聚。若一个模块中各个组成部分构成一个整体并共同完成一个单一的功能,则称该模块的内聚为功能内聚。

耦合与内聚

耦合性与内聚性 Posted on 2010-04-20 21:54 东苑草根阅读(364) 评论(1)编辑收藏 1) 耦合性 ?耦合性是对一个软件结构内部不同模块间联系紧密程度的度量指标。 ?决定耦合性高低的主要因素 由于模块间的联系是通过模块接口实现的,因此,模块耦合性的高低主要取决于模块接口的复杂程度、调用模块的方式以及通过模块接口的数据。模块间的耦合性主要可划分为如下几种类型。 (1) 数据耦合。若两个模块之间仅通过模块参数交换信息,且交换的信息全部为简单数据,则称这种耦合为数据耦合。数据耦合的耦合性最低,通常软件中都包含有数据耦合。数据耦合的例子如下所示: sum(int a,int b) {int c; c=a+b; return(c); } main() {int x,y; printf("x+y= %d",sum(x,y)); }/*主函数与sum函数之间即为数据耦合关系*/ (2) 公共耦合。若两个或多个模块通过引用公共数据相互联系,则称这种耦合为公共耦合。例如,在程序中定义了全局变量,并在多个模块中对全局变量进行了引用,则引用全局变量的多个模块间就具有了公共耦合关系。

(3) 控制耦合。若模块之间交换的信息中包含有控制信息(尽管有时控制信息是以数据的形式出现的),则称这种耦合为控制耦合。控制耦合是中等程度的耦合,它会增加程序的复杂性。控制耦合的例子如下所示:void output(flag) {if (flag) printf("OK! "); else printf("NO! "); } main() { int flag; output(flag); }/*主函数与output函数之间即为控制耦合关系*/ (4) 内容耦合。若一个模块对另一模块中的内容(包括数据和程序段)进行了直接的引用甚至修改,或通过非正常入口进入到另一模块内部,或一个模块具有多个入口,或两个模块共享一部分代码,则称模块间的这种耦合为内容耦合。内容耦合是所有耦合关系中程度最高的,会使因模块间的联系过于紧密而对后期的开发和维护工作带来很大的麻烦。

软件工程课后作业第四章

第四章 4.1.简述软件设计阶段的基本任务。 答:(1)数据/类设计数据/类设计将分析类模型变换成类的实现和软件实现所需要的数据结构。 (2)体系结构设计体系结构设计定义了软件的整体结构,由软件部件、外部可见的属性和他们之间的关系组成。 (3)接口设计接口设计描述了软件内部、软件和协作系统之间以及软件同人之间的通信方式。 (4)部件级设计部件级设计将软件体系结构的结构性元素变换为对软件部件的过过程性描述。 4.2.软件设计与软件质量的关系是怎么样的? 答:设计是在软件开发中形成质量的阶段,设计提供了可以用于质量评估的软件表示,是将用户需求准确地转化为完整的软件产品或系统的主要途径。 4.4.简述模块、模块化及模块化设计的概念。 答:模块:具有名字、参数、功能等外部特征以及完场模块功能的程序代码和模块内部数据等特征。 模块化:把软件按照规定原则,划分为一个个较小的,相互独立的但又相互关联的部件。 模块化设计:简单地说就是程序的编写不是开始就逐条录入计算机语句和指令,而是首先用主程序、子程序、子过程等框架把软件的主要结构和流程描述出 来,并定义和调试好各个框架之间的输入、输出链接关系。 4.5.举例说明每种类型的模块耦合度和每种类型的模块内聚度。 答:1、巧合内聚:讲几个模块中没有明确表现出独立功能的相同程序代码段独立出来建立的模块称巧合内聚模块。 2、逻辑内聚:逻辑内聚是指完成一组逻辑相关任务的模块,调用该模块时,由传送给 模块的控制性参数来确定该模块应执行哪一种功能。 3、时间内聚:时间内聚是指一个模块中的所有任务必须在同一时间段内执行。 4、过程内聚:过程内聚是指一个模块完成多个任务,这些任务必须指定的过程执行。 5、通信内聚:通信内聚是指一个模块内所有处理元素都集中在某个数据结构的一块区 域中。 6、顺序内聚:顺序内聚是指一个模块完成多个功能,这些功能又必须顺序执行 7、功能内聚:功能内聚是指一个模块中各个部分都是为完成一项具体功能而协同工作, 紧密联系,不可分割。 1、内容耦合:当一个模块直接修改或操作另一个模块的数据,或者直接转入另一 个模块时,就发生了内容耦合。此时,被修改的模块完全依赖于修 改它的模块。如果发生下列情形,两个模块之间就发生了内容耦合 (1) 一个模块直接访问另一个模块的内部数据; (2) 一个模块不通过正常入口转到另一模块内部; (3) 两个模块有一部分程序代码重叠(只可能出现在汇编语言中); (4) 一个模块有多个入口。

几个耦合的例子

一般说来,ANSYS的流固耦合主要有4种方式: 1,sequential 这需要用户进行APDL编程进行流固耦合 sequentia指的是顺序耦合 以采用MpCCI为例,你可以利用ANSYS和一个第三方CFD产品执行流固耦合分析。在这个方法中,基于网格的平行代码耦合界面(MpCCI) 将ANSYS和CFD程序耦合起来。即使网格上存在差别,MpCCI也能够实现流固界面的数据转换。ANSYS CD中包含有MpCCI库和一个相关实例。关于该方法的详细信息,参见ANSYS Coupled-Field Analysis Guide中的Sequential Couplin 2,FSI solver 流固耦合的设置过程非常简单,推荐你使用这种方式 3,multi-field solver 这是FSI solver的扩展,你可以使用它实现流体,结构,热,电磁等的耦合 4,直接采用特殊的单元进行直接耦合,耦合计算直接发生在单元刚度矩阵 一个流固耦合的例子 length=2 width=3 height=2 /prep7 et,1,63 et,2,30 !选用FLUID30单元,用于流固耦合问题 r,1,0.01 mp,ex,1,2e11 mp,nuxy,1,0.3 mp,dens,1,7800 mp,dens,2,1000 !定义Acoustics材料来描述流体材料-水 mp,sonc,2,1400 mp,mu,0, ! block,,length,,width,,height esize,0.5 mshkey,1 ! type,1 mat,1 real,1 asel,u,loc,y,width amesh,all alls ! type,2 mat,2 vmesh,all

2839-基于内聚耦合下独立学院会计专业KAQ人才培育和信息化教学的融合研究

基于内聚耦合下独立学院会计专业KAQ人才培育和信息化教学的融合研究 (1)问题提出: 本课题研究基于内聚耦合效应的独立学院会计专业驱动的KAQ人才培育模式也是为响应“国家对人才需要而呼唤教育创新”背景下形成的一种教育形态。以往的独立学院会计KAQ人才培育多是只注重学校模拟实践课程,与社会实际岗位需求脱节,应用型人才也多偏向“象牙塔”式的培养模式,因此探寻一种知识、能力、素质并进的独立学院新型KAQ会计人才培育模式成为目前关注的新趋势。 (2)课题界定: 本课题从新视角出发,从基于内聚耦合下的人才培育和信息化教学融合机制构建入手,以“信息化教学”和“KAQ人才培育模式”为基础分析,前者依据会计岗位确定课程目标,提高了内聚性,减小了耦合性,满足了学生就业及生涯发展的需要,后者充分利用企业教育资源,促进学生在真实的工作环境和素质教育环境中提高综合素质,两种关系双螺旋交叉强调内聚耦合关系和多维协同机制,反映了会计教育实践创新的新取向。 (3)国内外研究现状述评: 余绪缨(2007)教授指出:现代管理会计是以管理科学为基础、以决策性管理会计为主体的综合性交叉学科。在当前大部分独立学院会计专业的人才培养方案中,着重强调了专业知识体系的构建,而对信息获取、信息分析、财经写作、职业判断、组织协调、批判创新等综合能力和素质的培养则很少涉及,既没有相应的课程体系来覆盖,也缺乏针对性的专项训练,以致重知识、轻能力的想象较为普遍。因此,会计教育应使毕业生在掌握经济管理基础知识和会计专业知识的同时,还要具备良好的终身学习能力、实践能力、沟通能力、组织协调能力、写作能力、语言表达能力和创新能力等(花双莲、张月玲、付莉,2012) (4)选题意义与研究价值: 该模式科学、合理,根据学生在大学的学习进程有步骤、有计划的开展,学生容易接受理解,大大提高学习积极性,丰富独立学院会计专业的教学内容、教学方法和教学形式,促进教学水平、教学质量及教学效果的全面提高,增强了独立学院会计专业教育KAQ人才培养的特点和规律的耦合效应,因而该成果在更新办学思想,创新人才培养培育、推行产学多维协调合作教育、真正培养实用型、零距离的独立学院会计职业KAQ人才方面具有较高的价值。 (5)课题理论依据: 本课题理论依据是根据计算机中的内聚耦合关系在独立学院会计KAQ人才培育教育系统内,由社会模式和学校模式之间相互作用、相互影响而如何建立起来的一种相互关联性。耦合关系可以分为资源耦合、项目耦合和关系耦合三类。其中,资源耦合是耦合关系的最低层次,强调两种教育模式为了各自的活动开展和未来发展而达成的资源众建共享关系。一方面避免了教育资源重复建设,提高了利用率,另一方面为教育合作创新奠定了基础。项目耦合是在资源耦合关系上的进一步深化,通过项目合作达到教育利益最大化,从而实现教育资源的共用与公用。关系耦合是耦合关系的最高层次,这种关系是建立在交往理性基础之上,在长期相互信任、相互合作和共同发展的过程中形成的一种行为规范,也是独立学院会计专业KAQ人才培育生成的基石。关系耦合与独立学院会计专业KAQ人才培育系统的螺旋强度正相关,螺旋强度越大,关系耦合度越高。

耦合与内聚例子

耦合 (1)数据耦合。若两个模块之间仅通过模块参数交换信息,且交换的信息全部为简单数据,则称这种耦合为数据耦合。数据耦合的耦合性最低,通常软件中都包含有数据耦合。 数据耦合的例子: /* * 数据耦合 * 主函数main()和Multiply(int x, int y)之间为数据耦合关系 */ #include int Multiply(int x, int y) { return(x * y); } void main() { int x = 0; int y = 0; scanf("%d%d", &x, &y); printf("x * y = %d\n", Multiply(x,y)); } (2)控制耦合。若模块之间交换的信息中包含有控制信息(尽管有时控制信息是以数据的形式出现的),则称这种耦合为控制耦合。控制耦合是中等程度的耦合,它会增加程序的复杂性。 控制耦合的例子: /* * 控制耦合 * 根据年龄判断是否大于岁,然后根据是否满十八岁判断是否到达法定饮酒年龄 */ #include static bool Signal; void AdultOrNot(int age) { if (age > 18) { Signal = 1; } else { Signal = 0;

} } void WineOrNot() { if (Signal == 1) { printf("%s\n", "您已到达法定饮酒年龄!"); } else { printf("%s\n","您未到达法定饮酒年龄!"); } } int main() { int Age = 0; printf("%s","请输入您的年龄:"); scanf("%d", &Age); AdultOrNot(Age); WineOrNot(); } (3)公共耦合。若两个或多个模块通过引用公共数据相互联系,则称这种耦合为公共耦合。公共耦合的例子:在程序中定义了全局变量,并在多个模块中对全局变量进行了引用,则引用全局变量的多个模块间就具有了公共耦合关系。 (4)内容耦合。若一个模块对另一模块中的内容(包括数据和程序段)进行了直接的引用甚至修改,或通过非正常入口进入到另一模块内部,或一个模块具有多个入口,或两个模块共享一部分代码,则称模块间的这种耦合为内容耦合。内容耦合是所有耦合关系中程度最高的,会使因模块间的联系过于紧密而对后期的开发和维护工作带来很大的麻烦。 内聚 (1)偶然内聚。若一个模块由多个完成不同任务的语句段组成,各语句段之间的联系十分松散或根本没有任何联系,则称此模块的内聚为偶然内聚。 偶然内聚的例子:在模块T有三条语句。至少从表面上看不出这三条语句之间有什么联系,只是由于P,Q,R,S四个模块中都有这三条语句,为了节省空间才把它们作为一个模块放在一起。这完全是偶然性的。

软件工程(第五版)-习题及答案---第四章

一、判断题 1、(√)如果在需求分析阶段采用了结构化分析方法,则软件设计阶段就应采用结构化设计方法。 2、(√)概要设计与详细设计之间的关系是全局和局部的关系。 3、(×)一个模块的作用范围应该大于该模块的控制范围。 4、(√)模块间的耦合性越强,则模块的独立性越弱。 5、(×)在设计模块时,应使一个模块尽量包括多个功能。 6、(√)软件结构图可以利用数据流图映射出来。 7、(×)结构化设计是一种面向数据结构的设计方法。 8、(√)在结构化设计过程中首先要确认DFD。 二、选择题 1、软件结构图的形态特征能反映程序重用率的是(C)。 A、深度 B、宽度 C、扇入 D、扇出 2、概要设计的目的是确定整个系统的(B)。 A、规模 B、功能及模块结构 C、费用 D、测试方案 3、耦合是对软件不同模块之间互连程度的度量。各种耦合从强到弱的排列为(C)。 A、内容耦合,控制耦合,数据耦合,公共环境耦合 B、内容耦合,控制耦合,公共环境耦合,数据耦合 C、内容耦合,公共环境耦合,控制耦合,数据耦合 D、控制耦合,内容耦合,数据耦合,公共环境耦合 4、当一个模块直接使用另一个模块的内部数据时,这种模块之间的耦合为(D)。 A、数据耦合 B、公共耦合 C、标记耦合 D、内容耦合 5、数据耦合和控制耦合相比,则(B)成立。 A、数据耦合的耦合性强 B、控制耦合的耦合性强 C、两者的耦合性相当 D、两者的耦合性需要根据具体情况分析

6、衡量模块独立性的标准是(D)。 A、耦合的类型 B、内聚的类型 C、模块信息的隐藏性 D、耦合性和内聚性 7、如果某种内聚要求一个模块中包含的任务必须在同一段时间内执行,则这种内聚为(A)。 A、时间内聚 B、逻辑内聚 C、通信内聚 D、信息内聚 8、为了提高模块的独立性,模块内部最好是(C)。 A、逻辑内聚 B、时间内聚 C、功能内聚 D、通信内聚 9、在结构化设计方法中,下面哪种内聚的内聚性最弱(C)。 A、逻辑内聚 B、时间内聚 C、偶然内聚 D、过程内聚 10、软件设计是把(A)转换为软件表示的过程。 A、软件需要 B、系统分析 C、数据库 D、软件代码 11、概要设计的主要成果是(C)。 A、用户的界面需求 B、用户的分析方案 C、概要设计说明书 D、系统总体方案 12、数据结构设计也是概要设计的重要内容,主要是进行数据的(A)设计。 A、逻辑 B、存取 C、用户视图 D、索引 13、概要设计与详细设计衔接的图形工具是(B)。

软件工程中的耦合

软件工程中的耦合 软件工程中的耦合:简单地说,对象之间的耦合度就是对象之间的依赖性。指导使用和维护对象的主要问题是对象之间的多重依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。就是依赖性,相关性吧!!!有软硬件之间的耦合,还有软件各模块之间的耦合。耦合性是程序结构中各个模块之间相互关联的度量.它取决于各个模块之间的接口的复杂程度、调用模块的方式以及哪些信息通过接口.一般模块之间可能的连接方式有七种,耦合性由低到高分别是:非直接耦合、数据耦合、标记耦合、控制耦合、外部耦合、公共耦合、内容耦合。耦合是对一个软件结构内各个模块之间互连程度的度量。内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。 1.什么是内聚?什么是耦合?内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系;耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。2.内聚分为哪几类?耦合分为哪几类?内聚有如下的种类,它们之间的内聚度由弱到强排列如下:(1)

偶然内聚。模块中的代码无法定义其不同功能的调用。但它使该模块能执行不同的功能,这种模块称为巧合强度模块。(2)逻辑内聚。这种模块把几种相关的功能组合在一起,每次被调用时,由传送给模块参数来确定该模块应完成哪一种功能(3)时间内聚(4)过程内聚(5)通信内聚(6)顺序内聚(7)功能内聚耦合可以分为以下几种,它们之间的耦合度由高到低排列如下:(1)内容耦合:如果发生下列情形,两个模块之间就发生了内容耦合 1. 一个模块直接访问另一个模块的内部数据; 2. 一个模块不通过正常入 口转到另一模块内部; 3.两个模块有一部分 程序代码重迭(只可能出现在汇编语言中); 4.一个模块有多个入口。(2)公共耦合:若一组模块 都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。(3)外部耦合:一组模块都 访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。(4)控制耦合:如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。(5)标记耦合:一组模块通过参数表传递记录 信息,就是标记耦合。这个记录是某一数据结构的子结构,

内聚耦合以及uml各图的关系

>>uml在软件开发各个阶段的应用: 采用面向对象技术设计软件系统时,使用用例图来描述用户需求;使 用类图、对象图、包图、构件图和部署图描述系统的静态结构;使用 顺序图、合作图、活动图和状态图描述动态行为。 抽象得到类、属性、方法;关系来描述;组织成类图。部署图:将来在现场如何实现的设备等。状态图:状态转换过程(状态机)。 >>specific diagrams for each phase: --需求:用例图描述需求(角色、功能、外部交互) --分析:明确解决问题的细节 类图来描述静态结构; 顺序图、合作图、活动图、状态图来描述动态结构; --设计:给出解决方案 类图、包,对类的接口进行设计 --实现:将类用某面向对象语言实现 --集成与交付: 构件图、包、部署图 --测试 ·单元测试使用类图和类的规格说明书 ·集成测试使用类图、包、构件图和合作图 ·系统测试使用用例图来测试系统功能 >>内聚类型 内聚强度类型[从低到高]: (1)偶然内聚 如果一个模块的各成分之间毫无关系,则称为偶然内聚,也就是说模块完成一组任务,这些任务之间的关系松散,实际上没有什么联系。

(2)逻辑内聚 几个逻辑上相关的功能被放在同一模块中,则称为逻辑内聚。如 一个模块读取各种不同类型外设的输入。尽管逻辑内聚比偶然内聚合 理一些,但逻辑内聚的模块各成分在功能上并无关系,即使局部功能 的修改有时也会影响全局,因此这类模块的修改也比较困难。 (3)时间内聚 如果一个模块完成的功能必须在同一时间内执行(如系统初始化 ),但这些功能只是因为时间因素关联在一起,则称为时间内聚。 (4)通信内聚 如果一个模块的所有成分都操作同一数据集或生成同一数据集, 则称为通信内聚。 (5)顺序内聚 如果一个模块的各个成分和同一个功能密切相关,而且一个成分 的输出作为另一个成分的输入,则称为顺序内聚。 (6)功能内聚 模块的所有成分对于完成单一的功能都是必须的,则称为功能内 聚。 (7)信息内聚 模块完成多个功能,各个功能都在同一数据结构上操作,每一项 功能有一个唯一的入口点。这个模块将根据不同的要求,确定该模块 执行哪一个功能。由于这个模块的所有功能都是基于同一个数据结构 (符号表),因此,它是一个信息内聚的模块。 >>耦合类型 一般模块之间可能的连接方式有七种,构成耦合性的七种类型。它们之间的关系为(由弱到强) 非直接耦合(Nondirect Coupling) 如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,这就是非直接耦合。这种耦合的模块独立性最强。。 数据耦合(Data Coupling) 如果一个模块访问另一个模块时,彼此之间是通过数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的,则称这种耦合为数据耦合。由于限制了只通过参数表传递数据,按数据耦合开发的程序界面简单、安全可靠。因此,数据耦合是松散的耦合,模块之间的独立性比较强。在软件程序结构中至少必须有这类耦合。

高内聚低耦合原则

高内聚低耦合原则 一、什么是耦合度 软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分摸块的一个准则就是高内聚低耦合。耦合度(Coupling)是对模块间关联程度的度量。耦合的强弱取决与模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。降低模块间的耦合度能减少模块间的影响,防止对某一模块修改所引起的“牵一发动全身”的水波效应,保证系统设计顺利进行。内聚和耦合密切相关,同其它模块存在强耦合关系的模块常意味这弱内聚,强内聚常意味着弱耦合。耦合度就是某模块(类)与其它模块(类)之间的关联、感知和依赖的程度,是衡量代码独立性的一个指标,也是软件工程设计及编码质量评价的一个标准。耦合的强度依赖于以下几个因素: (1)一个模块对另一个模块的调用; (2)一个模块向另一个模块传递的数据量; (3)一个模块施加到另一个模块的控制的多少; (4)模块之间接口的复杂程度。 耦合按从强到弱的顺序可分为以下几种类型: a)非直接耦合:两模块间没有直接关系,之间的联系完全是通过主模块的控制和调用来实现的 b)数据耦合:一个模块访问另一模块,彼此间通过简单数据参数来交换输入、输出信息。这里的简单数据参数不同于控制参数、公共数据结构或外部变量。 c)标记耦合:如一组模块通过参数表传递记录信息,就是标记耦合。这个记录是某一数据结构的子结构,不是简单变量。 d)控制耦合:一个模块通过传递开关、标志、名字等控制信息,明显的控制选择另一模块的功能 e)外部耦合:一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数传递该全局变量的信息 f)公共耦合:一组模块都访问同一个公共数据环境。该公共数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。 g)内容耦合:一个模块直接修改另一个模块的数据,或直接转入另一个模块内聚度是指内部各元素之间联系的紧密程度,模块的内聚种类通常可分为7种,按其内聚度从低到高的次序依此为:偶然内聚、逻辑内聚、瞬时内聚、过程内聚、通信内聚、顺序内聚、功能内聚。 二、为什么要低耦合 了解什么是耦合及耦合的分类后,我想大家对为什么要降低耦合度已经有一定的认识,并且多数开发人员也大概尝尽了高耦合带来的苦头。道理很简单,耦合度很高的情况下,维护代码时修改一个地方会牵连到很多地方,如果修改时没有理清这些耦合关系,那么带来的后果可能会是灾难性的,特别是对于需求变化较多以及多人协作开发维护的项目,修改一个地方会引起本来已经运行稳定的模块错误,严重时会导致恶性循环,问题永远改不完,开发和测试都在各种问题之间奔波劳累,最后导致项目延期,用户满意度降低,成本也增加了,这对用户和开发商影响都是很恶劣的,各种风险也就不言而喻了。 为了预防这些问题的发生,其中一个重要手段就是降低代码的耦合度。但也不可能有绝对的零耦合,比如基于J2EE编程那就必须和JDK耦合,而且高耦合也不是一无是处,如果在设计前期预料到某功能后期基本不用修改,那么即使高耦合了也关系不大。但是,在还没有能力设计出基本不用修改的代码前,还得要求以低耦合为标准。那么怎样才能最大限度地降低耦合度呢?下面介绍降低耦合度的几种方法。 三、降低耦合度的方法 1、少使用类的继承,多用接口隐藏实现的细节。 Java面向对象编程引入接口除了支持多态外,隐藏实现细节也是其中一

关于耦合

耦合是指两个实体相互依赖于对方的一个量度。分为以下几种: 非直接耦合:两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的 数据耦合:一个模块访问另一个模块时,彼此之间是通过简单数据参数 (不是控制参数、公共数据结构或外部变量) 来交换输入、输出信息的。 标记耦合:一组模块通过参数表传递记录信息,就是标记耦合。这个记录是某一数据结构的子结构,而不是简单变量。 控制耦合:如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。 外部耦合:一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。 公共耦合:若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。 内容耦合:如果发生下列情形,两个模块之间就发生了内容耦合 (1) 一个模块直接访问另一个模块的内部数据; (2) 一个模块不通过正常入口转到另一模块内部; (3) 两个模块有一部分程序代码重迭(只可能出现在汇编语言中); (4) 一个模块有多个入口。 延伸阅读:地理学上也会引用耦合这一概念 地理时空耦合 一切地理事实、地理现象、地理过程、地理表现,既包括了在空间上的性质,又包括着时间上的性质。只有同时把时间及空间这两大范畴纳入某种统一的基础之中,才能真正认识地理学的基础规律。在考虑空间关系时,不要忽略时间因素对它的作用,把地理空间格局看作是某种“瞬间的断片”,不同时段的瞬间断片的联结,才能构成对地理学的动态认识。与此相应,在研究地理过程时,应把这类过程置布于不同地理空间中去考察,以构成某种“空间的变换”,它们可完整地体现地理学的“复杂性”。地理时空耦合是四维向量的充分表达,除了高度、经度、纬度(垂直方向和水平方向)外,还有时间维的同时考虑。 两个本来分开的电路之间或一个电路的两个本来相互分开的部分之间的交链。可使能量从一个电路传送到另一个电路,或由电路的一个部分传送到另一部分。 两个电路或器件的接合或连锁。分“静电耦合”、“磁耦合”、“直接耦合”、“电阻性耦合”、“光耦合”等。 耦合是指两个或两个以上的电路元件或电网络的输入与输出之间存在紧密 配合与相互影响,并通过相互作用从一侧向另一侧传输能量的现象;概括的说耦合就是指两个或两个以上的实体相互依赖于对方的一个量度。耦合作为名词在通信工程、软件工程、机械工程等工程中都有相关名词术语。

模型耦合与模型内聚举例分析

模型耦合与模型内聚举例分析 耦合是程序结构内不同模块之间相互关联程度的度量。它是由模块间接口的复杂程度调用模块的方式及接口传递的信息类型决定的。模块之间的连接越紧密,联系越多,耦合性越高,而其模块独立性就越弱。模块化设计的目标是:建立模块间耦合尽可能松散的系统。其优点在于:(1)在设计、编码、测试和维护系统中的任何一个模块时,不需要对系统中的其他模块有很多了解。(2)当某个模块出错时,对系统的其他部分影响小。 内聚性标志一个模块内部各元素彼此结合的紧密程度。理想情况下,一个内聚的模块只做一件事。在进行概要设计时,要尽量采取高内聚。内聚与耦合呈反比关系,模块内的内聚越高,模块间的耦合度就越低。在概要设计阶段,模块内聚更重要。只要做到各个模块的高内聚,模块间的耦合程度自然降低,模块的独立性也越高。下面举例分析 1) 耦合性 耦合性是对一个软件结构内部不同模块间联系紧密程度的度量指标。决定耦合性高低的主要因素 由于模块间的联系是通过模块接口实现的,因此,模块耦合性的高低主要取决于模块接口的复杂程度、调用模块的方式以及通过模块接口的数据。模块间的耦合性主要可划分为如下几种类型。 (1) 数据耦合。若两个模块之间仅通过模块参数交换信息,且交换的信息全部为简单数据,则称这种耦合为数据耦合。数据耦合的耦合性最低,通常软件中都包含有数据耦合。数据耦合的例子如下所示: sum(int a,int b) {int c; c=a+b; return(c); } main() {int x,y; printf("x+y= %d",sum(x,y)); }/*主函数与sum函数之间即为数据耦合关系*/ (2) 公共耦合。若两个或多个模块通过引用公共数据相互联系,则称这种耦合为公共耦合。例如,在程序中定义了全局变量,并在多个模块中对全局变量进

软件工程低耦合高内聚

基本解释 高内聚低耦合,是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否高,耦合度是否低。 高内聚 内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高。所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。 低耦合 耦合:一个软件结构内不同模块之间互连程度的度量(耦合性也叫块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。) 对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修改和组合。[1] 为什么要追求高内聚和低耦合 软件架构设计的目的简单说就是在保持软件内在联系的前提下,分解软件系统,降低软件系统开发的复杂性,而分解软件系统的基本方法无外乎分层和分割。但是在保持软件内在联系的前提下,如何分层分割系统,分层分割到什么样的粒度,并不是一件容易的事,这方面有各种各样的分解方法,比如:关注点分离,面向方面,面向对象,面向接口,面向服务,依赖注入,以及各种各样的设计原则等,而所有这些方法都基于高内聚,低耦合的原则。高内聚和低耦合是相互矛盾的,分解粒度越粗的系统耦合性越低,分解粒度越细的系统内聚性越高,过度低耦合的软件系统,软件模块内部不可能高内聚,而过度高内聚的软件模块之间必然是高度依赖的,因此如何兼顾高内聚和低耦合是软件架构师功力的体现。高内聚,低耦合的系统有什么好处呢?事实上,短期来看,并没有很明显的好处,甚至短期内会影响系统的开发进度,因为高内聚,低耦合的系统对开发设计人员提出了更高的要求。高内聚,低耦合的好处体现在系统持续发展的过程中,高内聚,低耦合的系统具有更好的重用性,维护性,扩展性,可以更高效的完成系统的维护开发,持续的支持业务的发展,而不会成为业务发展的障碍。[2]

软件工程中的耦合

简单地说,软件工程中对象之间的耦合度就是对象之间的依赖性。指导使用和维护对象的主要问题是对象之间的多重依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。有软硬件之间的耦合,还有软件各模块之间的耦合。耦合性是程序结构中各个模块之间相互关联的度量。它取决于各个模块之间的接口的复杂程度、调用模块的方式以及哪些信息通过接口。耦合可以分为以下几种,它们之间的耦合度由高到低排列如下: (1)内容耦合。当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过不正常入口而转入另一个模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用之。 (2)公共耦合。两个或两个以上的模块共同引用一个全局数据项,这种耦合被称为公共耦合。在具有大量公共耦合的结构中,确定究竟是哪个模块给全局变量赋了一个特定的值是十分困难的。 (3)外部耦合。一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。 (4)控制耦合。一个模块通过接口向另一个模块传递一个控制信号,接受信号的模块根据信号值而进行适当的动作,这种耦合被称为控制耦合。 (5)标记耦合。若一个模块A通过接口向两个模块B和C传递一个公共参数,那么称模块B和C之间存在一个标记耦合。 (6)数据耦合。模块之间通过参数来传递数据,那么被称为数据耦合。数据耦合和最低的一种耦合形式,系统中一般都存在这种类型的耦合,因为为了完成一些有意义的功能,往往需要将某些模块的输出数据作为另一些模块的输入数据。 (7)非直接耦合。两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的 总结:耦合是影响软件复杂程度和设计质量的一个重要因素,在设计上我们应采用以下原则:如果模块间必须存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,尽量避免使用内容耦合。 软件工程中的耦合: 简单地说,对象之间的耦合度就是对象之间的依赖性。指导使用和维护对象的主要问题是对象之间的多重依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。 就是依赖性,相关性吧!!! 有软硬件之间的耦合,还有软件各模块之间的耦合。 耦合性是程序结构中各个模块之间相互关联的度量.它取决于各个模块之间的接口的复杂程度、调用模块的方式以及哪些信息通过接口.一般模块之间可能的连接方式有七种,耦合性由低到高分别是:非直接耦

内聚性与耦合性

耦合性与内聚性 (2010-06-20 12:13:39) 转载 标签: 分类:概念文章 耦合性 内聚性 it 1) 耦合性 ?耦合性是对一个软件结构内部不同模块间联系紧密程度的度量指标。 ?决定耦合性高低的主要因素 由于模块间的联系是通过模块接口实现的,因此,模块耦合性的高低主要取决于模块接口的复杂程度、调用模块的方式以及通过模块接口的数据。模块间的耦合性主要可划分为如下几种类型。 (1) 数据耦合。若两个模块之间仅通过模块参数交换信息,且交换的信息全部为简单数据,则称这种耦合为数据耦合。数据耦合的耦合性最低,通常软件中都包含有数据耦合。数据耦合的例子如下所示: sum(int a,int b) {int c; c=a+b; return(c); } main()

{int x,y; printf("x+y= %d",sum(x,y)); } (2) 公共耦合。若两个或多个模块通过引用公共数据相互联系,则称这种耦合为公共耦合。例如,在程序中定义了全局变量,并在多个模块中对全局变量进行了引用,则引用全局变量的多个模块间就具有了公共耦合关系。 (3) 控制耦合。若模块之间交换的信息中包含有控制信息(尽管有时控制信息是以数据的形式出现的),则称这种耦合为控制耦合。控制耦合是中等程度的耦合,它会增加程序的复杂性。控制耦合的例子如下所示: void output(flag) {if (flag) printf("OK! "); else printf("NO! "); } main() { int flag; output(flag);

} (4) 内容耦合。若一个模块对另一模块中的内容(包括数据和程序段)进行了直接的引用甚至修改,或通过非正常入口进入到另一模块内部,或一个模块具有多个入口,或两个模块共享一部分代码,则称模块间的这种耦合为内容耦合。内容耦合是所有耦合关系中程度最高的,会使因模块间的联系过于紧密而对后期的开发和维护工作带来很大的麻烦。 2) 内聚性 内聚性是对一个模块内部各个组成元素之间相互结合的紧密程度的度量指标。模块中组成元素结合的越紧密,模块的内聚性就越高,模块的独立性也就越高。理想的内聚性要求模块的功能应明确、单一,即一个模块只做一件事情。模块的内聚性和耦合性是两个相互对立且又密切相关的概念。 经实践证明,保证模块的高内聚性比低耦合性更为重要,在软件设计时应将更多的注意力集中在提高模块的内聚性上。模块的内聚性主要可划分为如下几种不同的类型。 (1) 偶然内聚。若一个模块由多个完成不同任务的语句段组成,各语句段之间的联系十分松散或根本没有任何联系,则称此模块的内聚为偶然内聚。 (2) 逻辑内聚。这种模块是把几种功能组合在一起,每次调用时,则由传递给模块的判定参数来确定该模块应执行哪一种功能。

软件工程习题解答(含基本章节应试例子以及一个UML案例)

软件工程习题解答 一、软件生存周期各阶段的基本任务? 1. 问题定义: (1)回答要解决的问题是什么。 (2)系统分析员应该提出关于问题性质、工程目标和规模的书面报告。 (3)经过和用户讨论,澄清含糊不清的地方,改正理解不正确的地方,得出一份双方都满意的文档。 (4)问题定义是软件生命周期中最简短的阶段。 2.可行性研究: (1)前一阶段定义的问题有可行的解决办法吗? (2)系统分析员要进行一次大大压缩和简化了的系统分析和设计。导出高层逻辑模型(用数据流图表示)。确定工程规模和目标,准确估计系统的成本和效益。 (3)使用部门的负责人根据可行性研究的结果决定是否继续进行该工程的开发工作。 3.需求分析: (1)主要确定目标系统必须具备哪些功能。 (2)系统分析员和用户密切配合,充分交流,得出经用户确认的系统逻辑模型(数据流图、数据字典、算法描述)。 4.总体设计: (1)回答如何解决问题。 (2)系统分析员 应使用系统流程图或其他工具描述每种可能系统; 估计每种方案的成本和效益。 推荐一较好的系统──有其详细计划。 设计软件的结构(用层次图或结构图描述)。 5.详细设计: (1)回答应该怎样具体地实现这个系统。 (2)设计出程序的详细规格说明(用HIPO层次图加输入/处理/输出图)或PDL语言(过程设计语言)。 6.编码和单元测试: (1)写出正确的容易理解,容易维护的程序模块。 (2)程序员: 选取一种适当的用高级语言书写程序(或汇编语言)。 仔细测试编写出的每一个模块。 7.综合测试: (1)通过各种类型的测试,使软件达到预定的要求。 (2)最基本的测试是集成测试和验收测试方法。 集成测试是根据设计的软件结构,把经过单元测试检验的模块按某种选定的策略装配起来,在装配的过程中对程序进行必要的测试。 验收测试是按照需求规格说明书的规定,由用户对目标系统进行验收。 (3)用正式文档将测试计划、详细测试方案以及实际测试结果保存。 (4)以正式或非正式的方式对用户进行培训。 8.软件维护: (1)使系统持久地满足用户的需要。 (2)四类维护: 改正性维护:诊断和改正使用过程中发现的软件错误。

高内聚,低耦合

对高内聚,低耦合的理解 内聚:一个模块内各个元素彼此结合的紧密程度 耦合:一个软件结构内不同模块之间互连程度的度量(耦合性也叫块间联系。指软件系统结构中个模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。) 最近编码的时候,总是在犹豫是把某个方法封装在一个类里,还是单独的封装成一个类。这让我突然想起内聚耦合这两个名词。 我们一直追求着,高内聚,低耦合。 对于低耦合,粗浅的理解是: 一个完整的系统,模块与模块之间,尽可能的使其独立存在。 也就是说,让每个模块,尽可能的独立完成某个特定的子功能。 模块与模块之间的接口,尽量的少而简单。 如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。 这样有利于修改和组合。 对于低耦合,我粗浅的理解是: 在一个模块内,让每个元素之间都尽可能的紧密相连。 也就是充分利用每一个元素的功能,各施所能,以最终实现某个功能。 如果某个元素与该模块的关系比较疏松的话,可能该模块的结构还不够完善,或者是该元素是多余的。 内聚和耦合,包含了横向和纵向的关系。功能内聚和数据耦合,是我们需要达成的目标。横向的内聚和耦合,通常体现在系统的各个模块、类之间的关系,而纵向的耦合,体现在系统的各个层次之间的关系。 对于我在编码中的困惑,我是这样想的,用面向对象的思想去考虑一个类的封装。一个方法,如何封装,拿到现实生活中来看,看这种能力(方法)是否是属于这类事物(类)的本能。 如果是,就封装在这个类里。

如果不是,则考虑封装在其它类里。 如果这种能力,很多事物都具有,则一定要封装在这类事物的总类里。 如果这种能力,很多事物都会经常用到,则可以封装成一个总类的静态方法。 关于耦合内聚的概念 这些是软件工程中的知识,我上网查过,总结着几位大虾的评论,关于耦合的概念应该是这样的: 1,对象之间的耦合度就是对象之间的依赖性.指导使用和维护对象的主要问题是对象之间的多重依赖性.对象之间的耦合性越高.维护成本越高.因此对象的设计应使类和构件之间的耦合最小. 2,耦合性是程序结构中各个模块之间相互关联的度量.它取决于各个模块之间的接口的复杂程度,调用模块的方式一级哪些信息通过接口,一般模块之间可能的连接方式有七种,耦合性由低到高分别是:非直接耦合,数据耦合,标记耦合,控制耦合,外部耦合,公共耦合,内容耦合. 一个软件是由多个子程序组装而成,而一个程序由多个模块(方法)构成. 耦合是指各个外部程序(子程序)之间的关系紧密度 而内聚就是指程序内的各个模块之间的关系紧密度 所以说,为什么要高内聚,模块之间的关系越紧密,出错就越少!低耦合就是说,子程序之间的关系越复杂,就会产生出更多的意想不到的错误!会给以后的维护工作带来很多麻烦 一个优秀软件开发人员的必修课:高内聚 高内聚Java 软件工程软件模式 一个重要的模式:高内聚。 2. 高内聚(High Cohesion) 高内聚是另一个普遍用来评判软件设计质量的标准。内聚,更为专业的说法叫功能内聚,是对软件系统中元素职责相关性和集中度的度量。如果元素具有高度相关的职责,除了这些职责内的任务,没有其它过多的工作,那么该元素就具有高内聚性,反之则为低内聚性。高内聚要求软件系统中的各个元素具有较高的协作性,因为在我们在完成软件需求中的一个功能,可能需要做各种事情,但是具有高内聚性的一个元素,只完成它职责内的事情,而把那些不在它职责内的事情拿去请求别人来完成。这就好像,如果我是一个项目经理,我的职责是监控和协调我的项目各个阶段的工作。当我的项目进入需求分析阶段,我会请求需求分析员来完成;当我的项目进入开发阶段,我会请求软件开发人员来完成;当我的项目需要测试

软件工程-第二-六章习题

第二章练习题 一、判断题 1. 软件的模块数越少,其软件成本越低。错 2. 软件模块之间的耦合性越弱越好。对 3. 模块化,信息隐藏,抽象和逐步求精的软件设计原则有助于得到高内聚,低耦合度的软件产品。对 4. 耦合是指一个模块内各个元素彼此结合的紧密程度。错 5. 过大的模块可能是由于分解不充分造成的,即使降低模块独立性也必须继续分解。错 6. 在设计模块时,其宽度和深度要适当。对 7. 模块耦合的强弱取决于模块间接口的复杂程度。对 二、名字解释: 1. 抽象:抽象是认识复杂现象过程中使用的思维工具,即抽象出事物本质的共同特性而暂时不考虑其他的细节,不考虑其他因素。 2. 模块化:模块化是指解决一个复杂问题自顶向下逐层把软件系统划分成为若干模块的过程。每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个要求的功能。 3. 逐步求精: 4. 耦合:耦合也成模块叫联系,指软件系统结构中各模块间相互联系紧密程序的一种度量。 5. 内聚:内聚又称块联系。指模块功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量 6. 模块独立:模块独立想指每个模块只完成系统要求的独立的子功能,并且与其他模块联系最少且接口最简单。 7. 信息隐蔽:信息隐蔽在设计和确定模块时,使得一个模块内包含信息,对于不需要这些信息的其他模块来说事不能访问的。 三、选择题 10. 在面向对象的设计中,我们应遵循的设计准则除了模块化、抽象、低耦合、高内聚以外,还有( B)。B A. 隐藏复杂性 B. 信息隐蔽 C. 经常类的复用 D. 类的开发 20、为了提高模块的独立性,模块内部最好是( C )C A、逻辑内聚 B、时间内聚 C、功能内聚 D、通信内聚 33、从心理学角度看,一次大模块分解为多少个子模块为宜。(B )B A、3±1 B、7±2 C、15±1 D、18±2 38、软件设计启发规则不包括( C )C A、在耦合方式上降低模块间接口的复杂性 B、模块功能应该可以预测 C、将模块的控制域保持在其作用域内 D、设计单入口单出口的模块 40、为了提高模块的独立性,模块之间的联系最好的是(D)。D A、公共耦合 B、控制耦合 C、内容耦合 D、数据耦合 48、下列几种类型中,耦合性最弱的是( D )。D

相关文档
最新文档