内聚

观摩某位大佬的博客后对IOC的理解

99封情书 提交于 2019-12-03 00:39:51
灵感来源: https://www.cnblogs.com/superjt/p/4311577.html 1. 耦合:    在采用 面向对象 方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。    图一   耦合不仅出现在对象与对象之间,也出现在软件系统的各模块之间,以及软件系统和硬件系统之间。如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。为了解决对象之间的耦合度过高的问题,软件专家Michael Mattson提出了IOC理论,用来实现对象之间的“解耦”。 2. 控制反转(IOC):    IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”,还有些书籍翻译成为“控制反向”或者“控制倒置”。    面向对象设计及编程的基本思想 大致上就是:把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。    IOC理论提出的观点大体是这样的: 借助于“第三方”实现具有依赖关系的对象之间的解耦。     图二   IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”,全部对象的控制权全部上缴给

耦合与内聚分类

蹲街弑〆低调 提交于 2019-12-01 15:39:58
耦合部分 耦合可以分为以下几种,它们之间的耦合度 由高到低 排列如下: (1) 内容耦合 :一个模块 直接访问另一模块的内容 ,则称这两个模块为内容耦合。 若在程序中出现下列情况之一,则说明两个模块之间发生了内容耦合: 1. 一个模块直接访问另一个模块的内部数据。 2. 一个模块不通过正常入口而直接转入到另一个模块的内部。 3. 两个模块有一部分代码重叠(该部分代码具有一定的独立功能)。 4. 一个模块有多个入口。 内容耦合可能在汇编语言中出现。大多数高级语言都已设计成不允许出现内容耦合。这种耦合的耦合性最强,模块独立性最弱。 (2) 公共耦合 :一组模块 都访问同一个全局数据结构 ,则称之为公共耦合。公共数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。如果模块只是向公共数据环境输入数据,或是只从公共数据环境取出数据,这属于比较松散的公共耦合;如果模块既向公共数据环境输入数据又从公共数据环境取出数据,这属于较紧密的公共耦合。 公共耦合会引起以下问题: 1. 无法控制各个模块对公共数据的存取,严重影响了软件模块的可靠性和适应性。 2. 使软件的可维护性变差。若一个模块修改了公共数据,则会影响相关模块。 3. 降低了软件的可理解性。不容易清楚知道哪些数据被哪些模块所共享,排错困难。 一般地,仅当模块间共享的数据很多且通过参数传递很不方便时,才使用公共耦合。 (3)

软件系统设计基本原则

冷暖自知 提交于 2019-11-30 19:26:44
一、抽象 抽象是一种设计技术,说明一个实体的本质,而忽略不重要的方面。抽象将复杂的现象简化到可以分析、理解的程度。软件工程中从软件定义到软件开发要经历多个阶段,每前进一个阶段都可以看作是对软件解法的抽象层次的一次细化。抽象的最底层就是实现该软件的源程序代码。在进行模块化设计时也可以有多个抽象层次,最高抽象层次的模块用概括的方式叙述问题的解法,较低抽象层次的模块是对较高抽象层次模块对问题解法描述的细化。 二、模块化 模块在程序总是数据说明、可执行语句等程序对象的集合,或是单独命名和编址的元素。模块化是指将一个待开发的软件分解成若干个小的简单部分 -- 模块,每个模块可独立开发、测试,最后组装成完整的程序。只是一种分而治之的原则。模块化的目的是使程序的结构清晰,容易阅读、理解、测试和修改。 三、封装 封装是开发程序结构时使用的法则,每个程序的成分封装在一个单一的模块中,在定义每个模块时尽可能少的显露内部的处理。 封装对提高软件的可修改性、可测试性和可移植性有重要的作用。 四、模块独立 模块独立是指每个模块完成一个相对独立的特定子系统,并且与其他模块之间的联系简单。模块独立有两个标准:耦合性和内聚性。 1、耦合是模块之间的相对独立性(相互之间的紧密程度)的度量。耦合取决于各个模块之间接口的复杂程度、调用模块的方式以及通过接口信息类型等。 耦合按从弱到强的顺序分为以下几种: 非直接耦合

那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程

