•前言

  如果你涉及软件开发,可能会经常听到 “高内聚,低耦合” 这种概念型词语。

  可是,何为 “高内聚,低耦合” 呢?

•概念

  “高内聚,低耦合” 是相对于代码而言,一个项目中:

  • 每个模块之间相互联系的紧密程度,模块之间联系越紧密,则耦合性越高,模块的独立性就越差,反之同理;
  • 一个模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的联系程度越高,则内聚性越高,即 “高内聚” ;

  如:一个项目中有20个方法调用良好,但是要修改了其中一个,另外的19个都要进行修改,这就是高耦合,独立性太差;

  现在的软件结构设计,都会要求 “高内聚,低耦合”,来保证软件的高质量!

•通过代码直观感受

  假设有一个数组  a[] = {1,2,3,4,5} ;

  现在需要你通过代码计算公式

$(a[0]+a[1]+\cdots+a[4])\cdot(a[0]+a[1]+\cdots+a[3])\cdot_{\cdots}\cdot a[0]$

  的值,你可以这么编写代码:

static int[] a = new int[] {1,2,3,4,5};

    public static void main(String[] args) {

        //计算a[0]+a[1]+a[2]+a[3]+a[4]
int sum1 = 0;
for(int i = 0;i <= 4;i++) {
sum1 += a[i];
} //计算a[0]+a[1]+a[2]+a[3]
int sum2 = 0;
for(int i = 0;i <= 3;i++) {
sum2 += a[i];
} //计算a[0]+a[1]+a[2]
int sum3 = 0;
for(int i = 0;i <= 2;i++) {
sum3 += a[i];
} //计算a[0]+a[1]
int sum4 = 0;
for(int i = 0;i <= 1;i++) {
sum4 += a[i];
} //计算a[0]
int sum5 = 0;
for(int i = 0;i <= 0;i++) {
sum5 += a[i];
} //计算乘积
int sum = sum1*sum2*sum3*sum4*sum5;
System.out.println(sum);
} }

  通过分析代码你会发现:重复代码太多!

  如果我们把重复的代码提取出来,会怎么样呢?

  稍加修改一下:

public class SimpleDemo {

    static int[] a = new int[] {1,2,3,4,5};

    public static void main(String[] args) {

        //计算a[0]+a[1]+a[2]+a[3]+a[4]
int sum1 = Sum(0, 4); //计算a[0]+a[1]+a[2]+a[3]
int sum2 = Sum(0, 3); //计算a[0]+a[1]+a[2]
int sum3 = Sum(0, 2); //计算a[0]+a[1]
int sum4 = Sum(0, 1); //计算a[0]
int sum5 = Sum(0, 0); //计算乘积
int sum = sum1*sum2*sum3*sum4*sum5;
System.out.println(sum);
} public static int Sum(int x,int y) {
int sum = 0;
for(int i = x;i <= y;i++) {
sum += a[i];
}
return sum;
}
}

  通过代码的复用,我们将大部分冗余代码进行了清理。

•小结

  讲了这么多,你大概猜到耦合是什么意思了:

  • 将一串代码模块化(即封装为不同方法),每个模块(方法)都有自己的功能
  • 封装方法越多,耦合度越低
  • 模块与模块之间接口的复杂程度,模块之间联系越复杂,耦合度越高

  那么内聚就是:

  • 每个模块(方法)相互分离的情况下,修改了某模块(方法)其中的某些代码,但并不影响和其它模块的通讯(即高内聚)
  • 每个模块尽可能独立完成自己的功能,不依赖于模块外部的代码。

•声明

参考资料

