耦合与内聚例子
高内聚低耦合通俗例子

高内聚低耦合通俗例子
1. 就像一个球队,前锋、中场、后卫都有自己明确的职责,这就是高内聚呀,他们相互配合得极好,但又不会过多干涉彼此的任务,这可不就是低耦合嘛!比如梅西在进攻时专注进球,而防守球员就安心做好防守,多清晰呀!
2. 想想你的房间,你的书桌区域是用来学习工作的,很有内聚性吧,而它和床的区域又分得很清楚,这就是低耦合啊。
你总不能在书桌上睡觉吧,这多简单易懂的例子呀!
3. 好比一场音乐会,乐队的每个成员各自演奏自己的部分,非常内聚,但是又不会影响别人,彼此之间就是低耦合呀。
就像鼓手专注打鼓,他可不会突然跑去弹钢琴,这不是很有趣吗?
4. 家里的厨房是专门做饭的地方,这就是高内聚,和客厅的功能区分得很清楚,它们之间的关系就是低耦合啦。
你能想象在厨房看电视吗,哈哈!
5. 一个公司的各个部门,研发部专注研发,销售部专注销售,这是高内聚呀,然而它们又相对独立,这就是低耦合的体现嘛。
就像研发部不会直接去跑业务一样,这不是很明显吗?
6. 我们的身体器官也是呀,心脏负责供血,非常内聚,跟肠胃的功能不一样,相互之间低耦合。
要是心脏突然去管消化了,那还不乱套了呀,对吧!
总之,高内聚低耦合在生活中到处都是,它们让一切变得更有序、更高效呀!。
什么是耦合、内聚

什么是耦合、内聚模块独⽴性: 指每个模块只完成系统要求的独⽴⼦功能,并且与其他模块的联系最少且接⼝简单。
两个定性的度量标准――耦合性和内聚性。
耦合性也称块间联系。
指软件系统结构中各模块间相互联系紧密程度的⼀种度量。
模块之间联系越紧密,其耦合性就越强,模块的独⽴性则越差。
模块间耦合⾼低取决于模块间接⼝的复杂性、调⽤的⽅式及传递的信息。
耦合性分类(低――⾼): ⽆直接耦合;数据耦合;标记耦合;控制耦合;公共耦合;内容耦合;1 ⽆直接耦合:2 数据耦合: 指两个模块之间有调⽤关系,传递的是简单的数据值,相当于⾼级语⾔的值传递;3 标记耦合: 指两个模块之间传递的是数据结构,如⾼级语⾔中的数组名、记录名、⽂件名等这些名字即标记,其实传递的是这个数据结构的地址;4 控制耦合: 指⼀个模块调⽤另⼀个模块时,传递的是控制变量(如开关、标志等),被调模块通过该控制变量的值有选择地执⾏块内某⼀功能;5 公共耦合: 指通过⼀个公共数据环境相互作⽤的那些模块间的耦合。
公共耦合的复杂程序随耦合模块的个数增加⽽增加。
6 内容耦合: 这是最⾼程度的耦合,也是最差的耦合。
当⼀个模块直接使⽤另⼀个模块的内部数据,或通过⾮正常⼊⼝⽽转⼊另⼀个模块内部。
所以,⼀般情况下耦合性越低,则应⽤程序开发更灵活更省⼒。
以web UI开发的松耦合为例: 很多设计模式就是为了解决紧耦合的问题。
如果两个组件耦合太紧,则说明⼀个组件和另⼀个组件直接相关,这样的话,如果修改⼀个组件的逻辑,那么另外⼀个组件的逻辑也需修改。
⽐如,假设有⼀个名为error的CSS类名,它是贯穿整个站点的,它被嵌⼊到HTML之中。
如果有⼀天你觉得error的取名并不合适,想将它改为warning,你不仅需要修改CSS还要修改⽤到这个className的HTML。
HTML和CSS 紧耦合在⼀起。
这只是⼀个简单的例⼦。
想象⼀下,如果⼀个系统包含上百个组件,那这简直就是⼀场噩梦。
高内聚低耦合法则实例解析

