二、内聚

【内聚】

1.内聚的定义

    一个模块内部元素彼此结合的紧密程度。其中关键字:模块、元素、结合

    模块:大到子系统,小到一个函数,都可以看成一个模块

    元素:

           模块:包、命名空间等

           包:类、接口、全局数据等

           类/接口:方法、属性

           函数:内部的代码

  结合: 用“凝聚力”来理解,更贴切。

        假如说一个类的方法,都依赖于类自身的其他方法,我们说它内聚高。如果一个类的方法依赖外部类的方法,那么这个类的内聚性一定不高吗?不一定。判断一个模块内部元素的内聚性是否高,要看这个模块内部元素的凝聚力。什么是凝聚力?凝聚力就是对模块本身职责的专注程度。

         例如:操作数据库的CURD类。CURD方法之间没有任何结合的关系。但这四个方法是高内聚的。因为它们都专注于CURD类本身的职责。

2.内聚的分类

        偶然内聚:是内聚性最差的一种。仅仅是因为某个和本身业务无关的原因而划分到同一个模块中。例如最常见的,Utils包。这个包主要是提供一些常用的小工具,像个百宝箱一样。这种包中的各个功能模块、各个类专注的职责都是独立的,仅是为了方便取用而划分到了一起。

        逻辑内聚:模块内的元素属于同一个比较宽泛的类别,但元素的职责上可能不一样。例如:鼠标、键盘、显示器、打印机,都同属于IO设备,但这样的内聚相对还是比较弱的。鼠标、键盘归类为输入设备模块,显示器、打印机归类为输出设备模块。这样,内聚性会更高一点。

        时间内聚:这种内聚一般在函数中比较常见。模块内的元素之所以被划分到一个模块内,是因为这些元素的动作在时间上很相近。或者说在某一事件发生、某一状态改变时会调用这些元素进行业务处理。例如:异常处理。抛出异常后,一般我们要做释放资源、记录日志、通知用户这些动作都要执行。

        过程内聚:这种内聚一般在函数中比较常见。这类元素一般是在处理某个业务操作时,必须按照一定的顺序来执行。例如:读/写文件操作。1.判断文件是否存在,2文件是否有权限,3打开文件,4读/写文件。以上这4步的函数都是为了完成读/写文件这一个操作,并且顺序不能错乱。那么把这4个函数封装在一个函数中,那么它们之间就是过程内聚。

        信息内聚:元素被划分到一个模块中是因为这些元素所操作的数据都是相同的数据 或 数据类型 或 数据源。例如学生信息类中有对学生信息操作的CURD方法,那么这些方法在这个类中的内聚就是信息内聚。

        顺序内聚:一个元素执行后的输出,是一个元素执行前的输入,元素之间这种环环相扣的关系就是顺序内聚。例如:规则引擎,一个函数负责读取配置,根据读取的配置输出转换后的执行指令,另一个函数读取指令进而去执行。

        功能内聚:功能内聚是最好的一种内聚方式。模块内部的元素之所以被划分到一个模块中,是因为都是为了完成同一个单一任务。同一个单一任务这个概念比较难界定。因为前面说的IO设备、异常处理、读写文件也都是单一任务。功能内聚中的单一任务是指,元素的功能只为了完成所在模块的任务,别无其他用途。例如:判断文件是否存在这个函数,既可以在读写文件中用,也可以在删除文件中用;再例如,发薪水模块中的计算个人所得税函数,这个函数就是功能内聚的,因为它除了用在发薪水中,其他业务中用不上。

转载于:https://www.cnblogs.com/mysic/p/8489010.html

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

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

相关文章

前端学习(2733):重读vue电商网站43之使用 lodash 中 cloneDeep(obj) 来实现深拷贝

lodash 官方文档传送门 Using npm Js $ npm i -g npm $ npm i --save lodash_.cloneDeep(value) 使用 项目中使用 cloneDeep 需求:由于 addForm 中商品所属的分类数组 goods_cat在商品分类模块需要使用 v-model 进行双向绑定数组形式,而我们调用添加商品…

Android Runnable与Handler和Thread的使用,Handler构造方法弱引用实现

PS:在使用Runnable时,可能会内存泄露。Runnable是一个匿名内部类,因此它对当前Activity有一个隐式引用。如果Activity在销毁之前,任务还未完成, 那么将导致Activity的内存资源无法回收,造成内存泄漏。那么该…

Spring Data JPA框架

1、前言 扔一个 spring data jpa 的代码,可运行,后续补充博客内容。 环境:eclipse tomcat8 2、部分截图 3、源码 https://gitee.com/niceyoo/jpa-demo 4、sql 既然都是 spring data jpa ,还要啥数据库呀,自己创建一个…

jdk1.7 String switch的实现

对于int的switch,jvm是用tableswitch和lookupswitch来实现的,jdk1.7 switch增加了对string的支持,那么底层是如何实现的呢?是否增加了新的指令或是否给某些指令增加了新的含义? 看这样一个程序: Java代码 …

Android 多线程实现异步执行demo,线程池使用demo

