[架构之路-183]-《软考-系统分析师》-13-系统设计 - 高内聚低耦合详解、图解以及技术手段

news2024/11/24 3:35:38

目录

第1章  什么是高内聚低耦合

1.1 概念

1.2 目的

1.3 什么时候需要进行高内聚低耦合

1.4 什么系统需要关注高内聚、低耦合

第2章 分类

2.1 内聚的分类

2.2 耦合的分类

第3章  增加高内聚降低耦合度的方法

3.1 增加高内聚

3.2 降低耦合度


第1章  什么是高内聚低耦合

1.1 概念

高内聚低耦合,是软件工程中的概念,是判断软件设计好坏的标准,主要用于程序的面向对象的设计,主要看类的内聚性是否高,耦合度是否低。

内聚是从功能角度来度量模块内部的各子模块之间的相似性的程度,一个好的内聚模块应当恰好做一件事,它描述的是模块内的功能联系

耦合是从接口角度来度量模块与外界之间的相互连接、相互依赖、相互影响的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。

1.2 目的

目的是增加程序模块的可重用性、增强程序的移植性,同时也有助于系统的有序性、

通常程序结构中各模块的内聚程度越高,模块间的耦合程度就越低

高内聚具备可靠性,可重用性,可读性等优点,模块设计推荐采用高内聚。

1.3 什么时候需要进行高内聚低耦合

在系统设计的概要设计阶段,对软件进行模块切分时,会使用到该概念。

需要注意的是,当你在做「分解」这个操作的时候,务必要关注每一次的「分解」是否满足一个最重要的条件:不同分支上的子问题,不能相互依赖,需要各自独立

因为一旦包含了依赖关系,子问题和父问题之间就失去了可以被「归并」的意义。

比如,一个「问题Z」被分解成了两个子问题,「子问题A」和「子问题B」。但是,解问题A依赖于问题B的答案,解问题B又依赖于问题A的答案。这不就等于没有分解吗?

架构是指可以预制和重构的软件框架结构。普遍指通过某种特定平台,而达到完成整体软件的功能。架构设计是指对软件、硬件、网络、运营、政策等软件设计中的需求和要素进行决策,主要包括体系结构设计和各个层的模块设计。

架构设计目标有个能够最大化的重用。

首先,要在架构的设计中灵活地使用各种共享的,特别是开源的框架技术因为共享的架构可以方便开发组分解问题,从而对项目中的功能模块分为需要内部解决和使用已有外部服务两类,避免了重复开发实现。

其次,尽量使用成熟的框架。由于服务器端软件系统的开发,涉及的知识、内容、要解决的技术问题很多,在某些方面使用第三方成熟的框架,相当于让别人帮助开发者完成了一些基础性的工作,此时开发者只需要集中精力完成系统业务逻辑的设计和实现。使软件系统实现可扩展性在技术上灵活地使用各种架构模式和代码设计模式,并且在使用代码设计模式的同时,使用其所提倡的面向接口编程,会对软件系统的可扩展性和可移植性的提高有所帮助。

希望能够设计出“高内聚、低耦合”的应用系统。这是架构设计最主要的目标,实现系统的高内聚、低耦合遵从以下原则:

  • 利用分层架构实现系统在纵向上的低藕合;利用开源框架进一步确保纵向分层的具体实现;
  • 按照功能划分子系统来实现横向上的低偶合;利用包结构确保横向上低耦合的具体实现。

1.4 什么系统需要关注高内聚、低耦合

只有一个大型的软件系统,需要对软件系统进行大量的模块切分时,才会需要到高内聚、低耦合设计思想。

一个小型的软件系统,是不需要考虑高内聚、低耦合。

第2章 分类

2.1 内聚的分类

内聚:故名思议,表示内部间聚集、关联的程度,那么高内聚就是指要高度的聚集和关联

内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽局部化概念的自然扩展。

