3分钟Tips:用大白话告诉你什么是低耦合|高内聚

1、高内聚

首先我们来看看内聚的含义:软件含义上的内聚其实是从化学中的分子的内聚演变过来的,化学中的分子间的作用力,作用力强则表现为内聚程度高。在软件中内聚程度的高低,标识着软件设计的好坏。

我们在进行架构设计时的内聚高低是指,设计某个模块或者关注点时,模块或关注点内部的一系列相关功能的相关程度的高低。

例如:下单模块:

一般情况下,下单模块都会有如下的信息,订单的信息,产品的信息及谁下的单(买家信息)。这是基本的,那么我们设计的时候就要把相关的功能内聚到一起。当然这是从大功能(下单管理)上来说,当然这些模块还可以再细化分成产品、订单、会员等子模块。

例如我们在设计数据库操作辅助类提供的方法有:

通过这样的方式,那么这个组件只负责数据库操作。这样带来的好处也是显而易见的。高内聚提供了更好的可维护性和可复用性。而低内聚的模块则表名模块直接的依赖程度高,那么一旦修改了该模块依赖的对象则无法使用该模块,必须也进行相应的修改才可以继续使用。

低内聚的模块设计的坏处有:首先模块的功能不单一,模块的职责不明确,比较松散,更有甚者是完成不相关的功能。这样的设计往往是不可取的。可以通过重构来完善。

下面我们来说下高内聚的简单解释:什么样的模块算是高内聚,并且能够在系统中很好的使用。

那么我们在设计的过程中如何去完成高内聚呢?

以上基本上讲述了高内聚的好处,并且阐述了如何实现高内聚的步骤和原则。下面我们来说说可能高内聚带来的坏处。

高内聚有时候也不是说所有的情况都采用这样的原则,当然高内聚还是要适度的,下面来举例说明:例如内聚性要求强的话就像Windows32中系统提供的API,里面的函数太多了,都放在一个Dll中,那么每个函数完成一个功能。这样强大的功能,会比较复杂,所以并不是完全的高内聚越高越好,还是要看实际的需要。当然维护起来也不是特别的方便。

2、低耦合

首先我们来看看低耦合的定义:低耦合是用来度量模块与模块直接的依赖关系。耦合当然也可以这样简单的理解,我想懂电脑的应该都知道,CPU与主板之间的关系,CPU如果是特殊的CPU必须使用特殊的主板来支持,那么如果说这个CPU不唯一依赖唯一主板,那么就认为这个CPU与主板的关系是低耦合的关系。

下面我们来举例说明低耦合的设计与高耦合的设计:

这是一个简单的低耦合的设计,电器与插座之间是低耦合的关系,就算我替换了不同的插座,电器依然可以正常的工作。因此简单的描述如下,就是A模块与B模块存在依赖关系,那么当B发生改变时,A模块仍然可以正常工作,那么就认为A与B是低耦合的。

1、笔记本接音响可以正常的使用。

2、笔记本接专配耳机正常的使用。

对应一般的音响来说,笔记本是通用的,音响和笔记本直接的关系是低耦合的,但是笔记本和耳机却是高耦合的,只有专配的耳机才能和笔记本互联使用,而不

是通用的,所以说笔记本和专配耳机存在着较强的依赖关系。当然最简单的方式就是笔记本提供统一的耳机接口,可以满足一般性的需求。

下面我们将来分析如何构建低耦合的设计。

总结

上面我们已经讲解了低耦合和高内聚的二个原则,通过这2个原则我们知道,满足这2个原则是衡量一个架构设计好坏的一个参考标准。下面我们将来讲解通过功能分离的方式来满足上面的2个原则。

1、如何按功能进行模块化的分离。

我们在将一个系统进行功能划分时,首先我们先把功能职责划分成独立的单元。

例如现在有个B2C系统,那么我们按照B2C的需求,如下分析:

我们这里简单的分析下B2C应该具有的功能模块,当然这些模块的划分中,有些模块还可以继续的分离,当然我这里只是实例分析出来。

2、对分离出来的模块化进行抽象,例如我们以支付为例。

这里通过支付接口向外提供服务。那么外界模块不关心支付系统模块的变化,只需要调用接口即可,如果具体的支付方式,比如支付宝的方式发生改变,在调用支付服务的模块中也不需要做任何的修改就可以正常的提供服务。显然这样的方式是不错的实现方式。