方法1: 1、常见Runnable对象设置同步代码run运行体 class AutoSaleTicket implements Runnable {private int ticket 20;public void run() {while (true) {// 循环是指线程不停的去卖票// 当操作的是共享数据时,用同步代码块进行包围起来,这样在执行时,只能有一…

Mvc5 控制器,视图简单说明

本系列会比Mvc4更详细。Mvc4记录或没记录的东西这里也会提到。 控制器 自动装配: 一般自动装配对于添加的时候比较好用 视图: 控制器返回的视图,其实就是一些静态的HTML。动态性不好,从控制器传递少量数据,最简单使用…

前端学习(2734):重读vue电商网站44之使用 echarts

echarts 官方文档传送门 根据官方文档示例&#xff0c;我们先展示测试数据。 Javascript <template><div><!-- 面包屑导航区域 --><el-breadcrumb separator"/"><el-breadcrumb-item :to"{ path: /home }">首页</el-bre…

No fallback instance of type class found for feign client user-service(转)

No fallback instance of type class found for feign client user-service&#xff08;转&#xff09; 1、错误日志 在 feign 开启熔断&#xff0c;配置 fallback 类&#xff0c;实现当前接口的实现类时&#xff0c;报错信息如下&#xff1a; Error starting ApplicationCont…

Redis在windows下安装过程

https://www.cnblogs.com/M-LittleBird/p/5902850.html 一、下载windows版本的Redis 去官网找了很久&#xff0c;发现原来在官网上可以下载的windows版本的&#xff0c;现在官网以及没有下载地址&#xff0c;只能在github上下载&#xff0c;官网只提供linux版本的下载 官网下载…

前端学习(2735):重读vue电商网站45之项目优化上线

优化Vue项目&#xff0c;部署Vue项目 项目优化 添加进度条 nprogress 进度条官方文档传送门 打开 vue-ui 面板&#xff0c;选择依赖&#xff0c;输入 nprogress 进行安装相关依赖。 npm Javascript npm install --save nprogress在 main.js 入口文件中&#xff0c;进行相关…

Push rejected: Push to origin/master was rejected

Push rejected: Push to origin/master was rejected 1、错误日志 23:04 Maven projects need to be imported: Import Changes Enable Auto-Import23:05 4 files committed: 初始化项目23:06 Push rejected: Push to origin/master was rejected23:07 2 files …

基本卷-动态卷性能测评(未完待续)

320G 同一磁盘复制1G 1个文件 //基本磁盘 27秒 FastCopy 1.62 128M缓存 37秒 Windows自带复制 //动态卷 15秒 Windows自带复制 27秒 FastCopy 1.62 128M缓存 28秒 FastCopy 1.62 32M缓存 320G 同一磁盘复制1G 4470个文件 //动态卷 54秒 Windows自带复制 考虑是否是磁盘的原因 3…

前端学习(2736):重读vue电商网站46之执行build 时报错

Error: No module factory available for dependency type: CssDependency 解决办法&#xff1a; 参考&#xff1a;解决webpack打包报错 No module factory available for dependency type: CssDependency 在执行 build 命令期间移除所有的 console babel-plugin-transform…

Android 获取光线强弱,开启闪光灯,关闭闪光灯

1、获取光线强度 &#xff08;1&#xff09;实现传感器接口 implements SensorEventListener 实例化 private SensorManager mSensroMgr;//传感器管理类 mSensroMgr (SensorManager) getSystemService(Context.SENSOR_SERVICE); &#xff08;2&#xff09;监听传感器 Ove…

Python 文件 fileno() 方法

描述 Python 文件 fileno() 方法返回一个整型的文件描述符(file descriptor FD 整型)&#xff0c;可用于底层操作系统的 I/O 操作。 语法 fileno() 方法语法如下&#xff1a; fileObject.fileno() 参数 无 返回值 返回文件描述符。 实例 以下实例演示了 fileno() 方法的使用&am…

@RequestParam @PathVariable

RequestParam PathVariable 1、Request参数 在访问各种各样网站时&#xff0c;经常会发现网站的URL的最后一部分形如&#xff1a;&#xff1f;xxxxyyyy&zzzzwwww。这就是HTTP协议中的Request参数&#xff0c;它有什么用呢&#xff1f;先来看一个例子&#xff1a; 在知乎中…

前端学习(2737):重读vue电商网站47之生成打包报告

打包时&#xff0c;为了直观地发现项目中存在的问题&#xff0c;可以在打包时生成报告。生成报告的方式有两种&#xff1a; ① 通过命令行参数的形式生成报告 Javascript // 通过 vue-cli 的命令选项可以生成打包报告 // --report 选项可以生成 report.html 以帮助分析包内容 …

蓄水池抽样算法 Reservoir Sampling

2018-03-05 14:06:40 问题描述&#xff1a;给出一个数据流&#xff0c;这个数据流的长度很大或者未知。并且对该数据流中数据只能访问一次。请写出一个随机选择算法&#xff0c;使得数据流中所有数据被选中的概率相等。 问题求解&#xff1a;如果是长度已知或者有限的问题&…

Android okhttp3使用实例,OKhttp设置请求超时时间,okgo使用demo,SSL证书验证

SSL证书验证 rootca证书资源 调用 //信任所有证书 HTTPSCerUtils.setTrustAllCertificate(okHttpBuilder); //信任raw资源目录下的证书 HTTPSCerUtils.setCertificate(context, okHttpBuilder, R.raw.rootca); //传入证书…