依存関係逆転•コントロール•依存性の注入の反転•指向プログラミング・インタフェース - 依存反転西方•コントロール•依存性の注入の反転•指向プログラミング・インタフェースは、の面で進んでそれらを理解していません

それらの年では、かのように空気がフィニッシュに中国の唐王朝をかぐことができるので、あなたは彼の顔の輝きを許可されたことがない、常にその活力を維持します。依存性逆転•コントロール•依存性の注入の反転•指向プログラミング・インタフェース - しかし、あなたも気に感じる「という用語は、高度な」している人でなければなりません。それらのおそらく、今日、あなたはまだ不完全な知識。しかし、ちょうど今日、このすべてが完全に変更されます!私は世界の素晴らしい高精細プログラミングに全く新しい視点にあなたを導くでしょう、味は清平の端に軽く雲水禅だけでなく、これらの「深遠な用語」でガスの活発なスプラッシュを浸します。

・結束 

      結束、人気の高い用語、行うには自分のこと、自分自身のケアものです。

    データのための1(:古典的な理論は、プログラムの2つの要素ことを教えてくれるのデータ)、一つの操作(opration)。 PASCALの父ニクラウス  ヴィルトは、さらに「プログラム=アルゴリズム+データ構造、」有名な式を提案しています。いくつかの文言の違いが、その基本的な意味は同じですが、違いは微妙で、「データ+の操作は、」ビューの顕微鏡視野あり、「アルゴリズム+データ構造は、」視力の概念です。そして、マクロ目の前で、私は、「プログラム=オブジェクト+ニュース。」と思います オブジェクトとは何ですか?オブジェクトは、自分自身と自分の事を守るためにある、物事にプログラムモジュールを実行する-それが結束です!ソフトウェアでの結束一般的な低迷を行うデータ構造とアルゴリズムの分割による伝統的なプロセス指向のプログラミングは、一度ソフトウェアの危機を引き起こしました。ただ、我々はすべての豚が飛ぶとき、自分のことを行うためによくない、危機につながらない、自分の物事の世話をしていない、と思います!もちろん、オブジェクトのみを凝集凝集レベルで、実際には、異なるスケールの要件で結束を持っている、そのような方法はまた、凝集の話を、凝集アーキテクチャも必要です。

   「トゥアン伝記の書籍は」強調「の調和を維持する道路の変化、各定期的な生活を、リー・チンは、」それぞれの基金の個々の要件に従うと、自分の性格と自分の保全を達成するために努力、互いに調和する予定ですそして最終的に宇宙の完璧な状態に達します。「論語」は、紫呂は紳士に尋ねました。孔子は言った:「に関して自分を養う。」と言った:「?苦境ただ平和」と言った:「Anrenに自分を養う、」明らかに連続して他の人に最小化し、彼らの結束を高めるために私たちを教えていますトラブルは、ネイティブのアメリカ人、安全な人々、安全な世界の目標を達成するために引き起こしました。私が育ったことは、継続的な改善凝集プロセスのプロセスだと思います。無限今日これらの子供の頃の教えは、「大人」をたくさん作る、まだ入れ赤面「自分の事は、自分自身のことを行う、上保持します」。あまりにも多くの人々は、彼の悪い結婚を保ち、よくあなたの体を維持、しかし必死の心を浮動クモの糸のような振戦として、自分の悪いを維持し、自分の悪い「もの」を保ちます。さらに惨め自分のこと、でも自分の事はそう未、混乱しているものであっても、多くの人がそうであるように、一日中食べています。結束は、私たちの問題の良好な反射の価値があります。 