⾼内聚低耦合法则实例解析定义:⼀个对象应该对其他对象保持最少的了解。
问题由来:类与类之间的关系越来越密切,耦合度越来越⼤,当⼀个类发⽣改变时,对另外⼀个类的影响也越⼤.解决⽅案:尽量降低类与类之间的耦合.⾃从我们接触到编程开始,就知道了软件设计的总的原则,低耦合,⾼内聚,⽆论是⾯向对象或者⾯向过程,耦合度尽量低,才能提⾼代码的复⽤率。
但是编程怎么编程低耦合呢?⽆论逻辑怎么复杂,对于依赖的类来说,都尽量将逻辑封装在类的内部,对外除了提供的public⽅法,不对外泄露任何信息。
还有⼀个更加简单的定义:只与直接的朋友通信。
⾸先解释⼀下什么是直接的朋友;每个对象都会与其他对象发⽣耦合关系,我们就说这两个对象之间有耦合关系,我们就说这两个对象有朋友关系,耦合发⽣的⽅式有很多,依赖,关联,组合,聚合等等。
其中,我们称出现成员变量,⽅法参数,⽅法返回值的类称为直接的朋友,⽽出现在局部变量中的类为不是直接的朋友,也就是说,陌⽣的类最好不要作为局部变量的形式出现在类的内部;举⼀个例⼦,在⼀所学校,⾥⾯有⽼师若⼲名,依次编号。
下⾯有学⽣若⼲名,⼀次编号。
现在要求打印出所有的⽼师和学⽣的ID.先来违反低耦合⾼内聚原则代码如下。
package test1;import java.util.ArrayList;import java.util.List;class Teacher{privateString id;publicvoidsetId(String id){this.id=id;}publicString getId(){return id;}}class Student{private String id;public void setId(String id){this.id=id;}public String getId(){return id;}}class StudentManage{publicList<Student> getAllStudent(){List<Student> list=newArrayList<Student>();for (int i=0;i<100;i++){Student student=new Student();student.setId("学⽣学号是"+i);list.add(student);}return list;}}class TeacherManage{publicList<Teacher> getAllTeacher(){List<Teacher> list=newArrayList<Teacher>();for (inti=0;i<100;i++){Teacher teacher =new Teacher();teacher.setId("⽼师编号"+i);list.add(teacher);}return list;}public void printAllPerson(StudentManagestudentmanager){List<Student>list1=studentmanager.getAllStudent();for (Student s:list1){System.out.println(s.getId());}List<Teacher>list2=this.getAllTeacher();for (Teacher t:list2){System.out.println(t.getId());}}}public classClient {publicstaticvoidmain(String[] args) {TeacherManagetm=newTeacherManage();tm.printAllPerson(new StudentManage());}}现在这个设计的主要问题出现在TeacherManage类中,根据低耦合⾼内聚法则,只与直接的朋友进⾏通信,⽽Student类并不是TeacherManage类中的直接朋友,应避免类中出现这样⾮直接朋友关系的耦合。
内聚 耦合

1、低耦合就是模块之间的关联少,越独立耦合度越低高内聚就是模块的内容针对干的事情少,功能越单一内聚越高2、比如我们要面对20种ATM机、100种银行卡进行编程,我们是不是要编写2000种程序?不是的。
我们可能只需要将ATM机抽象为3个子类,银行卡抽象为3种子类,从而在高层次程序中只需要进行很专注的、独立的、看似简单的设计,但是各种子类通过很简单的扩展和重写代码立刻可以在这个成功设计的核心父类的控制下高效率地产出最终的系统。
3、比如一个家庭是一个模块内聚性就是你的家庭内部是否团结耦合性就是你跟你邻居家关系怎么样4、你到政府机关办事吧。
如果你要找的办事员A不在,你这章子就敲不了,事办不成(换别人还不行),这就是和A的耦合度高。
假设A敲章前需要办事员B敲章,敲章的功能就不内聚了。
如果A敲章就解决这个事情了,那这个敲章的功能就内聚了。
5、其实人就是一个很好的例子,人与人之间就是低耦合,通过几个固定的接口对外通讯,人体内部的各器官之间属于高内聚,相互关联。
而且还遵守单一职责的原则。
6、耦合就是多个主件共同来完成一个任务!高类聚,就是尽可能一个主件来完成一个任务!这样管理起来比较简单!比如A、B共同来完成任务1;A、C、D共同完成任务2,C、D、E共同完成任务3......依次类推,一个任务需要几个主件配合才能完成,也许有的主件还与其它主件配合完成另外的任务,这样问题的解决就会显得很复杂,主件管理起来也很麻烦,比如一个主件升级,其它相关主件都会受到影响,你得找到被影响的主件,同步进行升级!如果A解决任务1,B解决任务2,这样减少主件之间的配合,那就简单多了!也就是低耦合高内聚!7、简单点说:高内聚就是一个类封装的很完善,其他类等外部因素对其影响较小,低耦合就是类与类之间的关联和重合较小,彼此互相作用但独立性较好。
8、耦合就是类与类,功能模块与功能模块之间的关系复杂度,你软件里面的每个功能点都是相对来讲比较独立的,去掉这个功能点不影响整个系统的运行,再小一点,就是每个类能做什么事情,能为外界提供什么服务不依赖与其他类就能完成,这个是最理想的状态,内聚就指的是一个功能点的内部关系了。
内聚和耦合的举例

