当前位置: 首页 > news >正文

Spring笔记(二)

二、高内聚低耦合

1.概念

高内聚低耦合,是软件工程中的概念,是判断软件设计好坏的标准,主要用于程序的面向对象的设计,主要看类的内聚性是否高,耦合度是否低。目的是使程序模块的可重用性、移植性大大增强。通常程序结构中各模块的内聚程度越高,模块间的耦合程度就越低。内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事,它描述的是模块内的功能联系;耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。

2.内聚

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

高内聚:根据类与类之间的关系而定,高们之间的关系要简单明了,不要有很强的关系,不然运行起来就会出问题一个类的运行影响到其他的类

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

偶然内聚巧合内聚一个模块内的各处理元素之间没有任何联系,只是偶然地被凑到一起,内聚程度最低

逻辑内聚:这种模块把几种相关的功能组合在一起,每次被调用时,由传送给模块参数来确定该模块应完成哪一种功能

时间内聚:把需要同时执行的动作组合在一起形成的模块称为时间内聚模块

过程内聚:构件或者操作的组合方式是,允许在调用前面的构件或操作之后,马上调用后面的构件或操作,即使两者之间没有数据进行传递如果一个模块内的处理元素是相关的,而且必须以特定次序执行则称为过程内聚

通信内聚信息内聚指模块内所有处理元素都在同一个数据结构上操作或所有处理功能都通过公用数据而发生关联模块内各个组成部分都使用相同的数据结构或产生相同的数据结构

顺序内聚:一个模块中各个处理元素和同一个功能密切相关,而且这些处理必须顺序执行,通常前一个处理元素的输出是后一个处理元素的输入

功能内聚:模块内所有元素的各个组成部分全部都为完成同一个功能而存在,共同完成一个单一的功能,模块已不可再分模块仅包括为完成某个功能所必须的所有成分,这些成分紧密联系、缺一不可

3.耦合

耦合:对模块间关联程度的度量耦合的强弱取决模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少

模块间的耦合度模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。降低模块间的耦合度能减少模块间的影响,防止对某一模块修改所引起水波效应,保证系统设计顺利进行

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

非直接耦合:两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的耦合度最弱,模块独立性最强

数据耦合:调用模块和被调用模块之间只传递简单的数据项参数。相当于高级语言中的值传递

标记耦合特征耦合:调用模块和被调用模块之间传递数据结构而不是简单数据,表就和的模块间传递的不是简单变量,而是像高级语言中的数据名、记录名和文件名等数据结果

这些名字即为标记,其实传递的是地址

控制耦合:模块之间传递的不是数据信息,而是控制信息例如标志、开关量等,一个模块控制了另一个模块的功能

外部耦合:一组模块都访问同一全局简单变量,而且不通过参数表传递该全局变量的信息,则称之为外部耦合

公共耦合:一组模块都访问同一个全局数据结构,公共数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等

如果模块只是向公共数据环境输入数据,或是只从公共数据环境取出数据,这属于比较松散的公共耦合

如果模块既向公共数据环境输入数据又从公共数据环境取出数据,这属于较紧密的公共耦合

4.降低耦合度的方法

(1)少使用类的继承,多用接口隐藏实现的细节Java面向对象编程引入接口除了支持多态外,隐藏实现细节也是其中一个目的

(2)模块的功能化划分尽可能的单一,道理也很简单,功能单一的模块供其它模块调用的机会就少(其实这是高内聚的一种说法,高内聚低耦合一般同时出现)。

(3)遵循一个定义只在一个地方出现

(4)少使用全局变量

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

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

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

(8)避免直接操作或调用其它模块或类(内容耦合)如果模块间必须存在耦合,原则上尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,避免使用内容耦合

5.增强内聚度方法

(1)模块只对外暴露最小限度的接口,形成最低的依赖关系

(2)只要对外接口不变,模块内部的修改,就不得影响其他模块

(3)删除一个模块,应当只影响有依赖关系的其他模块,而不应该影响其他无关部分

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • qtsql连接达梦数据库
  • 【CANoe使用大全】——cdd导入CANoe流程详解
  • 使用PowerShell自动化Windows系统管理任务
  • JavaEE从入门到起飞(九) ~Activiti 工作流
  • 【前缀和算法】--- 一维和二维前缀和模板
  • Django 后端架构开发:手机与邮箱验证码接入、腾讯云短信SDK和网易邮箱
  • 实时洞察应用健康:使用Spring Boot集成Prometheus和Grafana
  • 极速文件预览!轻松部署 kkFileView 于 Docker 中!
  • OSPF 开放式最短路径优先协议
  • 数据结构-递归算法-第四天
  • 8.22 万灵药(SAM + Trie + 树剖 + 线段树)
  • STL—list—模拟实现【迭代器的实现(重要)】【基本接口的实现】
  • 记录 Ant Design Table 组件使用的问题
  • 深入理解HTTP的基础知识:请求-响应过程解析
  • Google Ads投放 | 如何分析竞争对手的谷歌广告?
  • 【Linux系统编程】快速查找errno错误码信息
  • 2017-08-04 前端日报
  • canvas绘制圆角头像
  • CentOS 7 防火墙操作
  • css系列之关于字体的事
  • Java 内存分配及垃圾回收机制初探
  • JavaScript新鲜事·第5期
  • Laravel核心解读--Facades
  • linux安装openssl、swoole等扩展的具体步骤
  • Redis中的lru算法实现
  • vue-router的history模式发布配置
  • Web设计流程优化:网页效果图设计新思路
  • Zsh 开发指南(第十四篇 文件读写)
  • 阿里云应用高可用服务公测发布
  • 编写符合Python风格的对象
  • 机器学习学习笔记一
  • 前端_面试
  • 前端面试之闭包
  • 前端之Sass/Scss实战笔记
  • 如何优雅地使用 Sublime Text
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 自动记录MySQL慢查询快照脚本
  • nb
  • kubernetes资源对象--ingress
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # Apache SeaTunnel 究竟是什么?
  • # Redis 入门到精通(七)-- redis 删除策略
  • # 达梦数据库知识点
  • (2022 CVPR) Unbiased Teacher v2
  • (7)svelte 教程: Props(属性)
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (待修改)PyG安装步骤
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (四)鸿鹄云架构一服务注册中心
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (一)认识微服务
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换