内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。

  • 偶然内聚:一个模块内的各处理元素之间没有任何逻辑上的联系,只是偶然地被凑到一起。这种模块也称为巧合内聚内聚程度最低
  • 逻辑内聚:这种模块把几种相关的功能组合在一起, 每次被调用时,由传送给模块参数来确定该模块应完成哪一种功能 。
  • 时间内聚:把需要同时执行的动作组合在一起形成的模块称为时间内聚模块。纯粹是因为执行时间相同,并没有功能/目标一致上的关系。
  • 先后过程内聚:构件或者操作的组合方式是,允许在调用前面的构件或操作之后,马上调用后面的构件或操作,即使两者之间没有数据进行传递。简单的说就是如果一个模块内的处理元素是相关的,而且必须以特定次序执行则称为过程内聚。例如某要完成登录的功能,前一个功能判断网络状态,后一个执行登录操作,显然是按照特定次序执行的。
  • 信息通信内聚:指模块内所有处理元素都在同一个数据结构上操作或所有处理功能都通过公用数据而发生关联(有时称之为信息内聚)。即指模块内各个组成部分都使用相同的数据结构或产生相同的数据结构
  • 逻辑顺序内聚:一个模块中各个处理元素和同一个功能密切相关,而且这些处理必须顺序执行,通常前一个处理元素的输出时后一个处理元素的输入。例如某要完成获取订单信息的功能,前一个功能获取用户信息,后一个执行计算均价操作,显然该模块内两部分紧密关联。顺序内聚的内聚度比较高,但缺点是不如功能内聚易于维护。
  • 功能内聚:模块内所有元素的各个组成部分全部都为完成同一个功能或目标而存在,共同完成一个单一的功能,模块已不可再分。即模块仅包括为完成某个功能所必须的所有成分,这些成分紧密联系、缺一不可,不多不少,凝聚力强!

2.2 耦合的分类

耦合:是对模块间关联程度的度量。

耦合的强弱取决与模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。

模块间的耦合度是指模块之间的依赖关系,包括:

  • 控制关系
  • 调用关系
  • 数据传递关系。

模块间联系越多,其耦合性越强,同时表明其独立性越差。

降低模块间的耦合度能减少模块间的影响,防止对某一模块修改所引起的“牵一发动全身”的水波效应,保证系统设计顺利进行。

耦合度就是某模块(类)与其它模块(类)之间的关联、感知和依赖的程度,是衡量代码独立性的一个指标。

  • 非直接耦合:两个模块之间没有直接关系,它们之间的联系完全是通过主模块控制调用实现的耦合度最弱,模块独立性最强。
  • 函数调用/发送消息:值数据耦合:调用模块被调用模块之间只传递简单的数据项参数。相当于高级语言中的值传递
  • 函数调用/发送消息:标记/地址耦合:调用模块和被调用模块之间传递数据结构而不是简单数据,同时也称作特征耦合。模块间传递的不是简单变量值,而是像高级语言中的数据名、记录名和文件名等数据的标记,这些名字即为标记,其实传递的是地址
  • 备注:数据耦合相对于控制耦合,是松耦合,因为万事万物,总会有些信息联系的。
  • 函数调用/发送消息:控制耦合:模块之间传递的不是数据信息,而是控制信息,例如标志、开关量等,一个模块控制了另一个模块的功能。
  • 共享资源:外部变量耦合、外部耦合:一组模块都访问同一全局简单变量,而且不通过参数表传递该全局变量的信息,则称之为外部耦合。
  • 共享资源:公共数据耦合:一组模块都访问同一个全局数据结构,则称之为公共耦合。公共数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。如果模块只是向公共数据环境输入数据,或是只从公共数据环境取出数据,这属于比较松散的公共耦合;如果模块既向公共数据环境输入数据又从公共数据环境取出数据,这属于较紧密的公共耦合。
  • 内容耦合:是指如果一个模块与另一个模块的内部属性有关,不经调用直接使用另一个模块的程序代码或内部数据,那么这两个模块之间就存在内容耦合。这种耦合表明一个模块与另一个模块的内部数据或程序代码有关,当一个模块的程序代码被修改或内部数据出错,必然引起另一个模块出错。而对后一模块的出错是很难查出原因的,这样给模块的修改、维护带来极大困难。内容耦合的耦合度最大,为“病态耦合”,在设计时,应避免这种耦合。在高级语言中,实际上已经规避了该类型的耦合,只有在汇编语言中,一个模块、函数才能直接访问另一个函数内部的变量和内存空间!!!

备注0:

共享资源虽然是高耦合,但并非一无是处,当两个模块之间需要高性能数据交换时,共享内存(共享数据)是一个非常高效的手段!!!

备注1:不存在完全孤立的模块

没有与外界完全没有耦合的模块,与外界完全没有耦合的模块是信息孤岛,是没有存在的意义和价值的!!!!

备注2:公共耦合会引起以下问题

1. 无法控制各个模块对公共数据的存取,严重影响了软件模块的可靠性和适应性