内聚和耦合的举例内聚类型:1.偶然内聚模块的各成分之间没有关联,只是把分散的功能合并在⼀起。
例:A模块中有三条语句(⼀条赋值,⼀条求和,⼀条传参),表⾯上看不出任何联系,但是B、C模块中都⽤到了这三条语句,于是将这三条语句合并成了模块A。
模块A中就是偶然内聚。
2.逻辑内聚逻辑上相关的功能被放在同⼀模块中。
例:A模块实现的是将对应的⼈员信息发送给技术部,⼈事部和财政部,决定发送给哪个部门是输⼊的控制标志决定的。
模块A中就是逻辑内聚。
3.时间内聚模块完成的功能必须在同⼀时间内执⾏,但这些功能只是因为时间因素才有关联。
例:编程开始时,程序员把对所有全局变量的初始化操作放在模块A中。
模块A中就是时间内聚。
4.过程内聚模块内部的处理成分是相关的,⽽且这些处理必须以特定的次序进⾏执⾏。
例:⽤户登陆了某某⽹站,A模块负责依次读取⽤户的⽤户名、邮箱和联系⽅式,这个次序是事先规定的,不能改变。
模块A中就是过程内聚。
5.通信内聚模块的所有成分都操作同⼀数据集或⽣成同⼀数据集。
例:模块A实现将传⼊的Date类型数据转换成String类型,以及将Date类型数据插⼊数据库,这两个操作都是对“Date类型数据”⽽⾔的。
模块A中就是通信内聚。
6.顺序内聚模块的各个成分和同⼀个功能密切相关,⽽且⼀个成分的输出作为另⼀个成分的输⼊。
例:模块A实现将传⼊的Date类型数据转换成String类型,然后再将转换好的String类型数据插⼊数据库。
模块A中就是顺序内聚。
7.功能内聚模块的所有成分对于完成单⼀的功能都是必须的。
例:模块A实现将新注册的⽤户信息(⽤户名,密码,个性签名)全部转换成String类型并插⼊数据库。
模块A中就是功能内聚。
耦合类型:1.内容耦合⼀个模块直接修改或操作另⼀个模块的数据,或者直接转⼊另⼀个模块。
例:模块A中定义了变量a,在模块B中直接使⽤了。
这种情况下模块A和模块B就是内容耦合。
2.公共耦合两个以上的模块共同引⽤⼀个全局数据项。
内聚和耦合的类型

内聚和耦合的类型
哎呀,说起这个内聚和耦合,就像咱们四川话里头说的“打伙儿”和“各耍各”的两种境界嘛,听起来高深,其实摆起龙门阵来,还是多接地
气的。
首先说哈“内聚”,这就好比咱们吃火锅,各种菜啊、肉啊,一股脑
儿地往锅里头下,但它们自个儿内部得有个讲究——蔬菜归蔬菜,荤菜归
荤菜,各自抱团儿,煮起来才不乱套,味道也纯粹。
这就是内聚,说的是
软件模块里头,各个部分紧紧围绕一个中心任务,自个儿内部紧密协作,
互不干扰,效率高得很,改起来也方便,就像咱们调火锅味儿,增减调料,不影响整体大局。
再来说说“耦合”,这就有点像邻里关系了。
要是你家做饭,油烟直
接飘到我家来,或者我洗衣服的水直接流到你家门口,这耦合就太强了,
大家都不得安逸。
在编程里头,耦合指的就是模块之间互相依赖的程度。
耦合高了,就像邻里矛盾多,一个模块改点啥,另一个模块也得跟着动,
维护起来麻烦得很。
咱们都希望代码之间“和和气气”,各自干好各自的
事儿,少些纠缠,这不就是低耦合的好处嘛。
所以啊,写代码就像是咱们四川人过日子,讲究的是“和谐共处”,
内聚要高,大家齐心协力把事儿办好;耦合要低,各管各的,互不添乱。
这样一来,代码既清爽又高效,改起来也轻松加愉快,就像咱们四川人吃
的火锅,味道巴适,心头也舒畅!
咋样,听我这么一摆,是不是觉得内聚和耦合也没那么玄乎了?就像咱们聊天一样,简单直接,还带点生活的乐趣在里面。
内聚耦合举例

