内聚和耦合(自己的理解)

网上对于内聚和耦合的资料太多,这里结合我的感受和其他人的答案http://blog.csdn.net/zhiquan/article/details/4255161谈谈自己的理解

以下是我对内聚和耦合的理解(例子来源于生活)。

  1.内聚:

    i.偶然内聚:如果一个模块的各成分之间毫无关系,则称为偶然内聚。

      eg.在敲代码时,我们通常对一段代码进行初始化function init(){}。而对各个模块进行的初始化代码通常都是没有关系的,我们将这些代码包装成一个模块,此时这个模块就是偶然内聚的(杨老师在课上提出过这种内聚方式)。

    ii.逻辑内聚。几个逻辑上相关的功能被放在同一模块中,则称为逻辑内聚。如一个模块读取各种不同类型外设的输入。尽管逻辑内聚比偶然内聚合理一些,但逻辑内聚的模块各成分在功能上并无关系,即使局部功能的修改有时也会影响全局,因此这类模块的修              改也比较困难。

      eg.通过模块读取参数不同来执行不同的方法,我感觉类似于函数的重载。在我的快乐运算中有通过传入的参数判断执行的具体方法。此时属于逻辑内聚。代码自:https://github.com/yanyige/CourseWork/blob/master/Week6/js/generation.js):

        其中,通过传入的参数来确定生成算式的不同。

    iii.时间内聚。如果一个模块完成的功能必须在同一时间内执行(如系统初始化),但这些功能只是因为时间因素关联在一起,则称为时间内聚。

      eg.这里例子同偶然内聚,将没有关系(只是时间因素的关系)的代码包装到一起,构成一个代码块。

    (4) 过程内聚。如果一个模块内部的处理成分是相关的,而且这些处理必须以特定的次序执行,则称为过程内聚。

      eg.在快乐运算中,显示每条答案时候必须先计算所有题目(每次生成5道题)的答案,再依次显示到相应位置中。此时,先生成,再计算,最后显示,形成了过程内聚。代码自:https://github.com/yanyige/CourseWork/blob/master/Week6/js/generation.js):

      

function showFormula(items) { //显示公式并且计算答案for(var j = 0 ; j < items.length ; j++){var str = items[j];var strFormula = transforFraction(str);var text = document.getElementById("problem-table").children[0].children;text[j].children[1].innerHTML = strFormula;// console.log('strFormula = '+ strFormula);var S1 = [] // 保存运算符的栈var S2 = [] // 保存中间结果的栈for (var i = 0; i < str.length; i++) {// if (!isNaN(str[i])){if(str[i] instanceof Fraction){S2.push(str[i]);}else if(isOperate(str[i])){if(!S1.length){S1.push(str[i]);} else{var s1Top = S1.pop();S1.push(s1Top);if(s1Top == '('){S1.push(str[i]);}else{var prior1 = getPriorty(s1Top);var prior2 = getPriorty(str[i]);if(prior1 < prior2){S1.push(str[i]);}else{var tempOp = S1.pop();S2.push(tempOp);i --;}}}}else if(str[i] == '('){S1.push(str[i]);}else if(str[i] == ')'){var tempOp = S1.pop();while(tempOp != '('){S2.push(tempOp);tempOp = S1.pop();}}}while(S1.length){var tempOp = S1.pop();S2.push(tempOp);}
ANS = getAns(S2);        // anss.push(Number(ANS.toFixed(2)));// allAnss.push(Number(ANS.toFixed(2)));
        anss.push(ANS);allAnss.push(ANS);}
}

    (5) 通信内聚。如果一个模块的所有成分都操作同一数据集或生成同一数据集,则称为通信内聚。

      eg.在快乐运算中,一次“小试牛刀”中的题目保存var allFormulas = [];这个数组中,每次计算或者添加算式均在操作此数组,这时形成了通信内聚。代码自:https://github.com/yanyige/CourseWork/blob/master/Week6/js/generation.js):

    

