面向对象和面向过程的区别有哪些?

2022-12-12 0 229

这些年想不通的深奥名词——倚赖倒转•控制反转•倚赖注入•面向全国USB程式设计

这些年,空气中仿佛还能闻到六朝盛世的缥缈,因此你绝不允许他们的脸上有黑眼圈,时刻保持活力。然而,你一定曾为这些“深奥名词”感到过困扰。也许如今,你仍对它们敬而远之。不过就在那时,这一切都将抹杀!我将带领你以一种全新的高画质视点进入美妙的程式设计世界,领略到涵泳在这些“深奥名词”中的hondayz的血肉,以及翩翩于青萍杜博韦的唐人三界。

面向对象和面向过程的区别有哪些?

·contained

内聚,浅显的来讲,是他们的小东西他们看管,他们的事他们做。

经典理论告诉他们,流程的两大要素:两个是统计数据(data),两个是操作方式(opration)。而 PASCAL之父Nicklaus Wirth则进一步提出了“流程 =计算机流程+ 演算法”的著名公式。虽然论调上有所差异,但是其根本内涵却是一致的,微妙的差别在于,“统计数据 + 操作方式”是微观的空间性,“计算机流程 + 演算法”则是唯识的空间性。而在宏观的空间性下,我认为“流程 = 第一类 + 消息”。第一类是什么?第一类是看管好他们的小东西,搞好他们的事的流程模块——这是contained!传统的面向全国操作方式过程程式设计方式由于错位了计算机流程和演算法,使得应用软件的contained性普遍低迷,曾一度引起了应用软件经济危机。换言之,大家都他们的小东西不太回去看管,他们的事也不太回去做,不引起经济危机才怪呢!当然,第一类的contained只是contained的两个层次,在不同的尺度下其实都有contained的明确要求,比如方式也要讲contained,构架也要讲contained。

《易经·彖传》中讲“乾道变化,各正性命,凤泉太康,乃肋毛”,是明确要求每两个个体因袭着各别的自然地理而努力成就各别的品格,然后各别保全,彼此和合,最终达成宇宙的圆满状态。《孟子·科洛涅县》中,子路问君子。子曰:“克己复礼以敬。”曰:“Dakshina而已乎?”曰:“克己复礼以安人”,着实明确的教诲他们要急速提高自身的contained性,最大限度地减少给他人造成的麻烦,从而达到安人、安百姓、安天下的目标。我想,成长的操作方式过程是两个急速提升contained的操作方式过程。“他们的小东西他们看管,他们的事他们做”,这些童年时期的教诲,放到那时仍能让不少“大人”脸红不已。太多的人看管不太好他们的“小东西”,看管不太好他们的身体,看管不太好他们的婚姻,更看管不太好他们如蜘蛛网般颤动荡漾的躁动的心。至于搞好他们的事,则着实汝愚,甚至很多人连他们的事是什么都搞不清,因此日复一日,饱食终日。contained,是两个值得他们回去反思的问题。

·倚赖·耦合

在面向全国第一类程式设计中,第一类自身是contained的,是看管好自己的统计数据,完成好他们的操作方式的,而对外界呈现出他们的状态和行为。但是,没有绝对的自力更生,对外开放也是必要的!两个第一类,往往需要跟其他第一类打交道,既包括获知其他第一类的状态,也包括仰赖其他第一类的行为,而一旦这样的事发生时,他们便称该第一类倚赖于另一第一类。只要两个第一类之间存在一方倚赖一方的关系,那么他们就称这两个第一类之间存在耦合。 比如妈妈和baby,妈妈要随时关注baby的睡、醒、困、哭、尿等等状态,baby则要仰赖妈妈的喂奶、哄睡、换纸尿裤等行为,从流程的意义上说,二者互相倚赖,因此也存在耦合。首先要说,耦合是必要的。他们来看以下这个实验。

【王阳明与山中之花

View Code

由于王阳明这个第一类不倚赖山花这个第一类,又没有其他的方式来获知山花的盛开状态,所以他要么选择不说,要么瞎说,但不说编译是通不过,而瞎说作为王阳明来讲也是通不过的,所以这个系统是无法成立的。要想系统成立,必须要这样写:

public bool AdmireFlowers() { return flower.IsBloomed; ; }