内聚耦合举例内聚性举例以下是几个内聚性的例子,其中既有好的,也有坏的:功能内聚性例子。
比如计算雇员年龄并给出生日的子程序就是功能内聚性的,因为它只完成一项工作,而且完成得很好。
顺序内聚性的例子。
假设有一个按给出的生日计算雇员年龄、退休时间的子程序,如果它是利用所计算的年龄来确定雇员将要退休的时间,那么它就具有顺序内聚性。
而如果它是分别计算年龄和退休时间的,但使用相同生日数据,那它就只具有通讯内聚性。
确定程序存在哪种不良内聚性,还不如确定如何把它设计得更好重要。
怎样使这个子程序成为功能内聚性呢?可以分别建立两个子程序,一个根据生日计算年龄,另外一个根据生日确定退休时间,确定退休时间子程序将调用计算年龄的程序,这样,它们就都是功能内聚性的,而且,其它子程序也可以调用其中任一个子程序,或这两个部调用。
通讯内聚性的例子。
比如有一个打印总结报告,并在完成后重新初始化传进来的总结数据的子程序,这个子程序具有通信内聚性,因为这两个操作仅仅是由于它们使用了相同的数据才联系在一起。
同前例一样,我们考虑的重点还是如何把它变成是功能内聚性,总结数据应该在产生它的地方附近被重新初始化,而不应该在打印子程序中重新初始化。
把这个子程序分为两个独立的子程序.第一个打印报告,第二个则在产生或者改动数据的代码附近重新初始化数据。
然后,利用一个较高层次的子程序来代替原来具有通讯相关的子程序,这个子程序将调用前面两个分出来的子程序。
逻辑内聚性的例子。
一个子程序将打印季度开支报告、月份开支报告和日开支报告.具体打印哪一个,将由传入的控制标志决定,这个子程序具有逻辑内聚性,因为它的内部逻辑是由输进去的外部控制标志决定的。
内聚类型 耦合类型

