【正文】
接類,這將違背開閉原則,系統(tǒng)擴(kuò)展性較差。 ? 現(xiàn)使用合成復(fù)用原則對其進(jìn)行重構(gòu)。 Page 48 合成復(fù)用原則 ? 合成復(fù)用原則實(shí)例 ?實(shí)例解析 DB Ut il+ ge tC on ne ct io n ()...: C on ne ct io nSt ud en tD A O dB O pe ra to r : D BU til++++se tD BO pe ra to r ( DB Ut il d BO pe ra to r)fin dS tu de nt By I d (S trin g id )fin dA llS tu de nt s ()sa ve (S tu de nt DT O s tu de nt )...: v oi d: S tu de nt DT O: L ist: i ntT ea ch er DA O dB O pe ra to r : D BU til++++se tD BO pe ra to r ( DB Ut il d BO pe ra to r)fin dT ea ch er By I d (S trin g id )fin dA llT ea ch er s ()sa ve (T ea ch er DT O te ac he r)...: v oi d: T ea ch er DT O: L ist: i ntNe wD BU til+ ge tC on ne ct io n ()...: C on ne ct io nPage 49 迪米特法則 ? 迪米特法則定義 ?迪米特法則 (Law of Demeter, LoD)又稱為最少知識原則 (Least Knowledge Principle, LKP),它有多種定義方法,其中幾種典型定義如下: ? (1) 不要和“陌生人”說話 。 ? (2) 只與你的直接朋友通信 。 ? (3) 每一個(gè)軟件單位對其他的單位都只有最少的知識,而且局限于那些與本單位密切相關(guān)的軟件單位。 Page 50 迪米特法則 ? 迪米特法則分析 ?迪米特法則來自于 1987年秋美國東北大學(xué) (Northeastern University)一個(gè) 名為“ Demeter”的研究項(xiàng)目 。 ?簡單來說,迪米特法則就是指 一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少的與其他實(shí)體發(fā)生相互作用 。這樣,當(dāng)一個(gè)模塊修改時(shí),就會盡量少的影響其他的模塊,擴(kuò)展會相對容易,這是對軟件實(shí)體之間通信的限制,它要求限制軟件實(shí)體之間通信的寬度和深度。 Page 51 迪米特法則 ? 迪米特法則分析 ?在迪米特法則中,對于一個(gè)對象,其 朋友 包括以下幾類: ? (1) 當(dāng)前對象本身 (this); ? (2) 以參數(shù)形式傳入到當(dāng)前對象方法中的對象; ? (3) 當(dāng)前對象的成員對象; ? (4) 如果當(dāng)前對象的成員對象是一個(gè)集合,那么集合中的元素也都是朋友; ? (5) 當(dāng)前對象所創(chuàng)建的對象。 ?任何一個(gè)對象,如果滿足上面的條件之一,就是當(dāng)前對象的“朋友”,否則就是“陌生人”。 Page 52 迪米特法則 ? 迪米特法則分析 ?迪米特法則可分為狹義法則和廣義法則。 在狹義的迪米特法則中,如果兩個(gè)類之間不必彼此直接通信 , 那么這兩個(gè)類就不應(yīng)當(dāng)發(fā)生直接的相互作用 ,如果其中的一個(gè)類需要調(diào)用另一個(gè)類的某一個(gè)方法的話,可以通過 第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用 。 Page 53 迪米特法則 ? 迪米特法則分析 ?狹義的迪米特法則:可以 降低類之間的耦合 ,但是會在系統(tǒng)中增加大量的小方法并散落在系統(tǒng)的各個(gè)角落,它可以使一個(gè)系統(tǒng)的局部設(shè)計(jì)簡化,因?yàn)槊恳粋€(gè)局部都不會和遠(yuǎn)距離的對象有直接的關(guān)聯(lián),但是也會 造成系統(tǒng)的不同模塊之間的通信效率降低 ,使得系統(tǒng)的不同模塊之間不容易協(xié)調(diào)。 ?廣義的迪米特法則: 指對對象之間的信息流量、流向以及信息的影響的控制 ,主要是 對信息隱藏的控制 。信息的隱藏可以使各個(gè)子系統(tǒng)之間脫耦,從而允許它們獨(dú)立地被開發(fā)、優(yōu)化、使用和修改,同時(shí)可以促進(jìn)軟件的復(fù)用,由于每一個(gè)模塊都不依賴于其他模塊而存在,因此每一個(gè)模塊都可以獨(dú)立地在其他的地方使用。一個(gè)系統(tǒng)的規(guī)模越大,信息的隱藏就越重要,而信息隱藏的重要性也就越明顯。 Page 54 迪米特法則 ? 迪米特法則分析 ?迪米特法則的主要用途在于 控制信息的過載 : ? 在類的劃分上,應(yīng)當(dāng)盡量 創(chuàng)建松耦合的類 ,類之間的耦合度越低,就越有利于復(fù)用,一個(gè)處在松耦合中的類一旦被修改,不會對關(guān)聯(lián)的類造成太大波及; ? 在類的結(jié)構(gòu)設(shè)計(jì)上,每一個(gè)類都應(yīng)當(dāng) 盡量降低其成員變量和成員函數(shù)的訪問權(quán)限 ; ? 在類的設(shè)計(jì)上,只要有可能, 一個(gè)類型應(yīng)當(dāng)設(shè)計(jì)成不變類 ; ? 在對其他類的引用上, 一個(gè)對象對其他對象的引用應(yīng)當(dāng)降到最低 。 Page 55 迪米特法則 ? 迪米特法則實(shí)例 ?實(shí)例說明 ? 某系統(tǒng)界面類 (如 Form Form2等類 )與數(shù)據(jù)訪問類(如 DAO DAO2等類 )之間的調(diào)用關(guān)系較為復(fù)雜 ,如圖所示: Page 56 迪米特法則 ? 迪米特法則實(shí)例 ?實(shí)例解析 Form 1 Form 2 Form 3 Form 4 Form 5DA O1 DA O2 DA O3 DA O4Cont rolle r1 Cont rolle r2Page 57 本章小結(jié) ? 對于面向?qū)ο蟮能浖到y(tǒng)設(shè)計(jì)來說,在支持可維護(hù)性的同時(shí),需要提高系統(tǒng)的可復(fù)用性。 ? 軟件的復(fù)用可以提高軟件的開發(fā)效率,提高軟件質(zhì)量,節(jié)約開發(fā)成本,恰當(dāng)?shù)膹?fù)用還可以改善系統(tǒng)的可維護(hù)性。 ? 單一職責(zé)原則 要求在軟件系統(tǒng)中,一個(gè)類只負(fù)責(zé)一個(gè)功能領(lǐng)域中的相應(yīng)職責(zé)。 ? 開閉原則 要求一個(gè)軟件實(shí)體應(yīng)當(dāng)對擴(kuò)展開放,對修改關(guān)閉,即在不修改源代碼的基礎(chǔ)上擴(kuò)展一個(gè)系統(tǒng)的行為。 ? 里氏代換原則 可以通俗表述為在軟件中如果能夠使用基類對象,那么一定能夠使用其子類對象。 Page 58 本章小結(jié) ? 依賴倒轉(zhuǎn)原則 要求抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象;要針對接口編程,不要針對實(shí)現(xiàn)編程。 ? 接口隔離原則 要求客戶端不應(yīng)該依賴那些它不需要的接口,即將一些大的接口細(xì)化成一些小的接口供客戶端使用。 ? 合成復(fù)用原則 要求復(fù)用時(shí)盡量使用對象組合,而不使用繼承。 ? 迪米特法則 要求一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少的與其他實(shí)體發(fā)生相互作用。 Page 59 ? ? ? xxx工作室收集分享 ?