var anss=[];
var ANS;//记录结果
var youranss = [];
var score = 0;
var tScore = 0;
var allFormulas = []; //通信内聚
var allAnss=[];//通信内聚
var allYourAnss=[];//通信内聚

    (6) 顺序内聚。如果一个模块的各个成分和同一个功能密切相关,而且一个成分的输出作为另一个成分的输入,则称为顺序内聚。

      eg.在快乐运算中,计算方法(function showFormula(items){})接受生成方法(function getFormula(MAXNUM, MAXDIGIT, PUNCTUATION, BRACKET, DENOMINATOR){})的返回值item。此时形成了顺序内聚。

    
    (7) 功能内聚。模块的所有成分对于完成单一的功能都是必须的,则称为功能内聚。

      eg.在之前未完成作品计算器中,计算器中“取反”操作,“点击数字”操作,“点击运算符操作”,都是为了完成计算表达式。此时属于功能内聚。

 

  2.耦合

    (1)内容耦合。当一个模块直接修改或操作另一个模块的数据,或者直接转入另一个模块时,就发生了内容耦合。此时,被修改的模块完全依赖于修改它的模块。

      eg.我觉得在js的经典问题“闭包”中,产生了内容耦合。

    (2)公共耦合。两个以上的模块共同引用一个全局数据项就称为公共耦合。

      eg.在以前写代码时,容易在全局定义一个变量,此时在不同的函数中使用这个变量,就产生了公共耦合。

    (3)控制耦合。一个模块在界面上传递一个信号(如开关值、标志量等)控制另一个模块,接收信号的模块的动作根据信号值进行调整,称为控制耦合。

      eg.经常我们会在代码中做一个flag进行标记此时的状态,当flag为0时执行部分代码,flag为1时执行另一部分代码,此时产生控制耦合。

    (4)标记耦合。模块间通过参数传递复杂的内部数据结构,称为标记耦合。此数据结构的变化将使相关的模块发生变化。

      eg.两个模块之间传递复杂的数据结构(例如对象),就产生了标记耦合。

    (5)数据耦合。模块间通过参数传递基本类型的数据,称为数据耦合。

      eg.两个模块之间传递简单的数据结构(例如number、boolean等),就产生了标记耦合。

    (6)非直接耦合。模块间没有信息传递时,属于非直接耦合。

      eg.我觉得和初始化init()函数类似,若其中代码毫无关联,则产生了非直接耦合。

 

以上就是我对内聚和耦合的理解。

转载于:https://www.cnblogs.com/yyyyg/p/5407075.html

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

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

相关文章

UIButton return(textField textView)