内聚类型耦合类型内聚类型和耦合类型是软件工程中常用的两个概念,用来描述软件模块之间的关联程度和依赖程度。
内聚类型指的是一个模块内部各个元素之间的联系程度,而耦合类型则指的是一个模块与其他模块之间的依赖程度。
我们来讨论内聚类型。
内聚类型分为以下几种:功能内聚、顺序内聚、通信内聚、过程内聚和时间内聚。
功能内聚是指一个模块内部的元素彼此之间实现某个共同的功能,例如一个计算器模块内部的加法、减法、乘法和除法功能。
这些功能是相互关联的,彼此之间形成了一个整体。
顺序内聚是指一个模块内部的元素按照一定的顺序进行执行,例如一个数据处理模块内部的数据输入、处理和输出操作。
这些操作是按照一定的顺序进行的,彼此之间有明确的执行顺序。
通信内聚是指一个模块内部的元素之间通过参数传递或者共享变量进行通信,例如一个图像处理模块内部的像素处理操作。
这些操作需要通过参数传递或者共享变量来进行数据交换和通信。
过程内聚是指一个模块内部的元素按照某个过程或者算法进行操作,例如一个排序算法模块内部的元素按照某个排序算法进行排序操作。
这些操作是按照某个过程或者算法进行的,彼此之间有明确的操作规则。
时间内聚是指一个模块内部的元素在某个时间段内进行操作,例如一个定时任务模块内部的元素按照某个时间间隔进行定时操作。
这些操作是在某个时间段内进行的,彼此之间有明确的时间规定。
接下来,我们来讨论耦合类型。
耦合类型分为以下几种:无耦合、数据耦合、标记耦合、控制耦合和外部耦合。
无耦合是指一个模块与其他模块之间没有任何依赖关系,模块之间可以独立地进行开发和维护。
这种耦合类型是最理想的情况,可以提高软件的可维护性和可重用性。
数据耦合是指一个模块与其他模块之间通过共享数据进行依赖,模块之间通过数据的读取和写入来进行通信。
这种耦合类型存在一定的依赖关系,但是可以通过良好的数据封装和接口设计来降低耦合度。
标记耦合是指一个模块与其他模块之间通过标记变量进行依赖,模块之间通过标记变量的设置和检测来进行通信。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
耦合
(1)数据耦合。
若两个模块之间仅通过模块参数交换信息,且交换的信息全部为简单数据,则称这种耦合为数据耦合。
数据耦合的耦合性最低,通常软件中都包含有数据耦合。
数据耦合的例子:
/*
* 数据耦合
* 主函数main()和Multiply(int x, int y)之间为数据耦合关系
*/
#include <stdio.h>
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 <stdio.h>
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四个模块中都有这三条语句,为了节省空间才把它们作为一个模块放在一起。
这完全是偶然性的。
(2)逻辑内聚。
这种模块是把几种功能组合在一起,每次调用时,则由传递给模块的判定参数来确定该模块应执行哪一种功能。
逻辑内聚的例子:一个子程序将打印季度开支报告、月份开支报告和日开支报告.具体打印哪一个,将由传入的控制标志决定,这个子程序具有逻辑内聚性,因为它的内部逻辑是由输进去的外部控制标志决定的。
(3)时间内聚。
若一个模块包含了需要在同一时间段中执行的多个任务,则称该模块的内聚为时间内聚。
时间内聚的例子:将多个变量的初始化放在同一个模块中实现,或将需要同时使用的多个库文件的打开操作放在同一个模块中,都会产生时间内聚的模块。
(4)过程内聚。
若一个模块中的各个部分相关,并且必须按特定的次序执行,则称该模块的内聚为过程内聚。
过程内聚的例子:假设有一个子程序,它产生读取雇员的名字,然后是地址,最后是它的电话号码。
这种顺序之所以重要,仅仅是因为它符合用户的要求,用户希望按这种顺序进行屏幕输入。
另外一个子程序将读取关于雇员的其它信息。
这个子程序是过程内聚性,因为是由一个特定顺序而不是其它任何原因,把这些操作组合在一起的。
(5)通信内聚。
若一个模块中的各个部分使用同一个输入数据或产生同一个输出数据,则称该模块的内聚为通信内聚。
通信内聚的例子:比如有一个打印总结报告,并在完成后重新初始化传进来的总结数据的子程序,这个子程序具有通信内聚性,因为这两个操作仅仅是由于它们使用了相同的数据才联系在一起。
(6)顺序内聚。
若一个模块中的各个部分都与同一个功能密切相关,并且必须按照先后顺序执行(通常前一个部分的输出数据就是后一个部分的输入数据),则称该模块的内聚为顺序内聚。
顺序内聚的例子:假设有一个按给出的生日计算雇员年龄、退休时间的子程序,如果它是利用所计算的年龄来确定雇员将要退休的时间,那么它就具有顺序内聚性。
而如果它是分别计算年龄和退休时间的,但使用相同生日数据,那它就只具有通讯内聚性。
/*
* 顺序内聚
* 根据出生年份得出年龄,根据年龄得到退休时间
*/
#include <stdio.h>
#include <time.h>
void GetRetireYear()
{
// 得出年龄
int BirthYear = 0;
int Age = 0;
printf("%s", "请输入出生年份:");
scanf("%d", &BirthYear);
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
Age = timeinfo ->tm_year + 1900 - BirthYear;
//printf("您的年龄是:%d岁\n", Age);
// 得出退休时间
int RetireYear = 0;
RetireYear = timeinfo ->tm_year + 1900 + 60 - Age;
printf("您的退休时间是:%d年\n", RetireYear);
}
void main ()
{
GetRetireYear();
}
(7)功能内聚。
若一个模块中各个组成部分构成一个整体并共同完成一个单一的功能,则称该模块的内聚为功能内聚。
功能内聚例子:比如计算雇员年龄并给出生日的子程序就是功能内聚性的。
/*
* 功能内聚性例子
* 根据出生年份得出年龄
*/
#include <stdio.h>
#include <time.h> void GetAge()
{
int BirthYear = 0;
int Age = 0;
printf("%s", "请输入出生年份:");
scanf("%d", &BirthYear);
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
Age = timeinfo ->tm_year + 1900 - BirthYear;
printf("您的年龄是:%d岁\n", Age);
}
void main ()
{
GetAge();
}
Welcome 欢迎您的下载,资料仅供参考!。