耦合与内聚例子
- 格式:doc
- 大小:28.04 KB
- 文档页数:6
高内聚低耦合通俗例子
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.公共耦合两个以上的模块共同引⽤⼀个全局数据项。
内聚和耦合的类型
哎呀,说起这个内聚和耦合,就像咱们四川话里头说的“打伙儿”和“各耍各”的两种境界嘛,听起来高深,其实摆起龙门阵来,还是多接地
气的。
首先说哈“内聚”,这就好比咱们吃火锅,各种菜啊、肉啊,一股脑
儿地往锅里头下,但它们自个儿内部得有个讲究——蔬菜归蔬菜,荤菜归
荤菜,各自抱团儿,煮起来才不乱套,味道也纯粹。
这就是内聚,说的是
软件模块里头,各个部分紧紧围绕一个中心任务,自个儿内部紧密协作,
互不干扰,效率高得很,改起来也方便,就像咱们调火锅味儿,增减调料,不影响整体大局。
再来说说“耦合”,这就有点像邻里关系了。
要是你家做饭,油烟直
接飘到我家来,或者我洗衣服的水直接流到你家门口,这耦合就太强了,
大家都不得安逸。
在编程里头,耦合指的就是模块之间互相依赖的程度。
耦合高了,就像邻里矛盾多,一个模块改点啥,另一个模块也得跟着动,
维护起来麻烦得很。
咱们都希望代码之间“和和气气”,各自干好各自的
事儿,少些纠缠,这不就是低耦合的好处嘛。
所以啊,写代码就像是咱们四川人过日子,讲究的是“和谐共处”,
内聚要高,大家齐心协力把事儿办好;耦合要低,各管各的,互不添乱。
这样一来,代码既清爽又高效,改起来也轻松加愉快,就像咱们四川人吃
的火锅,味道巴适,心头也舒畅!
咋样,听我这么一摆,是不是觉得内聚和耦合也没那么玄乎了?就像咱们聊天一样,简单直接,还带点生活的乐趣在里面。
内聚耦合举例内聚性举例以下是几个内聚性的例子,其中既有好的,也有坏的:功能内聚性例子。
比如计算雇员年龄并给出生日的子程序就是功能内聚性的,因为它只完成一项工作,而且完成得很好。
顺序内聚性的例子。
假设有一个按给出的生日计算雇员年龄、退休时间的子程序,如果它是利用所计算的年龄来确定雇员将要退休的时间,那么它就具有顺序内聚性。
而如果它是分别计算年龄和退休时间的,但使用相同生日数据,那它就只具有通讯内聚性。
确定程序存在哪种不良内聚性,还不如确定如何把它设计得更好重要。
怎样使这个子程序成为功能内聚性呢?可以分别建立两个子程序,一个根据生日计算年龄,另外一个根据生日确定退休时间,确定退休时间子程序将调用计算年龄的程序,这样,它们就都是功能内聚性的,而且,其它子程序也可以调用其中任一个子程序,或这两个部调用。
通讯内聚性的例子。
比如有一个打印总结报告,并在完成后重新初始化传进来的总结数据的子程序,这个子程序具有通信内聚性,因为这两个操作仅仅是由于它们使用了相同的数据才联系在一起。
同前例一样,我们考虑的重点还是如何把它变成是功能内聚性,总结数据应该在产生它的地方附近被重新初始化,而不应该在打印子程序中重新初始化。
把这个子程序分为两个独立的子程序.第一个打印报告,第二个则在产生或者改动数据的代码附近重新初始化数据。
然后,利用一个较高层次的子程序来代替原来具有通讯相关的子程序,这个子程序将调用前面两个分出来的子程序。
逻辑内聚性的例子。
一个子程序将打印季度开支报告、月份开支报告和日开支报告.具体打印哪一个,将由传入的控制标志决定,这个子程序具有逻辑内聚性,因为它的内部逻辑是由输进去的外部控制标志决定的。
内聚类型耦合类型内聚类型和耦合类型是软件工程中常用的两个概念,用来描述软件模块之间的关联程度和依赖程度。
内聚类型指的是一个模块内部各个元素之间的联系程度,而耦合类型则指的是一个模块与其他模块之间的依赖程度。
我们来讨论内聚类型。
内聚类型分为以下几种:功能内聚、顺序内聚、通信内聚、过程内聚和时间内聚。
功能内聚是指一个模块内部的元素彼此之间实现某个共同的功能,例如一个计算器模块内部的加法、减法、乘法和除法功能。
这些功能是相互关联的,彼此之间形成了一个整体。
顺序内聚是指一个模块内部的元素按照一定的顺序进行执行,例如一个数据处理模块内部的数据输入、处理和输出操作。
这些操作是按照一定的顺序进行的,彼此之间有明确的执行顺序。
通信内聚是指一个模块内部的元素之间通过参数传递或者共享变量进行通信,例如一个图像处理模块内部的像素处理操作。
这些操作需要通过参数传递或者共享变量来进行数据交换和通信。
过程内聚是指一个模块内部的元素按照某个过程或者算法进行操作,例如一个排序算法模块内部的元素按照某个排序算法进行排序操作。
这些操作是按照某个过程或者算法进行的,彼此之间有明确的操作规则。
时间内聚是指一个模块内部的元素在某个时间段内进行操作,例如一个定时任务模块内部的元素按照某个时间间隔进行定时操作。
这些操作是在某个时间段内进行的,彼此之间有明确的时间规定。
接下来,我们来讨论耦合类型。
耦合类型分为以下几种:无耦合、数据耦合、标记耦合、控制耦合和外部耦合。
无耦合是指一个模块与其他模块之间没有任何依赖关系,模块之间可以独立地进行开发和维护。
这种耦合类型是最理想的情况,可以提高软件的可维护性和可重用性。
数据耦合是指一个模块与其他模块之间通过共享数据进行依赖,模块之间通过数据的读取和写入来进行通信。
这种耦合类型存在一定的依赖关系,但是可以通过良好的数据封装和接口设计来降低耦合度。
标记耦合是指一个模块与其他模块之间通过标记变量进行依赖,模块之间通过标记变量的设置和检测来进行通信。
举例说明高耦合低内聚的例子《聊聊高耦合低内聚这“玩意儿”》嘿,大家好呀!今天咱来唠唠高耦合低内聚这个听着就有点玄乎的话题。
想象一下哈,有个古老的村庄叫“代码村”,村里有各种不同的房子,这些房子就相当于程序里的模块或函数啥的。
高耦合呢,就像是村里有些房子之间牵牵扯扯的“关系网”特别乱。
比如说,老张家和老李家房子建得太近了,老张家用个电要从老李家扯根线过来,要是老李家哪天停电了,老张家也跟着黑灯瞎火。
而且老张想改改自家的电路布置,还得小心翼翼的,生怕把老李家的也弄出啥毛病。
这就好比程序里一个模块的小改动,牵扯出一堆莫名其妙的问题,因为和别的模块联系太紧密啦!再来说说低内聚,这就像老王家的房子里,啥都有,卧室、厨房、猪圈都搅和在一起。
本来卧室应该安静睡觉的地方,结果旁边就是杀猪的动静,那能好受嘛!在程序里也是这样,一个函数或者模块里,又是处理这个,又是处理那个,混乱得很,没有清晰的职责划分。
举个实际点的例子吧。
假如我们有个程序是用来管理学校的,有个模块本来应该只专心管学生成绩的,但它还兼着管学生考勤、课外活动啥的。
这就是低内聚啦,一个模块干了太多不相关的事儿。
然后这个成绩模块又和无数其他模块有着乱七八糟的联系,改个成绩相关的代码,可能会导致考勤模块出问题,这就是高耦合。
高耦合低内聚的程序就像一个病恹恹的人,稍微动一下就这里疼那里不舒服的。
维护起来可头疼了,开发者就像在一团乱麻里找线头,越找越心烦。
相反,低耦合高内聚就好得多啦!每个模块就像村里的一个个独立小院,各自安好,自己管自己那摊子事儿。
需要合作的时候,通过明明白白的接口来交流,不会有那些乱七八糟、牵一发而动全身的麻烦事儿。
所以啊,我们写代码的时候,可得长点心,尽量把程序整成那种低耦合高内聚的样子。
让每个部分都干干净净、清清爽爽的,这样我们开发和维护起来才能更轻松、更愉快呀!好啦,希望我这接地气的解释能让大家对高耦合低内聚有更深刻的认识和感受。
咱们和代码好好相处,别让它成为咱们的头疼事儿哈!。
低耦合高内聚各例子【篇一:低耦合,高内聚各例子】引用8楼sp1234的回复:接口,再设计上跟类型是同样的东西,就是类型。
在设计上并不纠结什么.net编程术语,而是各种oo语言都公认的基本术语。
所以“写接口、写父类、写抽象类”,以及一大堆其它说法(比如说.net根本不支持的多重继承技术),都是一样的东西——可以用来降低耦合、保证高内聚地封装。
比如说你开发一个通用的atm程序,面对5种大类、25种小类,假设有500种不同的银行卡处理流程,你要写500个程序吗?不是的。
你首先写了一个atm流程父类,然后5种大类的差别在子类中重写,然后25种小类与其大类的差别又分别在小类中进行重写,然后每一种银行卡的一点点差别又分别在每一个银行卡类中进行重写。
假设有1000个人跟这500种银行卡发生关系,是要考虑50万种情况吗?不是的。
因为atm只有一种——所有的银行卡都是它的子类,因此具体的银行卡流程是通过父类给外界打交道的。
分层扩展,继承和多态,就是保证搞内聚低耦合的一种设计手段。
如果仅仅纠结“搞内聚、低耦合”的名词儿概念,实际上是文不对题的。
只有理解了你说的“大型项目、要设计接口”的本质,才能真正把概念之间的联系说清楚!!引用9楼sp1234的回复:你的同学显然是学习了工程概念,而你只是道听途说某个词儿跟某个词儿“相关”然后喜欢拿出来说一说。
这次就可以超越标题党而理解一些“接口、继承、抽象”的实质。
实际上这是很简单的道理。
但是要知道,许多道理被一些莫名其妙的“概念解释”给污染了。
当一个人研究know-how的时候,如果他满脑子只有know-what,他就容易变成一个标题党。
所以技术并没有什么事非,完全是根据不同的场景进行深入细致的“理解”。
不能永远都是背字典、扣字眼。
而是要对所有的概念,都能根据当时的研究的场景,深入到不同的细节。
学习【篇二:低耦合,高内聚各例子】“低耦合”这个词相信大家已经耳熟能详,我们在看spring的书籍、mvc的数据、设计模式的书籍,无处不提到“低耦合、高内聚”,它已经成为软件设计质量的标准之一。
内聚和耦合的概念嗨,朋友!今天咱们来聊聊编程里超级重要的两个概念——内聚和耦合。
这俩概念就像是建筑里的砖头和水泥,要是没整明白,那盖出来的房子可就不结实,或者干脆就成了烂尾楼啦。
我先来说说内聚吧。
你可以把内聚想象成一个团队里的成员关系。
比如说,有个小组专门负责设计手机APP的界面。
这个小组里的成员呢,有擅长画图标、设计布局的美工,有专门研究用户交互体验的专家,还有负责把这些设计转化成代码的程序员。
他们都紧紧围绕着APP界面设计这个核心任务在工作,这就是高内聚。
每个成员的工作都和APP界面设计这个大目标紧密相关,就像一群蚂蚁齐心协力搬运一块大饼干,没有一个蚂蚁是在瞎忙或者干着和搬饼干完全不相关的事儿。
我有个朋友小李,他之前在一个项目组里。
那个项目组要做一个电商网站,其中有个小团队负责商品展示页面。
这个团队里有个哥们儿,本来应该是优化商品图片展示效果的,可他老是跑去捣鼓网站的用户注册流程。
这就好比是在一个足球队里,守门员不好好守着球门,跑去中场抢球去了,这就是低内聚的表现啊!这样不仅会让商品展示页面的工作进展缓慢,还可能会把整个电商网站的项目进度都给拖慢了。
你说这多让人头疼啊!再来说说耦合。
耦合呢,就像是不同家庭之间的联系。
有些家庭啊,互相之间几乎没什么往来,各自过着自己的小日子,这就好比是低耦合。
在编程里,低耦合就是说不同的模块或者组件之间联系很少,一个模块的变化不太会影响到其他模块。
比如说,一个软件里有用户登录模块和订单管理模块。
这两个模块如果设计得好,用户登录模块改了密码验证的方式,订单管理模块该咋工作还咋工作,不受影响,这就是低耦合的好处。
我给你举个反面例子啊。
我之前见过一个小软件,它的搜索功能和数据存储功能耦合得特别厉害。
搜索功能就像是一个小侦探,要在数据存储这个大仓库里找东西。
可是呢,这俩部分的代码写得乱七八糟,搜索功能里好多地方直接调用了数据存储功能里特别底层的代码。
结果呢,数据存储功能一旦有点小改动,比如说换了一种数据存储的格式,那搜索功能就彻底瘫痪了,就像多米诺骨牌一样,一个倒了全倒了。
高内聚和低耦合的概念咱来说说高内聚和低耦合这俩概念哈,这可真是挺重要的呢!你想想看,就好比一个球队,高内聚呢,就是球队里的每个球员都有自己明确的位置和职责,大家都在自己的岗位上干得特别出色,为了球队的胜利共同努力。
就像前锋负责进攻得分,后卫负责防守,守门员守好球门,各自把自己那块儿干得杠杠的,这就是高内聚。
大家心往一处想,劲往一处使,凝聚力超强!那低耦合呢,就好比球队和其他球队的关系。
每个球队都有自己独立的运作和管理,不会过度依赖别的球队。
虽然会有比赛交流啥的,但不会说离开别的球队就玩不转了。
这就是低耦合呀,相互之间有联系,但又不会紧密到失去自我。
咱再打个比方,一个家庭也可以体现高内聚和低耦合呢。
家里的每个人都为了家庭的幸福努力,爸爸努力工作赚钱,妈妈照顾好家里的生活,孩子好好学习,这就是高内聚。
但同时呢,每个人也都有自己的生活和朋友圈子,不会完全依附于家庭,这就是低耦合。
这样的家庭才和谐稳定又充满活力呀,是不是?你再看看那些大公司,各个部门之间也得高内聚呀,研发部门专注研发,销售部门全力卖货,这样公司才能发展得好。
部门之间也得保持低耦合,不能说研发部门啥都管,销售部门也啥都掺和,那样不就乱套了嘛。
高内聚和低耦合这俩家伙,真的就像一对好兄弟,相辅相成。
只有高内聚了,才能发挥出最大的力量;只有低耦合了,才能保持灵活和独立。
你说要是一个团队里大家都不知道自己该干啥,那不乱成一锅粥了嘛!而且要是和其他团队或者部门黏糊得太紧,那也不行呀,自己的特色和优势都没了。
你想想,如果一个系统或者组织没有高内聚,那不是一盘散沙吗?干啥都没效率,没成果。
而没有低耦合呢,就会变得僵化,没有活力,不能适应变化。
咱过日子不也得这样嘛,自己的小家要经营好,和别人家也得处好关系,但又不能失去自我。
这高内聚和低耦合,可不就是生活的智慧嘛!所以呀,咱得好好理解这俩概念,把它用到生活和工作中去,让咱的日子过得越来越好,咱的事业越来越成功。
耦合和内聚的种类耦合和内聚是软件工程中两个重要的概念,它们主要用于描述模块之间的关系。
耦合指的是模块之间的依赖关系,而内聚则指的是模块内部的功能相关性。
在软件设计中,好的耦合和内聚可以提高代码的可维护性和可复用性。
一、耦合的种类1. 数据耦合数据耦合是指一个模块通过共享数据来与其他模块进行通信。
这种耦合方式会增加模块之间的依赖性,降低模块的独立性。
当一个模块的数据发生改变时,其他依赖于该数据的模块也需要进行相应的修改。
数据耦合会增加代码的复杂性,降低代码的可维护性。
2. 控制耦合控制耦合是指一个模块通过控制流程来与其他模块进行通信。
这种耦合方式通常通过调用其他模块的函数或方法来实现。
控制耦合会增加模块之间的依赖性,使得代码难以理解和修改。
当一个模块的流程发生改变时,其他依赖于该模块的模块也需要进行相应的调整。
3. 外部耦合外部耦合是指一个模块依赖于外部环境的接口或输入。
这种耦合方式会使得模块的行为受到外部环境的影响,增加了代码的不确定性。
外部耦合会导致代码的可测试性下降,使得模块难以独立进行单元测试。
二、内聚的种类1. 功能内聚功能内聚是指一个模块内部的所有功能都与同一个目标相关。
这种内聚方式将相关的功能组织在一起,使得模块的结构清晰,易于理解和维护。
功能内聚可以提高代码的可读性和可维护性,使得代码更易于重用。
2. 过程内聚过程内聚是指一个模块内部的功能按照执行顺序相关联。
这种内聚方式会使得模块的逻辑流程清晰,易于理解和调试。
过程内聚可以提高代码的可读性和可测试性,使得代码更易于调整和优化。
3. 通信内聚通信内聚是指一个模块内部的功能通过共享数据进行通信。
这种内聚方式将相关的功能组织在一起,使得模块的结构清晰,易于理解和维护。
通信内聚可以提高代码的可读性和可维护性,使得代码更易于重用。
4. 顺序内聚顺序内聚是指一个模块内部的功能按照执行顺序相关联。
这种内聚方式会使得模块的逻辑流程清晰,易于理解和调试。
使⽤C语⾔实例描述程序中的内聚和耦合问题编程时,我们讲究的是⾼内聚低耦合,在协同开发、代码移植、维护等环节都起到很重要的作⽤。
⼀、原理篇⽽低耦合,是指模块之间尽可能的使其独⽴存在,模块之间不产⽣联系不可能,但模块与模块之间的接⼝应该尽量少⽽简单。
这样,⾼内聚从整个程序中每⼀个模块的内部特征⾓度,低耦合从程序中各个模块之间的关联关系⾓度,对我们的设计提出了要求。
程序设计和软件⼯程发展过程中产⽣的很多技术、设计原则,都可以从内聚和耦合的⾓度进⾏解读。
作为C语⾔程序设计的初学者,结合当前对于函数的理解可达到的程度,我们探讨⼀下如何做到⾼内聚低耦合。
针对低耦合。
耦合程度最低的是⾮直接耦合,指两个函数之间的联系完全是通过共同的调⽤函数的控制和调⽤来实现的,耦合度最弱,函数的独⽴性最强。
但⼀组函数之间没有数据传递显然不现实,次之追求数据耦合,调⽤函数和被调⽤函数之间只传递简单的数据参数,例如采⽤值传递⽅式的函数。
有些函数数在调⽤时,利⽤形式参数传地址的⽅式,在函数体内通过指针可以修改其指向的作⽤域以外的存储单元,这构成了更强的耦合,称为特征耦合,在这⾥,使函数之间产⽣联系的是地址这样的特征标识。
另外,有两个函数可能会打开同⼀个⽂件进⾏操作,这也构成了特征耦合的⼀种形式。
更强的耦合是外部耦合,这⾥,⼀组模块都访问同⼀全局变量,⽽且不通过参数表传递该全局变量的信息,当发现程序执⾏结果异常时,很难定位到是在哪个函数中出了差错。
不少初学者觉得参数传递⿇烦,将要处理的数据尽可能地定义为全局变量,这样,函数之间的接⼝简单了,但形成的是耦合性很强的结构。
在C语⾔中,还可以通过静态局部变量,在同⼀个程序的两次调⽤之间共享数据,这也可以视为是⼀种外部耦合,只不过静态局部变量的作⽤域限于函数内部,其影响也只在函数内部,耦合程度⽐使全局变量也还是弱很多。
由此,我们可以理解前述在使⽤全局变量、静态局部变量时提出的“⽤在合适的时候,不滥⽤”的原则。
低耦合高内聚例子
1. 你看那钟表,里面的各个零件各自做好自己的事情,这就是高内聚呀,保证了钟表精准走时,而不同零件之间又相对独立不互相干扰,这就是低耦合呀!就像一个团队,每个人都专注自己的职责,同时又和其他人配合默契但不纠缠不清,这多棒啊!
2. 想想我们的身体,身体的各个器官有条不紊地工作,心脏负责供血,肺负责呼吸,它们是高内聚呢,而器官之间又不会过度干涉,这就是低耦合啦!这不就是一个完美运行的系统嘛!
3. 手机里的各种功能模块,比如相机模块只专心做好拍照这个事,是高内聚嘛,它和其他模块虽然协同工作但又不互相阻碍,这就是低耦合呀!这就好像你和你的好朋友,各自有着自己的闪光点,在一起又很合拍。
4. 厨房里的各种厨具,锅就好好负责炒菜,铲子就负责翻炒,这就是高内聚呀!它们之间又不会乱套,就是低耦合喽!是不是很好理解?
5. 一个乐队也是这样呀,鼓手就专注打鼓,吉他手就弹好吉他,这属于高内聚呀,他们之间配合默契但不会互相捣乱,这不就是低耦合嘛!哇,这配合多厉害。
6. 学校里的各个班级,每个班级都努力把自己班级的事情做好,这就是高内聚啊!班级之间也相对独立,这就是低耦合喽!这多像一个个小团体在共同进步。
7. 蜂巢里的蜜蜂们,每只蜜蜂都有自己的任务,采蜜的采蜜,筑巢的筑巢,是高内聚嘛,它们之间又不会混乱,可不就是低耦合嘛!真的很神奇呀!
8. 社区里的不同功能区域,像休闲区就负责让人放松,商业区就负责各种买卖,它们是高内聚啦,同时也不会互相干扰,这就是低耦合嘛!这就像是一个和谐的小社会一样呢!
我觉得低耦合高内聚真的很重要呀,能让一切都有条不紊地进行,就像生活中的很多美好事物一样,相互独立又完美配合!。
耦合(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)公共耦合。
内聚和耦合内聚和耦合是软件工程中重要的概念,这对软件系统的设计、开发、维护和更新起着重要的作用。
这两个概念可以通过一些实例得到更清晰的理解。
内聚内聚是指了解某种类型的软件系统,它是指同一软件系统中的组件之间联系紧密的一种特性。
这种紧密联系使得软件系统内部模块之间的保密性得到保护,即,模块之间彼此独立,不会被外部系统干扰。
这样,无论是系统设计者还是系统开发者都可以更加方便地管理系统,避免不必要的成本。
同时,系统的可测试性也得到提升。
一个典型的内聚系统通常包括了一系列的模块,它们彼此之间有紧密的联系。
比如,一个学生信息管理系统就包括了学生信息模块、成绩模块和课程模块等等,它们彼此之间有着紧密的联系,这样,在以后的维护和开发中,系统设计者和开发者就可以更容易地进行系统管理。
耦合耦合是指软件系统中不同组件之间的联系,它是指软件系统中各个组件之间可以相互影响,可以通过一定数量的参数和数据交互来实现结果。
耦合可以分为无耦合和有耦合两种,无耦合是指系统组件之间独立同时可以实现预期功能的情况,而有耦合则指系统组件之间存在着有意义的联系,而且必须合作才能实现业务功能。
耦合可以帮助软件系统实现高度整合,使得系统组件之间可以更加紧密地联系,而且可以在更短的时间内实现更多的业务功能。
比如,一个电子商务系统,它可以实现多个联系,如商品模块、销售模块、财务模块等,他们之间的联系使得用户可以在更短的时间内完成购物程序,同时也为管理者提供了更加灵活的操作性。
总结内聚和耦合是软件系统中重要的概念,它们影响着软件系统的设计、开发、维护和更新,也可以帮助提升系统的可测试性和可扩展性。
内聚是指了解某种类型的软件系统,它使得软件系统内部模块之间变得更加紧密,可以很好地保护模块之间的保密性,并提高系统的可测试性。
耦合是指软件系统中不同组件之间的联系,它可以帮助软件系统实现高度整合,使得系统组件之间可以更加紧密地联系,而且可以在更短的时间内实现更多的业务功能。
耦合
(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 欢迎您的下载,资料仅供参考!。