首先设置TextField 或 TextView的 delegate /UITextView - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {if ([text isEqualToString:"\n"]) {NSLog("点击return");return NO;}retur…

(转)交换机攻击方法描述

利用交换机漏洞的攻击方法如下&#xff1a;一、生成树攻击生成树协议(STP)可以防止冗余的交换环境出现回路。要是网络有回路&#xff0c;就会变得拥塞不堪&#xff0c;从而出现广播风暴&#xff0c;引起MAC表不一致&#xff0c;最终使网络崩溃。使用STP的所有交换机都通过网桥协…

数据结构-顺序表(C语言实现)

主函数代码&#xff08;main.c&#xff09; #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include "sqlist.h" int main() {sqlist *list NULL,*list_next NULL;int pos 0;int i, err, value;int arr[10] { 10,20,30,40,50,60,70,80,90,100 };i…

shell的logo含义_Shell(壳牌石油)标志历史

荷兰皇家壳牌集团(Royal Dutch Shell&#xff0c;又译蚬壳)是世界第二大石油公司&#xff0c;总部位于荷兰海牙。荷兰皇家壳牌集团由荷兰皇家石油与英国的壳牌两家公司合并组成。荷兰皇家石油于1890年创立&#xff0c;并获得荷兰女王特别授权&#xff0c;因此被命名为荷兰皇家石…

无用的设计模式之装饰者模式

为什么80%的码农都做不了架构师&#xff1f;>>> 前言 装饰者设计模式本来是很常用的模式&#xff0c;常用到随处可见&#xff0c;jdk的bio设计都是遵循这个模式的&#xff0c;偶然的机会发现&#xff0c;貌似jdk中bio的装饰者模式和设计模式中的装饰者设计模式却有…

winform 程序制作自己的数字签名(续)

在上一篇文章《winform 程序制作自己的数字签名》中我们已经可以得到我们程序定制的数字签名了&#xff0c;但是比较讨厌的是每次编译之后&#xff0c;数字签名需要重新手动添加。 我们需要的是在程序编译时自动添加数字签名。 那实际上vs已经提供了此功能&#xff0c;具体操作…

转-HTC 手机生产日期,产地查询 以及 SN码 IMEI码 查询等问题汇总

问&#xff1a;什么是IMEI码&#xff1f;什么是SN码&#xff1f; 答&#xff1a;IMEI码&#xff0c;国际移动装备辨识码&#xff08;International Mobile Equipment Identity number&#xff0c;IMEI&#xff09;。SN码即Serial Number&#xff0c;产品序列号。 问&#xff1a…

数据结构带头结点单向不循环链表(C语言版)

main.c,负责测试 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include<stdlib.h> #include "linklist.h" int main() {LNode* listNULL;int i 0,err 0;datatype a 40,return_value0;datatype arr[] { 20,10,90,100,50,40,20,60,70,80 }…

Django设置TIME_ZONE和LANGUAGE_CODE为中国区域

Django默认的timezone是 TIME_ZONE America/Chicago LANGUAGE_CODE en-us 设置为中国区域&#xff1a; TIME_ZONE Asia/Shanghai LANGUAGE_CODE zh-cn 另外你可以根据情况设置 \Lib\site-packages\django\conf\global_settings.py 里面的时区转载于:https://www.cnblogs.co…

每天10分钟用python学数据分析_用Python做数据分析,Numpy,Pandas,matp

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼用Python做数据分析&#xff0c;Numpy&#xff0c;Pandas&#xff0c;matplotlib是怎么也绕不开的三个包&#xff0c;我最开始学习pandas是看的《利用Python进行数据分析》&#xff0c;看了好几遍&#xff0c;不是从头到尾看了好几…

使用Shell脚本查询服务器硬件信息

1、为了方便查询服务器的硬件信息&#xff0c;将需要查询的内容整理成Shell脚本&#xff0c;输出自己想要的格式。其实就是通过dmidecode命令输出&#xff0c;然后通过sed&#xff0c;awk&#xff0c;cut命令的处理。2、此脚步适用于HP DL系列的服务器&#xff0c;Dell PowerEd…

SQL Server 数据库维护脚本合集[005]-删除数据库所有用户表

--*****************************************************************************-- 作 者: qwu;-- 用 途: 删除数据库所有用户表;-- 版 本: v1.0-- 创建日期: 2011-3-23;-- 用 法: 设置use [数据库名],-- 注 意: !!!!!!!!慎用!!!!!!!!!;-- 修改历史: …

数据结构无头结点单向不循环链表(C语言版)

main.c(负责测试&#xff09; #include <stdlib.h> #include <stdio.h> #include <time.h> #include "nohead.h" int main() {LNode *list NULL;struct score_st data[10],mydata,data1;int i 0;srand((unsigned)time(NULL));//初始化数组for (…

ad network

全称&#xff1a;Advertising network。即“在线广告联盟”。一种介于想出售广告空间的网站与想在网站上刊登广告的广告主之间的平台。比较知名的公司有Google的AdSense、好耶、仁合传媒、传漾Adsame以及ValueClick等 Ad Network的本质真相是什么? 随视传媒COO薛晨女士在11月1…

python123查找指定字符输入m_大数据应用人才培养系列教材 Python语言 刘 鹏 张 燕 总主编 李肖俊 主编 刘 河 钟 涛 副主编....

Presentation on theme: "大数据应用人才培养系列教材 Python语言 刘 鹏 张 燕 总主编 李肖俊 主编 刘 河 钟 涛 副主编."— Presentation transcript:大数据应用人才培养系列教材 Python语言 刘 鹏 张 燕 总主编 李肖俊 主编 刘 河 钟 涛 副主编第五章 字符串与正则…

C#生成带Logo二维码

1.下载ThoughtWorks.QRCode引用并添加在工程中 2.在实现类QRCodeEncoderDemo中引入Dll&#xff0c;添加方法 using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Drawing2D;using System.Linq;using System.Web;using ThoughtWorks.QRC…

【原】基础篇:第一篇,本节主要向大家介绍Ext的最基础的话题

http://www.cnblogs.com/mogen_yin/archive/2009/04/30/1447236.html ExtJS是一个Ajax框架&#xff0c;是一个用javascript写的&#xff0c;用于在客户端创建丰富多彩的web应用程序界面。ExtJS可以用来开发RIA也即富客户端的AJAX应用 ExtJS是一个用javascript写的&#xff0c;主…

linux_base-f10-10_7 linuxulator is not (kld)loaded

# cd linux_base-f10/# make install clean> linux_base-f10-10_7 linuxulator is not (kld)loaded.*** Error code 1 解决办法&#xff1a;kldload linux 再重新执行make install clean命令即可。转载于:https://www.cnblogs.com/seasonsstory/p/3148870.html

margin的缩写

margin:0px;//页面内容距离浏览器边框的距离均为0px&#xff1b; margin:0px 5px;网页内容距离浏览器边框上下0px。左右5px margin&#xff1a;0px 10px 5px&#xff1b;//上0 &#xff0c;下10&#xff0c;左右5px margin:0px 1px 2px 3px;//上 右 下 左 0 1 2 3px; 其他的类…

前后端分离的项目部署到tomcat_如何在开发时部署和运行前后端分离的JavaWeb项目...

在开发中大型的JavaEE项目时&#xff0c;前后端分离的框架逐渐成为业界的主流&#xff0c;传统的单机部署前后端在同一个项目中的工程项目越来越少。这类JavaWeb项目的后端通常都采用微服务的架构&#xff0c;后端会被分解为诸多个小项目&#xff0c;然后使用dubbozookeeper或者…