无论这个山花第一类是怎么来的,作为参数传入还是作为属性设置、还是在内部构造出来,总之,王阳明与山花之间发生了倚赖,二者之间产生了耦合。 当然,这是两个很浅显的问题。有趣的是王阳明对此事的看法:“你未看花时,花与你同寂;你来看花,花于你则一时分明起来。可见心外无物!”王阳明讲的是对的!“心外无物”翻译技名词言是这样的:不存在耦合的两个第一类必然拿不到对方的引用!

·耦合度·解耦和

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

·倚赖倒转(Dependence Inversion Principle)

解耦和最重要的原则是倚赖倒转原则:

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

《资本论》中都曾阐释倚赖倒转原则——在商品经济的萌芽时期,出现了物物交换。假设你要买两个IPhone,卖IPhone的老板让你拿一头猪跟他换,可是你并没有养猪,你只会程式设计。所以你找到一位养猪户,说给他做两个养猪的APP来换他一头猪,他说换猪可以,但是得用一条金项链来换——所以这里就出现了一连串的第一类倚赖,从而造成了严重的耦合灾难。解决这个问题的最好的办法是,买卖双发都倚赖于抽象——也是货币——来进行交换,这样一来耦合度就大为降低了。

再举两个程式设计中的倚赖倒转的例子。他们知道,在通信中,消息的收发和消息的处理往往密不可分。就一般的通信框架而言,消息的收发通常是已经实现了的,而消息的处理则是需要用户来自定义完成的。先看两个正向倚赖的例子:轻量级通信引擎StriveEngine。tcpServerEngine是StriveEngine.dll提供通信引擎,它发布有两个MessageReceived事件。假设我定义了两个CustomizeHandler类来用于消息处理,那么CustomizeHandler的内部需要预定tcpServerEngine的MessageReceived事件,因此customizeHandler倚赖于tcpServerEngine,这是两个普通的倚赖关系,也是高层模块倚赖于低层模块。

面向对象和面向过程的区别有哪些?
面向对象和面向过程的区别有哪些?

ESFramework通信框架则应用了倚赖倒转原则。ESFramework定义了两个IcustomizeHandlerUSB,用户在进行消息处理时,实现该USB,然后将其注入到rapidPassiveEngine客户端通信引擎之中。

View Code

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

·控制反转(Inversion of Control)

控制反转跟倚赖倒转是如出一辙的两个概念,当存在倚赖倒转的时候往往也存在着控制反转。但是控制反转也有他们的独特内涵。

首先他们要区分两个角色,server 跟 Client,也是服务方和客户方。提供服务端的一方称为服务方,请求服务的一方称为客户方。他们最熟悉的例子是分布式应用的C/S构架,服务端和客户端。其实除此之外,C/S关系处处可见。比如在TCP/IP协议栈中,他们知道,每层协议为上一层提供服务,那么这里是两个C/S关系。当他们使用开发框架时,开发框架是作为服务方,而他们他们编写的业务应用是客户方。当Client调用server时,这个叫做一般的控制;而当server调用Client时,是他们所说的控制反转,同时他们也将这个调用称为“回调”。控制反转跟依赖倒转都是一种程式设计思想,倚赖倒转着眼于调用的形式,而控制反转则着眼于流程流程的控制权。一般来说,流程的控制权属于server,而一旦控制权交到Client,就叫控制反转。比如你去下馆子,你是Client餐馆是server。你点菜,餐馆负责做菜,流程流程的控制权属于server;而如果你去自助餐厅,流程流程的控制权就转到Client了,也是控制反转。

面向对象和面向过程的区别有哪些?

控制反转的思想体现在诸多领域。比如事件的发布/ 订阅是一种控制反转,GOF设计模式中也多处体现了控制反转,比如典型的模板方式模式等。而开发框架则是控制反转思想应用的集中体现。比如之前所举的ESFramework通信框架的例子,通信引擎回调用户自定义的消息处理器,这是两个控制反转。以及ESFramework回调用户自定义的群组关系和好友关系,回调用户自定义的用户管理器以管理在线用户相关状态,回调用户自定义的登陆验证处理,等等不一而足。再比如与ESFramework一脉相承的轻量级通信引擎StriveEngine,通过回调用户自定义的通信协议来实现更加灵活的通信。

由此他们也可以总结出开发框架与类库的区别:使用开发框架时,框架掌握流程流程的控制权,而使用类库时,则是应用流程掌握流程流程的控制权。或者说,使用框架时,流程的主循环位于框架中,而使用类库时,流程的主循环位于应用流程之中。框架会回调应用流程,而类库则不会回调应用流程。ESFramework和StriveEngine中最主要的第一类都以engine来命名,他们也可以看出框架对于流程主循环的控制——它会为你把握方向、眼看前方、轻松驾驭!

