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

2.5 接口隔離原則

2.5.1 接口隔離原則定義

《代碼整潔之道》的作者Robert C.Martin于2002年給“接口隔離原則”的定義是:客戶端不應該被迫依賴于它不使用的方法(Clients should not be forced to depend on methods they do not use)。該原則還有另外一個定義:一個類對另一個類的依賴應該建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)。

接口隔離原則(Interface Segregation Principle,ISP)要求程序員盡量將臃腫龐大的接口拆分成更小的和更具體的接口,讓接口中只包含客戶感興趣的方法。

接口隔離是為了高內聚、低耦合。在實際的業務開發中,通常會先定義好需要開發的接口,并由各個服務類實現。但如果沒有經過考慮和設計,就很可能造成一個接口中包括眾多的接口方法,而這些接口并不一定在每一個類中都需要實現。這樣的接口很難維護,也不易于擴展,每一次修改驗證都有潛在的風險。

在具體應用接口隔離原則時,應該根據以下幾個規則衡量。

·接口盡量小,但是要有限度。一個接口只服務于一個子模塊或業務邏輯。

·為依賴接口的類定制服務。只提供調用者需要的方法,屏蔽不需要的方法。

·了解環境,拒絕盲從。每個項目或產品都有選定的環境因素,環境不同,接口拆分的標準就不同,要深入了解業務邏輯。

·提高內聚,減少對外交互。讓接口用最少的方法完成最多的事情。

2.5.2 模擬場景

對于接口隔離的場景,在平時簡單的業務開發中可能不會遇到,也可能體現得不明顯。為了讓大家更好地理解,舉一個《王者榮耀》中英雄技能的例子,如果由你來開發這樣的功能,會怎樣設計?

《王者榮耀》里有很多英雄,可以分為射手、戰士、刺客等,每個英雄有三種技能。這些技能該如何定義,讓每個英雄實現相應的技能效果呢?接下來就分別使用兩種不同的方式實現,來體現設計原則的應用。

2.5.3 違背原則方案

首先定義一個技能接口,實現的英雄都需要實現這個接口,進而實現自己的技能。

這里提供了四個技能的接口,包括射箭、隱襲、沉默、眩暈,每個英雄都實現這個接口。接下來實現兩個英雄:后羿和廉頗。當然,這里為了說明問題進行了簡化,英雄技能只有三個,與真實游戲中有所差別。

1.英雄后裔

在英雄后羿的類中,實現了三個技能,最后一個眩暈的技能是不需要實現的。

2.英雄廉頗

在英雄廉頗的類中,同樣只實現了三個技能,有一個射箭的技能沒有實現。

綜上,每個英雄的實現類里都有一個和自己無關的接口實現類,非常不符合設計模式,也不易于維護。因為不僅無法控制外部的調用,還需要維護對應的文檔,來說明這個接口不需要實現。如果有更多這樣的接口,就會變得非常麻煩。

2.5.4 接口隔離原則改善代碼

按照接口隔離原則的約定,應該在確保合理的情況下,把接口細分。保證一個松散的結構,也就是把技能拆分出來,每個英雄都可以按需繼承實現。

接下來分別定義四個技能接口,包括射箭(ISkillArchery)、隱身(ISkillInvisible)、沉默(ISkillSilent)、眩暈(ISkillVertigo),如下所示。

(1)ISkillArchery.

(2)ISkillInvisible.

(3)ISkillSilent.

(4)ISkillVertigo.

有了四個技能細分的接口,英雄的類就可以自由地組合了。

英雄后羿的實現。

英雄廉頗的實現。

現在可以看到這兩個英雄的類都按需實現了自己需要的技能接口。這樣的實現方式就可以避免一些本身不屬于自己的技能還需要不斷地用文檔的方式進行維護,同時提高了代碼的可靠性,在別人接手或者修改時,可以降低開發成本和維護風險。

主站蜘蛛池模板: 安达市| 普兰县| 广州市| 井冈山市| 和平县| 正镶白旗| 晋州市| 青神县| 蕲春县| 鄂温| 桃江县| 黄浦区| 高陵县| 海城市| 新丰县| 秦皇岛市| 泗水县| 东乌| 阿克陶县| 闽清县| 安阳市| 建水县| 冀州市| 平山县| 扬中市| 五家渠市| 兴化市| 舟山市| 武胜县| 迭部县| 江华| 四平市| 宁安市| 无棣县| 望都县| 读书| 波密县| 韶关市| 孙吴县| 黄陵县| 温宿县|