官术网_书友最值得收藏!

1.6 接口設計

軟件的未來其實在很大程度上要看軟件接口的前景如何。我們知道,計算機世界里的“接口”一詞具有兩種眾所周知的含義:其一是指軟件本身的狹義“接口”,如各種軟件開發API等;其二則是指人與軟件之間的交互界面。

接口設計一般出現在軟件開發的概要設計階段,概要設計要根據需求劃分模塊,而模塊之間的聯系就是通過定義接口實現的。例如有模塊A和模塊B,兩者互相不知道對方實現的細節,當模塊A要用到模塊B中的功能時,就要使用模塊B提供的外部接口(接口可以理解為一些功能函數的原型,包括函數名、參數列表和返回值);同樣,模塊A內可以定義內部接口,供模塊A內部的函數調用。當各個模塊中的接口完全設計好并通過評審后,各個模塊就可以進行獨立的詳細設計及編碼了。下面將詳細地講解接口設計的六大原則內容。

1.6.1 單一職責原則

單一職責原則(Single Responsibility Principle),簡稱SRP。就一個類而言,應該僅有一個引起它變化的原因。要避免一個類實現多個功能,否則當發生更改時會影響其他功能而致使復用成為不可能。使用的時候應該根據實際業務情況而定。實際使用時,類很難做到職責單一,但是接口的職責應該盡量單一。

1.6.2 依賴倒置原則

依賴倒置原則(Dependence Inversion Principle,DIP)。程序設計應該依賴抽象接口,而不應該依賴具體實現,即為接口編程思想。接口是穩定的,實現是不穩定的,一旦接口確定,就不應該再進行修改了。根據接口的實現,可以根據具體問題和情況,采用不同的手段去實現。

依賴倒置原則的定義需注意以下3點。

(1)高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象。

(2)抽象不應該依賴細節。

(3)細節應該依賴抽象。

依賴的3種寫法如下。

(1)構造函數傳遞依賴對象。

(2)Setter方法傳遞依賴對象。

(3)接口聲明依賴對象。

最佳實踐:

(1)每個類盡量都有接口或抽象類,或者抽象類和接口兩者都具備。

(2)任何類都不應該從具體類派生。

(3)盡量不要覆寫基類的方法。

(4)結合里氏替換原則使用。

(5)變量的表面類型應盡量是接口或抽象類。

1.6.3 迪米特法則

迪米特法則(Law of Demeter,LOD)又稱最少知識原則(Least Knowledge Principle,簡稱LKP)。它表示一個實體應當盡可能少地與其他實體之間發生相互作用。

低耦合要求:

(1)朋友類是一種出現在成員變量、方法的輸入和輸出參數中的類。方法體內部的類不屬于朋友類。

(2)迪米特法則要求類“內斂”一點,盡量不要對外公布太多的public方法和非靜態的public變量,多使用private、protected、package-private等訪問權限。

(3)如果一個方法放在本類中,既不增加類之間的關系,也對本類不產生負面影響,就放置在本類中。

(4)謹慎使用Serializable。

1.6.4 里氏替換原則

里氏替換原則(Liskov Substitution Principle,LSP)。子類對象能夠替換其父類對象被調用,即在程序中,任何調用父類對象實現的功能都可以調用子類對象來替換。

所有引用父類的位置必須能透明地使用其子類的對象,里氏替換原則為確保子類良好地繼承父類定義了以下規范。

(1)子類必須完全實現父類的方法。

(2)子類可以有自己的“個性”(屬性和方法)。

(3)覆寫或實現父類的方法時輸出結果可以被縮小。

(4)覆蓋或實現父類的方法時輸入參數可以被放大。

提示:在類中調用其他類時務必要使用父類或接口,如果不能使用父類或接口,則說明類的設計已經違背了LSP原則。

1.6.5 接口隔離原則

接口,這里是指用interface關鍵字定義的接口,使用多個隔離接口比使用單個接口要好。經常提到的降低耦合、降低依賴主要也是通過接口隔離原則來達到的。

接口隔離原則的定義需注意以下兩點。

(1)客戶端不應該依賴它不需要的接口。

(2)類之間的依賴關系應該建立在最小的接口上。

概括地說,即建立單一接口,不要建立臃腫、龐大的接口。通俗來講,接口盡量細化,同時接口中的方法盡量少。

保障接口的純潔性有以下4點需要注意。

(1)接口要盡量小。

(2)定制服務。

(3)接口要高內聚。

(4)接口的設計是有限度的。

最佳實踐:

(1)一個接口只服務于一個子模塊或業務邏輯。

(2)通過業務邏輯壓縮接口中的public方法,盡量讓接口簡單、代碼不繁雜。

(3)對于已經被污染的接口,應盡量去修改。若變更的風險較大,則采用適配器模式進行轉化處理。

(4)了解環境,拒絕盲從。每個項目或產品都有特定的環境因素,設計時不要盲從或跟從別人的設計,而要根據業務邏輯進行較佳的接口設計。

1.6.6 開閉原則

開閉原則表示的是程序的設計應該不約束擴展(即擴展開放),但又不能修改已有功能(即修改關閉)。

軟件實體包括以下幾個部分。

(1)項目和軟件產品中按照一定的邏輯規則劃分的模塊。

(2)抽象和類。

(3)方法。

變化的3種類型如下。

(1)邏輯變化。

(2)可見視圖變化。

(3)子模塊變化。

主站蜘蛛池模板: 城口县| 从江县| 富川| 寿阳县| 内丘县| 永修县| 阜康市| 涿鹿县| 长武县| 贡嘎县| 临沧市| 嵩明县| 陆川县| 虞城县| 顺平县| 晋中市| 合川市| 泾川县| 东方市| 临邑县| 平乡县| 祁连县| 龙岩市| 岳普湖县| 固原市| 邵武市| 武功县| 余江县| 确山县| 镇远县| 廊坊市| 永泰县| 蓝山县| 泽普县| 鞍山市| 临漳县| 肥乡县| 白沙| 沅陵县| 新泰市| 南开区|