通常情况下我们在系统分离式只是以接口的方式提供服务,供其他的模块进行使用。在模块内部有大量的信息是不要向外部暴露的,所以模块在设计时访问域的定义就要划分好,防止因为访问域的定义而对模块的信息造成破坏。

 1 public www.tianjiptzc.cn  www.zhuyngyule.cn class SomeController
 2 {
 3     private readonly ISomeService someService;
 4
 5     public SomeController(www.feiyuptzc.cn ISomeService someService)
 6     {
 7         this.someService www.lecaixuanzc.cn= someService;
 8     }
 9
10     [HttpPost("Create")www.huiyinpp3zc.cn]
11     public SomeDto CreateSomething(SomethingDto parameters)
12     {
13         return this.www.chaoyuepint.com someService.Create(new www.motianydl.cn  Something(www.moyouptzc.cn)
14         {
15             A =www.shentuylgw.cn paraeters.A
16             // and so on

下面我们来看下功能分离在不同的设计理念下都是什么样的表现:

上面只是实体性的分析了功能分离的好处及应用的广度,当然我们在后续会结合实例来讲解如何来实现这样的软件设计模式。当然这只是软件的架构设计,那么如

果细化到具体的实现呢?我们如何去设计每个功能点呢?这就是下章我们要讲解的内容了,那么本文先列出二种常见的方式。

原文地址:https://www.cnblogs.com/laobeipai/p/12549217.html

时间: 2024-11-05 15:52:39

3分钟Tips:用大白话告诉你什么是低耦合|高内聚的相关文章

用大白话告诉你啥是Java开发

Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现均支持Java applet. 经过了多年的发展,Java早已由一门单纯的计算机编程语言,演变为了一套强大的技术体系.是的,什么是Java,我想技术体系四个字应该是最好的概括了吧. 用大白话

用大白话告诉你 :Java 后端到底是在做什么?

阅读本文大概需要 6 分钟. 作者:黄小斜 新手程序员通常会走入一个误区,就是认为学习了一门语言,就可以称为是某某语言工程师了.但事实上真的是这样吗?其实并非如此. 今天我们就来聊一聊,Java 开发工程师到底开发的是什么东西.准确点来说,Java后端到底在做什么? 大家都知道 Java 是一门后端语言,后端指的就是服务端,服务端代码一般运行在服务器上,通常我们运行Java 程序的服务器都是 Linux 服务器. 这些服务器在互联网公司中一般放在一个叫做机房的地方里,于是像我们这类 Java 程

用大白话告诉你ArrayList的底层原理

一.ArrayList的数据结构 ArrayList的底层数据结构就是一个数组,数组元素的类型为Object类型,对ArrayList的所有操作底层都是基于数组的. 二.ArrayList的线程安全性 对ArrayList进行添加元素的操作的时候是分两个步骤进行的,即第一步先在object[size]的位置上存放需要添加的元素:第二步将size的值增加1.由于这个过程在多线程的环境下是不能保证具有原子性的,因此ArrayList在多线程的环境下是线程不安全的. 具体举例说明:在单线程运行的情况下

用大白话扯扯那"神奇"的面向对象编程思维

前言: 每当提到面向对象的时候,初学者肯定都是一脸懵逼的状态,到底什么是面向对象?会用面向对象后有什么牛逼之处吗?不会用是不是就会死掉?答案肯定不会死掉,我们可以来简单的举一 个栗子 1.当你想到熊猫的时候你想到了什么? 答:"国宝" 2.当你看到"国宝"穿上衣服的时候你想到了什么名字? 答:"功夫熊猫"; 其实你可以理解成面向对象就是一种武功!你可以想象一下会武功和不会武功的人有什么区别?"走路带风.飞檐走壁.不食人间烟火.让妹子一看

用大白话揭开Ajax长轮询(long polling)的神秘面纱

在看这篇Ajax长轮询之前可以先看看Ajax轮询技术(没有长),有助于理解: Ajax长轮询属于Ajax轮询的升级版,在客户端和服务端都进行了一些改造,使得消耗更低,速度更快. "不间断的通过Ajax查询服务端". 来,小二,先上代码~: Reception.html //客户端 <html> <head> <title></title> <script src="http://lib.sinaapp.com/js/jqu

用大白话聊聊分布式系统

原文同步至https://waylau.com/talk-about-distributed-system/ 一提起"分布式系统",大家的第一感觉就是好高大上啊,深不可测,看各类大牛关于分布式系统的演讲或者书籍,也大多是一脸懵逼.本文期望用浅显易懂的大白话来就什么是分布式系统.分布式系统有哪些优势.分布式系统会面临哪里挑战.如何来设计分布式等方面的话题来展开讨论. 什么是分布式系统 关于"分布式系统"的定义,我们先看下老外是怎么说的.<分布式系统原理和范型&g

【面向对象】用大白话扯扯那&quot;神奇&quot;的面向对象之属性继承(三)------【凡尘】

1.继承概念 说到继承我们第一时间想到的是什么东西? 我第一时间想到的是继承父亲的亿万家产,从小我就一直在暗示自己,我是一个来自全国排行前100的首富家庭,我现在受的所有的苦和所有的坎坷都是父亲给我安排的,都是为了让让更好的磨练,今后好让我继承家业!直到现在,我还坚信这个想法,如果父亲还没有让我继承家业只是时机还未到.....好了我们先不意淫,当第一想到继承的时候肯定我们想到的是继承父亲已有的东西. 那么代码里面的东西我们也可以理解成子级继承父级已有的属性和方法 今天我们首先说下属性继承,方法继

用大白话讲一致性Hash算法在Redis分布式中的使用

在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的应用场景. 1 .场景描述 假设,我们有三台缓存服务器,用于缓存图片,我们为这三台缓存服务器编号为0号.1号.2号,现在,有3万张图片需要缓存,我们希望这些图片被均匀的缓存到这3台服务器上,以便它们能够分摊缓存的压力.也就是说,我们希望每台服务器能够缓存1万张左右的图片,那么,我们应该怎样做呢?如果

分享《白话深度学习与TensorFlow》+PDF+高杨

下载:https://pan.baidu.com/s/150FjIfsNVlPh-Fq-IghgWA更多资料分享:http://blog.51cto.com/14087171 <白话深度学习与TensorFlow>中文版PDF 经典学习资料,带目录和书签,文字可以复制粘贴. 图示如下: 原文地址:http://blog.51cto.com/14087171/2321679