・・従属カップリング

       オブジェクト指向プログラミングでは、粘着性のあるオブジェクト自体、外の世界は、その状態や行動を示しながら、自分の操作を完了するために、あなたのデータを保護することです。しかし、絶対的な自立が必要で開く、ありません!オブジェクトは、多くの場合、他のオブジェクトの状態を通知するだけでなく、他のオブジェクトの動作に依存し、この問題が発生した後の両方を含む他のオブジェクトに対処する必要があり、我々は、オブジェクトが別のオブジェクトに依存していると言います。限り、二つのオブジェクトの1に依存当事者との関係のように、我々は2つのオブジェクト間の結合があると言うことができます。例えば、母親と赤ちゃん、目の赤ちゃんの睡眠を維持するために母親は、眠い、泣く、尿などの状態を覚ます、お互いに両方、プログラムの意味で、スリープ状態に戻って、彼女の母親の母乳の赤ちゃんに頼るおむつや他の行為を変更する必要があります依存し、したがってもカップリングです。言うべき最初の事は、結合が必要です。私たちは、以下の実験を見てください。

[王陽明山の花 ]

FlowersInMountainクラス
    {      
        公共BOOL IsBloomed //満開状態
        { 
            {trueに戻るGET;}            
        }         
    } 

    クラス王陽明
    { 
        /// <要約> 
        ///陽明Kuaijishanの花
        /// </要約> 
        /// <戻り値>花ブルーミングか</戻り> 
        公共BOOLのAdmireFlowers()
        { 
            リターン;? 
        } 
    } 

        静的な無効メイン()
        {           
            王陽明wym新しい新しい王陽明=(); 
            FlowersInMountain新しい新しいFlowersInMountainフラワー=(); 
            IF(wym.AdmireFlowers())
            { 
                MessageBox.Showは( "私は花が開いて見ました!"); 
            } 
            { 
                MessageBox.Showは( "私は花が開いていない見ました!"); 
            } 
        }

 王陽明ので、このオブジェクトは花の上に、このオブジェクト、および状態の花咲く学ぶための他の方法に依存しないので、彼は言っていないのいずれかを選択し、いずれかのナンセンスが、コンパイルパスを言うことはありませんが、王陽明としてナンセンスでもあり、合格、そのシステムを確立することはできません。システムを設定するには、書くことが必要です。

パブリックブールAdmireFlowers()
        { 
            flower.IsBloomedを返します。; 
        }

 

 被験者が花を来る方法であるかどうか、要するに、パラメータとして、またはプロパティセットとして、またはその内部構造に渡さ、王陽明二つの間の結合が生じる花間の依存関係が発生します。もちろん、これは非常にシンプルかつ明白な疑問です。興味深いことに問題の王陽明ビュー:「!あなたは沈黙あなたと一緒に過ごす、過ごすために見ていない、あなたはあなたのための花、花を見て心のうち見えるまで、時には明らかである」王陽明は、それが正しいと言いました!技術的な言語を翻訳する「心のうちは何も」これではありません。他の側への参照を取得するためにバインドされている2つのオブジェクトのないカップリングはありません! 

···カップリングとデカップリング

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

 

·依赖倒置(Dependence Inversion Principle)

    解耦和最重要的原则就是依赖倒置原则:

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

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

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

                

     而ESFramework通信框架则应用了依赖倒转原则。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——这就是一个依赖倒置的典范。 

·控制反转(Inversion of Control)

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

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

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

        

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

·依赖注入(Dependency Injection)

  依赖注入与依赖倒置、控制反转的关系仍旧是一本万殊。依赖注入,就其广义而言,即是通过“注入”的方式,来获得依赖。我们知道,A对象依赖于B对象,等价于A对象内部存在对B对象的“调用”,而前提是A对象内部拿到了B对象的引用。B对象的引用的来源无非有以下几种:A对象内部创建(无论是作为字段还是作为临时变量)、构造器注入、属性注入、方法注入。后面三种方式统称为“依赖注入”,而第一种方式我也生造了一个名词,称为“依赖内生”,二者根本的差异即在于,我所依赖的对象的创建工作是否由我自己来完成。当然,这个是广义的依赖注入的概念,而我们一般不会这样来使用。我们通常使用的,是依赖注入的狭义的概念。不过,直接陈述其定义可能会过于诘屈聱牙,我们还是从具体的例子来看。  

      

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

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

·面向接口编程

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

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

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

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

 

本文转载自:  熬夜与烟 

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

https://www.cnblogs.com/aoyeyuyan/p/5495219.html

 

おすすめ

転載: www.cnblogs.com/wangmin915/p/11579243.html