·倚赖注入(Dependency Injection)

倚赖注入与倚赖倒转、控制反转的关系仍旧是一本万殊。倚赖注入,就其广义而言,即是通过“注入”的方式,来获得倚赖。他们知道,A第一类倚赖于B第一类,等价于A第一类内部存在对B第一类的“调用”,而前提是A对名词,称为“倚赖内生”,二者根本的差异即在于,我所倚赖的第一类的创建工作是否由我他们来完成。当然,这个是广义的倚赖注入的概念,而他们一般不会这样来使用。他们通常使用的,是倚赖注入的狭义的概念。不过,直接陈述其定义可能会过于诘屈聱牙,他们还是从具体的例子来看。

面向对象和面向过程的区别有哪些?

  比如OMCS网络语音视频框架,它实现了多媒体设备(麦克风、摄像头、桌面、电子白板)的采集、编码、网络传送、解码、播放(或显示)等相关的一整套流程,可以快速地开发出视频聊天系统、视频会议系统、远程医疗系统、远程教育系统、网络监控系统等等基于网络多媒体的应用系统。然而,OMCS直接支持的是通用的语音视频设备,而在某些系统中,需要使用网络摄像头或者特殊的视频采集卡作为视频源,或者其它的声音采集设备作为音频源,OMCS则提供了扩展USB——用户他们实现这个扩展的USB,然后以“倚赖注入”的方式将第一类实例注入到OMCS中,从而完成对音、视频设备的扩展。

“倚赖注入”常常用于扩展,尤其是在开发框架的设计中。从某种意义上来说,任何开发框架,天生都是不完整的应用流程。因此,两个优秀的开发框架,不仅要让开发者能够重用这些久经考验的的卓越的解决方案,也要让开发者能够向框架中插入自定义的业务逻辑,从而灵活自由地适应特定的业务场景的需要——也是说要具备良好的可扩展性。比如上面提到的OMCS网络语音视频框架可应用于音、视频聊天系统、视频会议系统、远程医疗系统、远程教育系统、网络监控系统等等基于网络多媒体的应用系统;以及ESFramework通信框架能够应用于即时通讯系统,大型多人在线游戏、在线网页游戏、文件传送系统、统计数据采集系统、分布式OA系统等任何需要分布式通信的应用软件系统中——这种良好的扩展性都与“倚赖注入”的使用密不可分!

·面向全国USB程式设计

谈到最后,“面向全国USB程式设计”已经是呼之欲出。无论是倚赖倒转、控制反转、还是倚赖注入,都已经蕴含着“面向全国USB程式设计”的思想。面向全国USB,就意味着面向全国抽象。作为哲学范畴而言,规定性少称为抽象,规定性多称为具体。而USB,是流程中的一种典型的“抽象”的形式。面向全国抽象,就意味着面向全国事物的本质规定性,摆脱感性杂多的牵绊,从而把握住“必然”——而这本身就意味着自由,因为自由是对必然的认识。

也许以上的这段论述太过“哲学”,但是“一本之理”与“万殊之理”本身就“体用不二”——总结来看,倚赖倒转、控制反转、倚赖注入都围绕着“解耦和”的问题,而同时自始至终又都是“面向全国USB程式设计”的方式——因此,“面向全国USB程式设计”天生是“解耦和”的好办法。由此也印证了从“抽象”到“自由”的这一段范畴的辩证衍化。

“面向全国第一类”与“面向全国USB”并非两种不同的方式学,“面向全国USB”其实是“面向全国第一类”的内在明确要求,是其一部分内涵的集中表述。他们对于理想应用软件的期待常被概括为“高contained,低耦合”,这也是整个现代应用软件开发方式学所追求的目标。面向全国第一类方式学作为现代应用软件开发方式学的代表,本身就蕴含着“高contained,低耦合”的思想精髓,从这个意义上来说,“面向全国第一类”这个表述更加侧重于“高contained”,“面向全国USB”的表述则更加侧重于“低耦合”——不过是同一事物的不同侧面罢了。

除此之外,他们也能从“面向全国USB程式设计”的思想中得到“世俗”的启迪——《孟子》里面讲,不患无位,患所以立;不患人之不己知,患其不能也——是教诲他们要面向全国“我有没有的本事?”、“我有没有能力?”这样的USB,而不是面向全国“我有没有搞到位子?”、“别人了不了解我?”这样的具体。依我看,这是莫大的教诲!

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务