Java学习之浅析高内聚低耦合的更多相关文章

  1. Java编码思想之什么是高内聚低耦合?

    分别描述的是模块内部特征,和模块外部引用关系. 内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高. 内聚是就其中任何一个模块的内部特征而言的. 耦合是就多 ...

  2. 面系那个对象开发原则.高内聚.低耦合+Python安装详细教程+print输出带颜色的方法

    面系那个对象开发原则.高内聚.低耦合 软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准.划分摸块的一个准则就是高内聚低耦合. 这是软件工程中的概念,是判断设计好坏的标准,主要是面向OO的设计, ...

  3. Office之什么是高内聚低耦合

    ---恢复内容开始--- 高内聚低耦合,是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否高,耦合度是否低. 粗劣的说就指的是:单独模块间有着强大的凝聚力,不同的模 ...

  4. 如何设计一个高内聚低耦合的模块——MegEngine 中自定义 Op 系统的实践经验

    作者:褚超群 | 旷视科技 MegEngine 架构师 背景介绍 在算法研究的过程中,算法同学们可能经常会尝试定义各种新的神经网络层(neural network layer),比如 Layer No ...

  5. 对C++中高内聚,低耦合原则的理解

    1.C语言是面向过程的语言,采用模块化的设计思想,每个功能划分为一个模块,是以函数为单位的. 2.C++是面向对象的语言,采用类设计的思想,因此C++中的模块是以类为基本单位的. 高内聚,低耦合能够使 ...

  6. Python学习第十八篇——低耦合函数设计思想

    import json 2 def greet_user(filename): 3 try: 4 with open(filename) as f_obj: 5 username = json.loa ...

  7. 高灵活低耦合Adapter快速开发攻略

    Android开发中经常需要使用Adapter. 传统方法是自定义一个Adapter并继承AndroidSDK内的BaseAdapter, 这种方式代码量大,耦合度高,灵活性差(各种监听事件需要对Vi ...

  8. [ Java学习基础 ] 浅析Java方法调用

     先看一个示例,读者可先自行阅读判断输出结果: public class TestClass { private static void testMethod(){ System.out.printl ...

  9. Java学习---面试基础知识点总结

    Java中sleep和wait的区别 ① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线 ...

随机推荐

  1. js Array.from & Array.of All In One

    js Array.from & Array.of All In One 数组生成器 Array.from The Array.from() static method creates a ne ...

  2. React 17 All In One

    React 17 All In One v17.0.1 https://reactjs.org/blog/2020/10/20/react-v17.html https://reactjs.org/b ...

  3. MDN Browser Compatibility Report 2020

    MDN Browser Compatibility Report 2020 top pain point https://mdn-web-dna.s3-us-west-2.amazonaws.com/ ...

  4. Mila Fletcher :其实高度自律的人生并没有那么难养成

    在日常生活中,我们经常会发现,不论是学习,考证,工作,都需要坚持付出.但是很多人都没有办法在枯燥的学习过程中持续下去,这通常是因为不够自律导致的.但是尽管大家都知道自律是多么重要,却没有几个人可以真正 ...

  5. NGK公链账本技术浅析

    NGK公链账本是一个去中心化加密账本,运行在分布式网络上.分布式账本是区块链技术中最重要的组成部分之一.NGK作为公链资产,在公链中起到桥梁作用,可以促进其他资产(法币.数字资产.股权以及实物资产)交 ...

  6. Python数据结构与算法_最长公共前缀(05)

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...

  7. flask启动常见问题1:sqlalchemy.exc.ArgumentError: Mapper mapped class UserCode->data_system_user_email could not assemble any primary key columns for mapped table 'data_system_user_email'

    我的描述:当我编辑好flask以后,ORM映射数据库完成,启动项目时,发生现象: 解决: 看字面的意思是主键导致的错误,于是我查看了data_system_user_email的键参数配置,发现表没有 ...

  8. 翻译:《实用的Python编程》02_04_Sequences

    目录| 上一节 (2.3 格式化) | 下一节 (2.5 Collections模块) 2.4 序列 序列数据类型 Python 有三种序列数据类型. 字符串:如 'Hello'.字符串是字符序列 列 ...

  9. AdoptOpenJDK是什么?

    要搞清楚AdoptOpenJDK是什么,前提条件是我们需要知道JDK是什么,OpenJDK是什么.明白了JDK和OpenJDK的关系,会容易明白什么是AdoptOpenJDK. JDK是什么? 首先, ...

  10. Ctfweb(2)

    CTFwebshow(2): phps源码泄露 思路:第一次接触phps这个后缀,第一眼打开的时候是想着用御剑去扫目录,但是很遗憾没有扫到index.phps,然后用burp抓包返回包信息也没有看到端 ...