内聚,耦合,解耦和,依赖倒置

摘要:
别人触摸自己的东西一定很不舒服。微观数据+操作中观数据结构+算法宏观对象+消息耦合度。解耦和耦合的程度是耦合度,即相互依赖的程度。从某种意义上说,无论其他对象依赖于你还是你依赖于其他对象,耦合本质上都是自由的敌人。假设我为消息处理定义了CustomizeHandler类,那么CustomizeHandler的内部部分需要调度tcpServerEngine的MessageReceived事件。因此,定制的处理程序依赖于tcpServerEngine,这是一个常见的依赖项,也就是说,高级模块依赖于低级模块。

内聚:
通俗的来讲,就是自己的东西自己保管,自己的事情自己做。自己拥有的东西让别人来碰 你肯定也很不舒服吧

微观 数据+操作
中观 数据结构+算法
宏观 对象+消息


耦合度··解耦和

耦合的程度就是耦合度,也就是双方依赖的程度。上文所说的妈妈和baby就是强耦合。而你跟快递小哥之间则是弱耦合。一般来说耦合度过高并不是一件好事。就拿作为IT精英的你来说吧,上级随时敦促你的工作进度,新手频繁地需要你指导问题,隔三差五还需要参加酒局饭局,然后还要天天看领导的脸色、关注老婆的心情,然后你还要关注代码中的bug 、bug、bug,和需求的变化、变化、变化,都够焦头烂额了,还猝不及防的要关注眼睛、颈椎、前列腺和头发的状态,然后你再炒个股,这些加起来大概就是个强耦合了。从某种意义上来说,耦合天生就与自由为敌,无论是其他对象依赖于你,还是你依赖其他对象。比如有人嗜烟、酗酒,你有多依赖它们就有多不自由;比如有人家里生了七八个娃,还有年迈的父母、岳父母,他们有多依赖你,你就有多不自由。所以老子这样讲:“五音令人耳聋,五色令人目盲,驰骋狩猎令人心发狂,难得之货令人行妨。”卢梭也是不无悲凉的说“人生而自由,却又无往而不在枷锁中”。因此,要想自由,就必须要降低耦合,而这个过程就叫做解耦和。


·依赖倒置(Dependence Inversion Principle)
解耦和最重要的原则就是依赖倒置原则:

高层模块不应该依赖底层模块,他们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

tcpServerEngine是StriveEngine.dll提供通信引擎,它发布有一个MessageReceived事件。假设我定义了一个CustomizeHandler类来用于消息处理,那么CustomizeHandler的内部需要预定tcpServerEngine的MessageReceived事件,因此customizeHandler依赖于tcpServerEngine,这就是一个普通的依赖关系,也就是高层模块依赖于低层模块。

tcpServerEngine
MessageReceived事件


CustomizeHandler
注册到tcpServerEngine的MessageReceived事件


形成依赖关系 也就是高层模块依赖于低层模块


ESFramework定义了一个IcustomizeHandler接口,用户在进行消息处理时,实现该接口,然后将其注入到rapidPassiveEngine客户端通信引擎之中


class CustomizeHandler: ICustomizeHandler
{
public void HandleInformation(string sourceUserID, int informationType, byte[] info)
{
······
}

public byte[] HandleQuery(string sourceUserID, int informationType, byte[] info)
{
······
}
}

IRapidPassiveEngine rapidPassiveEngine = ESPlus.Rapid.RapidEngineFactory.CreatePassiveEngine();
CustomizeHandler customizeHandler = new CustomizeHandler();
rapidPassiveEngine.Initialize("ID", "passWord", "127.0.0.1", 9000, customizeHandler);


很明显,相比于上一个例子,这里的依赖关系变成了rapidPassiveEngine依赖于customizeHandler,也就是说依赖关系倒置了过来,上层模块不再依赖于底层模块,而是它们共同依赖于抽象。rapidPassiveEngine依赖的是IcustomizeHandler接口类型的参数,customizeHandler同样是以实现的接口的方式依赖于IcustomizeHandler——这就是一个依赖倒置的典范。


共同去依赖 一个抽象的东西

最最初 B(框架里的处理消息的方法,底层)是需要有消息处理的具体方法A(用户自定义的处理方法) 通过事件委托 达到最初A注入用户自定的处理消息方法A

最初 A(消息处理,高层)要实现功能需要有一个B(框架的事件,底层)对象
{这里好像就实现了依赖倒置 此时A的消息处理方法起作用需要拿到B的事件并注入进去}

B(事件,底层) 去依赖 一个抽象的接口C(抽象接口)

A(消息处理,高层)实现接口C(抽象接口)

C相当于 一个参数的规范 规定, 里边要有的参数 属性 方法 等等 都可以在里边

底层需要自由,不需要依赖 等待一个具体的方法, 因此 我抽象出来一个接口,规范一下如果你想你的出里消息的方法起作用,就按照这个接口时间我需要用到的方法,此时诞生了C(抽象的接口) 此时底层继续运作 这叫 共同以来抽象, 依赖接口

 大部分转载,加入自己的理解,以交流学习用

免责声明:文章转载自《内聚,耦合,解耦和,依赖倒置》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇eclipse下进行c开发,使用zeromqtime模块和datetime模块详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

从零开始制作Galgame——我的Ren'py学习笔记(一)

然后点击“启动工程”点击“开始游戏”效果应该是这样的好了,现在你就制作出了属于自己的第一个游戏角色在一般的Galgame中,不是所有话都是“旁白”说的,一个完整的游戏里面应该有主角那么,怎么在ren'py中定义角色呢我们把刚才的代码更改一下definel=Characterlabelstart:l"HelloWorld!...

H3C系列之三层交换机系统版本升级

本文中涉及的硬件和软件交换机:H3CS3600-28TP-SItftp软件:tftpd32软件升级文件:S36SI_ E-CMW310-R1702P44.zip升级文件描述如下:S36SI_ E-CMW310-R1702P44-S168.bin168-bitSSH加密应用程序S3600_ V606.btmbootrom(downloadedynetworkp...

springMVC使用map接收入参 + mybatis使用map 传入查询参数

测试示例:控制器层使用映射来接收请求参数。从Debug中可以看到,请求中的参数值都是字符串形式。如果接收参数的映射直接传输到服务,mybatis将在接收参数时报告错误。因此,您需要首先对请求中的参数1packageorg.slsale进行预处理。测验23导入java.util。日期4导入java.util。HashMap;5导入java.ut...

十四、ES开启密码认证

所以我们需要为es head和kibana添加密码认证。4、 为kibana设置密码。1.为kibana配置证书。因为kibana和es之间的连接也需要证书加密通信。mkdir-p/etc/kibana/certscp/etc/selastic search/certs-*/etc/kibana/certs/2.授予kibana主要权限。权限必须为kiban...

64/32位oracle客户端安装配置详细教程

如何连接远程oracle数据库?.点击完成,正式安装产品…如何实验安装是否可用?...

关于异常STATUS_IN_PAGE_ERROR(0xC0000006)

表示0x%p处的指令引用了位于0x%p的内存。由于0x%x的I/O错误状态,未将所需数据放入内存。设备如果读取出错,驱动程序可以返回此异常。其定义如下:////MessageId:STATUS_IN_PAGE_ERROR////MessageText:////Theinstructionat0x%preferencedmemoryat0x%p.Therequ...