我認為接口存在的意義


接口的問題:
一、為什么要有接口,有抽象類或抽象方法做不好的嗎?
答案:沒有。

二、接口存在的意義
使用抽象類或抽象方法不可避免繼承問題。 一些功能性的抽象類或抽象函數隨着項目的擴展中和類體系的膨脹進而影響了整個系統類結構的清晰性。考慮如下的類結構:

Gun
  Pistol
  Rifle
    SniperRifle
在CS這個游戲中,我們知道,狙擊步槍和部份步槍都帶瞄准功能,所以可以考慮在Rifle這個類中定義OpenSight這個函數。

但如果在后繼的版本中,出現了一把帶瞄准鏡的手槍,那么修改這個類體系最容易的方法,就是把OpenSight這個函數上移到Gun類中。但帶來的問題是:
一、很多具體的類,完全不需要實現OpenSight,甚至不需要知道OpenSight,但類的繼承特性將這個函數都帶給了它們。
    
二、在Gun級別如果定義OpenSight是一個抽象函數,那么其它的子類至少得有一個實現(至少是忽略這個操作),這么多的槍支都需要寫一個忽略代碼,為了避免重復代碼的最簡單方法就是在Gun級別的OpenSight是一個虛函數,默認就是忽略,若要實現的類再對這個方法進行覆蓋並重寫。這個處理方法明顯的有點混亂。

三、個人認為最重要的一點,就是隨着項目的擴展類體系也在膨脹,最后多個不清晰的設計壓垮了系統。關於這一點,只有自己寫的代碼把自己絆倒過人,才有真實的體會。例子總是盡可能的簡單來快速說明問題,但壓垮駱駝的,不是第一根稻草,也不是第100根稻草。所以你在看網絡上關於接口的各種文檔時,你能找到的任何一個示例,也許都不能說明接口比抽象類和抽象函數有更好的優越性(至少對我而言是這樣)。

個人認為接口存在的意義是將類系統的類本質和非類必須的功能進行了清晰的划分,非類必須的功能,應該申明為接口。如上面所舉例的OpenSight這個函數。但如果我們把Fire和Full這兩個類本質的函數聲明為了接口,那么可能就設計過頭了。

但我總結的存在意義在某種意義也是很扯淡的,因為人的能力不同,所以識別和划分出來的接口也不相同,最終能不能帶來清晰的設計,那是另一會事。並不是使用了接口,系統的設計就必然變好。

其它的一些網絡上的觀點和我的認識:
一、使用接口進行通信是接口的優點,使編程可以並行。這也許是對的,但以數據庫編程為例,任何一個層,每個程序員都需要知道自己要處理的實體(表或視圖)的結構和業務意義,這就完全破壞了所謂各層獨立的說法。
二、面向接口編程是更先進的編程思想。這個很扯淡,別忘記了實現代碼還寫在類中。且我們根本無法舉例一個完全是面向接口來設計的系統。接口是對類系統組織上的完善。
三、一個人寫的系統不需要接口。去維護一個你5年前寫的3萬行以上代碼的項目試試。


在網絡上找到我認為好的簡要總結:
一、接口優缺點一句話總結:對擴展開放,對修改關閉。
二、一旦公開接口發布之后,它就不能被修改了。所以接口的職責應該尤其單一。
三、如果使用接口但是希望可擴展,那么仍然考慮使用抽象類:因為我們可以向類中添加新的成員——只要這個新成員不是abstract的,就不會破壞外部已經出現的依賴。不過加上之后,API設計是否合理,語義是否清晰,就是另一回事情了
四、類是靜態的抽象(事物的本質,特性等),而接口是動態的抽象(事物的行為等),選擇抽象類與接口,我的看法是,對一類事物進行抽象用抽象類,對行為進行抽象時用接口中。



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com