2. 使软件的可维护性变差。若一个模块修改了公共数据,则会影响相关模块。

3. 降低了软件的可理解性。不容易清楚知道哪些数据被哪些模块所共享,排错困难。

一般地,仅当模块间共享的数据很多且通过参数传递很不方便时,才使用公共耦合。

备注3:内容耦合

一个模块直接访问另一模块的内容,则称这两个模块为内容耦合。

若在程序中出现下列情况之一,则说明两个模块之间发生了内容耦合:

1. 一个模块直接访问另一个模块的内部数据。

2. 一个模块不通过正常入口而直接转入到另一个模块的内部。

3. 两个模块有一部分代码重叠(该部分代码具有一定的独立功能)。

4. 一个模块有多个入口。

内容耦合可能在汇编语言中出现。大多数高级语言都已设计成不允许出现内容耦合。这种耦合的耦合性最强,模块独立性最弱。

第3章  增加高内聚降低耦合度的方法

3.1 增加高内聚

  • 1、模块只对外暴露最小限度的接口,暂时不需要的接口,不需要暴露,形成最低的依赖关系。
  • 2、只要对外接口不变,模块内部的修改,就不得影响其他模块。
  • 3、删除一个模块,应当只影响有依赖关系的其他模块,而不应该影响其他无关部分。

3.2 降低耦合度

1、少使用类的继承,多用接口隐藏实现的细节。

Java面向对象编程引入接口除了支持多态外, 隐藏实现细节也是其中一个目的。

继承能很好的利用现有内的结构化定义,但也会导致两个类深度耦合。

2、模块的功能化分尽可能的单一

道理也很简单,功能单一的模块供其它模块调用的机会就少。

(其实这是高内聚的一种说法,高内聚低耦合一般同时出现)。

3、遵循一个定义只在一个地方出现。

4、少使用全局变量

5、类属性和方法的声明少用public,多用private关键字。

public的本质就是类的接口,接口越多,对外的依赖性越大。public属性越少,与外界的接口越少。

6、多用设计模式,比如采用MVC的设计模式就可以降低界面与业务逻辑的耦合度。

设计模式本身,就是遵循高内聚、低耦合的原则设计的模式!!!

7、尽量不用“硬编码”的方式写程序,同时也尽量避免直接用SQL语句操作数据库。

摆脱业务代码与数据库的强耦合。

8、最后当然就是避免直接操作或调用其它模块或类的数据(内容耦合);

如果模块间必须存在耦合,原则上尽量使用数据耦合少用控制耦合限制公共耦合的范围避免使用内容耦合

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/490886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud_Gateway服务网关

文章目录 一、SpringCloudGateway服务网关概论1、SpringCloudGateway服务网关概论2、SpringCloudGateway的三大核心概念 二、SpringCloudGateway的路由及断言1、子模块项目SpringCloudGateway的搭建2、SpringCloudGateway_Java API构建路由3、SpringCloudGateway的动态路由功能…

cmd 批量ping命令

cmd 批量ping命令 1、批量ping 1个网段2、批量ping多个网段 1、批量ping 1个网段 ping 1个网段 for /l %X in (2,1,254) do (ping -n 2 10.1.2.%X && echo 10.1.2.%X >> ok.txt || echo 10.1.2.%X >> no.txt)命令说明: %l 表示在(2,1,254) 按…

免费矢量图标网站都有哪些,推荐这10个

矢量图标是我们日常设计应用程序和网页过程中不可缺少的元素之一。通过小矢量图标,我们可以快速方便地实现视觉指导和功能划分。 但在创作中,设计师往往需要花费大量的时间和精力来寻找不同网站的矢量图标,以满足他们的设计需求,…

电子价签能给生鲜零售带来什么?

生鲜零售 变价难 超市中的水果、蔬菜、鱼肉海鲜等商品,往往会受季节变化、运输和储存成本、自然环境引起的生产成本、供需关系等因素影响,其商品价格变动比较频繁。如不能及时更新价格,容易影响商品的销售,进而影响超市的盈利能…

asp.net基于web的大学生交友网站shfw9294程序

为社会的和谐做出了贡献。 通过网络,不同地区的人员可跨越时间、地点进行交流。建设一个安全、可靠、开放、纯净的大学生交友网站系统,为中山市大学生提供一个使用方便的、 界面美观的交友园地是本系统的主要目的。 系统使用Visual studio.net2010作为系…

【计算机网络】总结复习(1)