落爺英雄遲暮 提交于 2019-11-30 10:37:39
本文转载自: 熬夜与烟 那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程 https://www.cnblogs.com/aoyeyuyan/p/5495219.html 那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力。然而,你一定曾为这些“高深术语”感到过困扰——依赖倒置•控制反转•依赖注入•面向接口编程。也许时至今日,你仍对它们一知半解。不过就在今天,这一切都将彻底改变!我将带领你以一种全新的高清视角进入奇妙的编程世界,领略涵泳在这些“高深术语”中的活泼泼的地气,以及翩跹于青萍之末的云水禅心。 ·内聚 内聚,通俗的来讲,就是自己的东西自己保管,自己的事情自己做。 经典理论告诉我们,程序的两大要素:一个是数据( data),一个是操作( opration)。而 PASCAL之父 Nicklaus Wirth则进一步提出了“程序 = 数据结构 + 算法”的著名公式。虽然提法上有所差异,但是其根本内涵却是一致的,微妙的差别在于,“数据 + 操作”是微观的视域,“数据结构 + 算法”则是中观的视域。而在宏观的视域下,我认为“程序 = 对象 + 消息”。对象是什么?对象就是保管好自己的东西,做好自己的事情的程序模块——这就是内聚!传统的面向过程编程方法由于割裂了数据结构和算法,使得软件的内聚性普遍低迷,曾一度引发了软件危机。试想

从分而治之的思想到架构的设计

江枫思渺然 提交于 2019-11-29 05:44:28
辛巴当上了国王,他究竟要怎样才能管理好它的王国? 分治与总量控制 在上一篇文章里,我们得到两个信息: 人类大脑的信息实时处理能力存在上限 软件系统的复杂度远超人类大脑的复杂度处理上限 从而引出了人类解决大规模复杂问题的根本方法 分而治之 然而分而治之的需要基于一个前提进行 复杂度总量控制 因为绝大多数人类参与的问题中,分而治之都会引入额外的汇总求解成本。要尽量减少复杂度,有两个方面的思想层次的指导: 子问题在人类可控范围内尽量的大 每个子问题要高内聚,问题间要低耦合 子问题在人类可控范围内尽量大,则有助于减少子问题数量,因而减少合并处理子问题的成本。同时子问题不超过一个人处理能力的上限是因为,一旦超过一个人的能力范围,要多人合作解决同一个平面上问题的不同部分时,必然会因合作之间沟通等原因降低整体开发效率(1 + 1 < 2) 高内聚、低耦合是一体,但从不同角度描述的理念。高内聚,即所需完成的事情所需的资源在内部通过较少的代价即可取得,低耦合则是指代 输出给外部、或者从外部输入的资源尽可能的小。 在存在关联的子问题中,耦合并不可能消除。耦合这个词可能大多数程序员听起来有有点不好的意味,但耦合存在另外一个中性的名字——接口。所以,产生了一个接口就产生了一个耦合,接口参数越多,耦合就越强。 以上是对之前文章的回顾,本文后续将基于个人理解,讲述 分治的隔离级别,如何识别要拆分的点

高内聚松耦合在程序设计中如何做到

不打扰是莪最后的温柔 提交于 2019-11-28 06:07:14
内聚:一个模块内各个元素彼此结合的紧密程度 耦合:一个软件结构内不同模块之间互连程度的度量 我们一直追求着,高内聚,低耦合。 对于低耦合的理解是: 一个完整的系统,模块与模块之间,尽可能的使其独立存在。 也就是说,让每个模块,尽可能的独立完成某个特定的子功能。 模块与模块之间的接口,尽量的少而简单。 如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。 这样有利于修改和组合。 对于低耦合的理解是: 在一个模块内,让每个元素之间都尽可能的紧密相连。 也就是充分利用每一个元素的功能,各施所能,以最终实现某个功能。 如果某个元素与该模块的关系比较疏松的话,可能该模块的结构还不够完善,或者是该元素是多余的。 内聚和耦合,包含了横向和纵向的关系。功能内聚和数据耦合,是我们需要达成的目标。横向的内聚和耦合,通常体现在系统的各个模块、类之间的关系,而纵向的耦合,体现在系统的各个层次之间的关系。 对于我在编码中的困惑,我是这样想的,用面向对象的思想去考虑一个类的封装。 一个方法,如何封装,拿到现实生活中来看,看这种能力(方法)是否是属于这类事物(类)的本能。 如果是,就封装在这个类里。 如果不是,则考虑封装在其它类里。 如果这种能力,很多事物都具有,则一定要封装在这类事物的总类里。 如果这种能力,很多事物都会经常用到,则可以封装成一个总类的静态方法。   人们不易实现松耦合,因为

Spring IOC

感情迁移 提交于 2019-11-27 08:31:32
控制反转-Inversion Of Control Ioc—Inversion of Control,即“ 控制反转 ”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给 容器 控制, 而不是传统的在你的对象内部直接创建并且降低了 程序间的耦合 什么是程序的耦合 耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。耦合的强弱取决于模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。耦合性存在于各个领域,而非软件设计中独有的,但是我们只讨论软件工程中的耦合。在软件工程中,耦合指的就是就是对象之间的依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分模块的一个准则就是 高内聚低耦合 。 它有如下分类: (1) 内容耦合 。当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过正常入口而转入另一个模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用之。 (2) 公共耦合 。两个或两个以上的模块共同引用一个全局数据项,这种耦合被称为公共耦合