内聚与耦合

我们常说,为系统划分模块时,要做到高内聚、低耦合。那么什么是内聚,怎样才算高。什么是耦合,怎

样才算低呢。

内聚定义:

度量一个模块内部各个元素彼此结合的紧密程度。

内聚类别(内聚性由低到高排列)

  1. 偶然内聚:指一个模块内的各处理元素之间没有任何联系。
    (类似于把一推不相关的代码都组合在一个类里)

  2. 逻辑内聚:指模块内执行若干个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。
    (类似于完成加法运算,有多个加法运算代码块,分别处理参数为int或float或double等。这些代码块之所以聚在一起,只是它们都是为了完成加法运算而已)

  3. 时间内聚:指把需要同时执行的动作组合在一起形成的模块。
    (类似于利用抽象工厂模式生成一碗粥,你可以先放水,也可以先放米,这两个动作之间没有必然的顺序,但为了生成一碗粥,需要同时执行这两个动作)

  4. 过程内聚:指一个模块完成多个任务,这些任务必须按照指定的过程执行。
    (类似于利用原生JDBC操纵数据库。你需要先连接JDBC获得connection对象,然后才能创建Statement对象,最后才能执行sql语句)

  5. 通信内聚:指模块内的所有处理元素都在同一个数据结构上操作,或者各处理使用相同的输入数据或者产生相同的输出数据。
    (类似于有一个数组,你只把它作为你遍历数组,增加数组节点,删除数组节点的参数)

  6. 顺序内聚:指一个模块中的各个处理元素都密切相关于同一功能且必须顺序执行,前一功能元素的输出就是下一功能元素的输入。
    (类似于程序模拟车间生产的某条流水线)

  7. 功能内聚:指模块内的所有元素共同作用完成一个功能,缺一不可。
    (类似于某排序算法的代码,不能缺少任意一行代码,否则整个排序功能失效)

也就是说,模块功能越单一,内聚性就越高,模块的独立性就越强。一个模块应该做好一个功能就可以了,不要面面俱到,不然难以维护。

需要说明的一点是,不同程度的内聚之间并非是线性关系的。上面的所有内聚类型中,偶然内聚和逻辑内聚是非常糟糕的内聚,而其它内聚都不错。只不过在不错之中,它们又能分出个高下。

耦合定义:

度量模块之间互相连接的紧密程度。

耦合类别:(耦合性由低到高排列)

  1. 无直接耦合:指两个模块之间没有直接的关系,它们分别从属于不同模块的控制与调用,它们之间不传递任何消息。
  2. 数据耦合:指两个模块之间有调用关系,传递的是简单的数据值。
    (类似于高级语言中的值传递)
  3. 标记耦合:指两个模块之间传递的是数据结构。
    (类似于高级语言中的引用传递)
  4. 控制耦合:指一个模块调用另一个模块时,传递的是控制变量,被调用模块通过该控制变量的值有选择地执行模块内的某一功能。因此,被调用模块应具有多个功能,哪个功能起作用受调用模块控制。
    (类似于计算工资模块,调用它的模块先区别是普通员工还是经理,进而生成控制变量,传递给计算工资模块进而选择其中一种计算功能)
  5. 外部耦合:模块间通过软件之外的环境联结。
    (如I/O将模块耦合到特定的设备、格式、通信协议上)
  6. 公共耦合:指通过一个公共数据环境相互作用的那些模块间的耦合。
    (例如某一模块把用户放到http session后,另外一些模块需要从http session取用户,那么它们之间就形成了公共耦合。如果必须存在公共耦合,应限制公共耦合的范围)
  7. 内容耦合:当一个模块直接使用另一个模块的内部数据,或通过非正常入口转入另一个模块内部时。
    (类似于Java中不通过方法操作另一个类的数据,而是直接以类似于People.foot那样访问。)

也就是说,模块之间联系少,耦合性就越低,模块之间的相对独立性就越强。模块应该管理好自己的事情就可以了,这样即不会太复杂,也便于专注的完成自己的事情。微服务的思想也是这样。

对于耦合,如果模块间必须存在耦合,应尽量使用数据耦合,少用控制耦合,限制使用公共耦合的范围,坚决避免使用内容耦合

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值