本文主要记录在看小林coding 时的一些体会,会记录一些我认为重要的知识点以及感受 网络基础篇 osi 七层协议 tcp/ip 四层协议 应用层 传输层 网络层 网络接口层 实际场景: 输出网址 到 网页显示 过程url 解析(协议web 服务器 数据源路径…

智慧城市规划数字化管理:数字孪生技术的创新应用

随着智能城市的不断发展,数字孪生技术也开始在智慧城市的建设中得到了广泛应用。数字孪生作为一种数字化的复制技术,它可以模拟真实世界中的实体和过程。 在城市规划方面,数字孪生可以帮助城市规划师更加直观地了解城市的整体规划和发展趋势&…

菜鸡shader2:L2基于BlinnPhong假环境反射,生锈材质

目录 假环境反射材质(不锈钢材质)生锈材质 假环境反射材质(不锈钢材质) 先放上最终图: 处理高光部分: 这里是phong模型不是blinnphong。应用观察方向的反射方向和光方向点乘算出高光,然后重…

PHP+vue大学生心理健康评价和分析系统8w3ff

本整个大学生心理健康管理系统是按照整体需求来实现各个功能的,它可以通过心理健康测评来检测大学生的心理健康,并且给予预警,还可以预约医生来解决问题。并且,管理员可以查看用户信息,发布一些关于心理健康的文章。该…

CVE-2023-29489 cPanel XSS漏洞分析研究

前言 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 如果文章中的漏洞出现敏感内容产生了部分影响,请及时联系作者,望谅解。 一、漏洞原理 漏洞简述 cPa…

MySQL之Log Buffer详解

前言 本文已收录在MySQL性能优化原理实战专栏,点击此处浏览更多优质内容。 上一篇文章MySQL之Doublewrite Buffer详解首次提到Redo Log的概念,Redo Log是数据库体系架构中非常重要的一个模块,它能保证数据库的Crash-safe(崩溃恢复…

Linux Docker 搭建WordPress个人博客(避坑篇)

本文主要参考文章:Docker实战:Docker安装WordPress,快速搭建自己的博客 但我在参考过程中踩坑较多,特此记录下 1、What is WordPress 官网:https://wordpress.com/zh-cn/ wordpress是世界上应用最广泛的开源CMS程序…

Kotlin中的密封类和密封接口

密封类和密封接口是 Kotlin 中允许创建受限类层次结构的两个特性。这两个构造用于定义一组有限的可能子类型,并防止在声明的层次结构之外定义其他子类型。 密封类 密封类是一个可以被子类化的类,但只能在声明它的同一个文件中进行子类化。这意味着密封…

内网穿透(ngrock)

什么是内网穿透? 内网穿透,即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。简单来说,就是让身处局域网的电脑,被大…

《基于深度学习模型的非接触式面部视频记录技术用于心房颤动的检测》阅读笔记

目录 一、论文摘要 二、论文十问 Q1: 论文试图解决什么问题? Q2: 这是否是一个新的问题? Q3: 这篇文章要验证一个什么科学假设? Q4: 有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员? …

python安装教程(新手)(超详细)

python安装教程 手把手,简单的教你搭建python的开发环境 1.环境下载 1.下载地址 下载的时候要注意自己电脑的版本和python版本之间的关系。 我的是win10,用的是3.9.0,目前最新的3.11.x 老电脑最好下载3.7.0版本及一下的 Download Python | P…

Word控件Spire.Doc 【打印】教程(1):通过 5 个步骤以编程方式打印 Word 文档

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

04-菜单维护 尚筹网

在【菜单维护】页面,通过树形结构,使用zTree显示整个菜单。 准备工作 一、在数据库创建菜单表: #使用project_rowd表 use project_rowd;#创建菜单的数据库表 create table t_menu (id int(11) not null auto_increment, pid int(11), nam…

【蓝桥杯选拔赛真题55】Scratch昼夜变换 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

目录 scratch昼夜变换 一、题目要求 编程实现 二、案例分析 1、角色分析

5月3日 7H|5月4日 9H↕️|时间轴复盘

2:00-9:00 起床 9:00-9:30 洗漱到教室 9:30-9:40 泡豆浆 9:40-11:40 语法 【2h】 11:40-12:16 午饭回教室 12:16-14:30 健身 14:30-15:30 午睡 15:30-17:00 不背单词 【1.5h】 17:00-18:13 三篇阅读 【1h13min】 18:13-18:57 晚饭 19:00-19:15 …