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