我认为接口存在的意义
生活随笔
收集整理的這篇文章主要介紹了
我认为接口存在的意义
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
接口的問(wèn)題:
一、為什么要有接口,有抽象類或抽象方法做不好的嗎?
答案:沒(méi)有。
二、接口存在的意義
使用抽象類或抽象方法不可避免繼承問(wèn)題。 一些功能性的抽象類或抽象函數(shù)隨著項(xiàng)目的擴(kuò)展中和類體系的膨脹進(jìn)而影響了整個(gè)系統(tǒng)類結(jié)構(gòu)的清晰性??紤]如下的類結(jié)構(gòu):
Gun
? Pistol
? Rifle
??? SniperRifle
在CS這個(gè)游戲中,我們知道,狙擊步槍和部份步槍都帶瞄準(zhǔn)功能,所以可以考慮在Rifle這個(gè)類中定義OpenSight這個(gè)函數(shù)。
但如果在后繼的版本中,出現(xiàn)了一把帶瞄準(zhǔn)鏡的手槍,那么修改這個(gè)類體系最容易的方法,就是把OpenSight這個(gè)函數(shù)上移到Gun類中。但帶來(lái)的問(wèn)題是:
一、很多具體的類,完全不需要實(shí)現(xiàn)OpenSight,甚至不需要知道OpenSight,但類的繼承特性將這個(gè)函數(shù)都帶給了它們。
?? ?
二、在Gun級(jí)別如果定義OpenSight是一個(gè)抽象函數(shù),那么其它的子類至少得有一個(gè)實(shí)現(xiàn)(至少是忽略這個(gè)操作),這么多的槍支都需要寫(xiě)一個(gè)忽略代碼,為了避免重復(fù)代碼的最簡(jiǎn)單方法就是在Gun級(jí)別的OpenSight是一個(gè)虛函數(shù),默認(rèn)就是忽略,若要實(shí)現(xiàn)的類再對(duì)這個(gè)方法進(jìn)行覆蓋并重寫(xiě)。這個(gè)處理方法明顯的有點(diǎn)混亂。
三、個(gè)人認(rèn)為最重要的一點(diǎn),就是隨著項(xiàng)目的擴(kuò)展類體系也在膨脹,最后多個(gè)不清晰的設(shè)計(jì)壓垮了系統(tǒng)。關(guān)于這一點(diǎn),只有自己寫(xiě)的代碼把自己絆倒過(guò)人,才有真實(shí)的體會(huì)。例子總是盡可能的簡(jiǎn)單來(lái)快速說(shuō)明問(wèn)題,但壓垮駱駝的,不是第一根稻草,也不是第100根稻草。所以你在看網(wǎng)絡(luò)上關(guān)于接口的各種文檔時(shí),你能找到的任何一個(gè)示例,也許都不能說(shuō)明接口比抽象類和抽象函數(shù)有更好的優(yōu)越性(至少對(duì)我而言是這樣)。
個(gè)人認(rèn)為接口存在的意義是將類系統(tǒng)的類本質(zhì)和非類必須的功能進(jìn)行了清晰的劃分,非類必須的功能,應(yīng)該申明為接口。如上面所舉例的OpenSight這個(gè)函數(shù)。但如果我們把Fire和Full這兩個(gè)類本質(zhì)的函數(shù)聲明為了接口,那么可能就設(shè)計(jì)過(guò)頭了。
但我總結(jié)的存在意義在某種意義也是很扯淡的,因?yàn)槿说哪芰Σ煌?#xff0c;所以識(shí)別和劃分出來(lái)的接口也不相同,最終能不能帶來(lái)清晰的設(shè)計(jì),那是另一會(huì)事。并不是使用了接口,系統(tǒng)的設(shè)計(jì)就必然變好。
其它的一些網(wǎng)絡(luò)上的觀點(diǎn)和我的認(rèn)識(shí):
一、使用接口進(jìn)行通信是接口的優(yōu)點(diǎn),使編程可以并行。這也許是對(duì)的,但以數(shù)據(jù)庫(kù)編程為例,任何一個(gè)層,每個(gè)程序員都需要知道自己要處理的實(shí)體(表或視圖)的結(jié)構(gòu)和業(yè)務(wù)意義,這就完全破壞了所謂各層獨(dú)立的說(shuō)法。
二、面向接口編程是更先進(jìn)的編程思想。這個(gè)很扯淡,別忘記了實(shí)現(xiàn)代碼還寫(xiě)在類中。且我們根本無(wú)法舉例一個(gè)完全是面向接口來(lái)設(shè)計(jì)的系統(tǒng)。接口是對(duì)類系統(tǒng)組織上的完善。
三、一個(gè)人寫(xiě)的系統(tǒng)不需要接口。去維護(hù)一個(gè)你5年前寫(xiě)的3萬(wàn)行以上代碼的項(xiàng)目試試。
在網(wǎng)絡(luò)上找到我認(rèn)為好的簡(jiǎn)要總結(jié):
一、接口優(yōu)缺點(diǎn)一句話總結(jié):對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。
二、一旦公開(kāi)接口發(fā)布之后,它就不能被修改了。所以接口的職責(zé)應(yīng)該尤其單一。
三、如果使用接口但是希望可擴(kuò)展,那么仍然考慮使用抽象類:因?yàn)槲覀兛梢韵蝾愔刑砑有碌某蓡T——只要這個(gè)新成員不是abstract的,就不會(huì)破壞外部已經(jīng)出現(xiàn)的依賴。不過(guò)加上之后,API設(shè)計(jì)是否合理,語(yǔ)義是否清晰,就是另一回事情了
四、類是靜態(tài)的抽象(事物的本質(zhì),特性等),而接口是動(dòng)態(tài)的抽象(事物的行為等),選擇抽象類與接口,我的看法是,對(duì)一類事物進(jìn)行抽象用抽象類,對(duì)行為進(jìn)行抽象時(shí)用接口中。
一、為什么要有接口,有抽象類或抽象方法做不好的嗎?
答案:沒(méi)有。
二、接口存在的意義
使用抽象類或抽象方法不可避免繼承問(wèn)題。 一些功能性的抽象類或抽象函數(shù)隨著項(xiàng)目的擴(kuò)展中和類體系的膨脹進(jìn)而影響了整個(gè)系統(tǒng)類結(jié)構(gòu)的清晰性??紤]如下的類結(jié)構(gòu):
Gun
? Pistol
? Rifle
??? SniperRifle
在CS這個(gè)游戲中,我們知道,狙擊步槍和部份步槍都帶瞄準(zhǔn)功能,所以可以考慮在Rifle這個(gè)類中定義OpenSight這個(gè)函數(shù)。
但如果在后繼的版本中,出現(xiàn)了一把帶瞄準(zhǔn)鏡的手槍,那么修改這個(gè)類體系最容易的方法,就是把OpenSight這個(gè)函數(shù)上移到Gun類中。但帶來(lái)的問(wèn)題是:
一、很多具體的類,完全不需要實(shí)現(xiàn)OpenSight,甚至不需要知道OpenSight,但類的繼承特性將這個(gè)函數(shù)都帶給了它們。
?? ?
二、在Gun級(jí)別如果定義OpenSight是一個(gè)抽象函數(shù),那么其它的子類至少得有一個(gè)實(shí)現(xiàn)(至少是忽略這個(gè)操作),這么多的槍支都需要寫(xiě)一個(gè)忽略代碼,為了避免重復(fù)代碼的最簡(jiǎn)單方法就是在Gun級(jí)別的OpenSight是一個(gè)虛函數(shù),默認(rèn)就是忽略,若要實(shí)現(xiàn)的類再對(duì)這個(gè)方法進(jìn)行覆蓋并重寫(xiě)。這個(gè)處理方法明顯的有點(diǎn)混亂。
三、個(gè)人認(rèn)為最重要的一點(diǎn),就是隨著項(xiàng)目的擴(kuò)展類體系也在膨脹,最后多個(gè)不清晰的設(shè)計(jì)壓垮了系統(tǒng)。關(guān)于這一點(diǎn),只有自己寫(xiě)的代碼把自己絆倒過(guò)人,才有真實(shí)的體會(huì)。例子總是盡可能的簡(jiǎn)單來(lái)快速說(shuō)明問(wèn)題,但壓垮駱駝的,不是第一根稻草,也不是第100根稻草。所以你在看網(wǎng)絡(luò)上關(guān)于接口的各種文檔時(shí),你能找到的任何一個(gè)示例,也許都不能說(shuō)明接口比抽象類和抽象函數(shù)有更好的優(yōu)越性(至少對(duì)我而言是這樣)。
個(gè)人認(rèn)為接口存在的意義是將類系統(tǒng)的類本質(zhì)和非類必須的功能進(jìn)行了清晰的劃分,非類必須的功能,應(yīng)該申明為接口。如上面所舉例的OpenSight這個(gè)函數(shù)。但如果我們把Fire和Full這兩個(gè)類本質(zhì)的函數(shù)聲明為了接口,那么可能就設(shè)計(jì)過(guò)頭了。
但我總結(jié)的存在意義在某種意義也是很扯淡的,因?yàn)槿说哪芰Σ煌?#xff0c;所以識(shí)別和劃分出來(lái)的接口也不相同,最終能不能帶來(lái)清晰的設(shè)計(jì),那是另一會(huì)事。并不是使用了接口,系統(tǒng)的設(shè)計(jì)就必然變好。
其它的一些網(wǎng)絡(luò)上的觀點(diǎn)和我的認(rèn)識(shí):
一、使用接口進(jìn)行通信是接口的優(yōu)點(diǎn),使編程可以并行。這也許是對(duì)的,但以數(shù)據(jù)庫(kù)編程為例,任何一個(gè)層,每個(gè)程序員都需要知道自己要處理的實(shí)體(表或視圖)的結(jié)構(gòu)和業(yè)務(wù)意義,這就完全破壞了所謂各層獨(dú)立的說(shuō)法。
二、面向接口編程是更先進(jìn)的編程思想。這個(gè)很扯淡,別忘記了實(shí)現(xiàn)代碼還寫(xiě)在類中。且我們根本無(wú)法舉例一個(gè)完全是面向接口來(lái)設(shè)計(jì)的系統(tǒng)。接口是對(duì)類系統(tǒng)組織上的完善。
三、一個(gè)人寫(xiě)的系統(tǒng)不需要接口。去維護(hù)一個(gè)你5年前寫(xiě)的3萬(wàn)行以上代碼的項(xiàng)目試試。
在網(wǎng)絡(luò)上找到我認(rèn)為好的簡(jiǎn)要總結(jié):
一、接口優(yōu)缺點(diǎn)一句話總結(jié):對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。
二、一旦公開(kāi)接口發(fā)布之后,它就不能被修改了。所以接口的職責(zé)應(yīng)該尤其單一。
三、如果使用接口但是希望可擴(kuò)展,那么仍然考慮使用抽象類:因?yàn)槲覀兛梢韵蝾愔刑砑有碌某蓡T——只要這個(gè)新成員不是abstract的,就不會(huì)破壞外部已經(jīng)出現(xiàn)的依賴。不過(guò)加上之后,API設(shè)計(jì)是否合理,語(yǔ)義是否清晰,就是另一回事情了
四、類是靜態(tài)的抽象(事物的本質(zhì),特性等),而接口是動(dòng)態(tài)的抽象(事物的行為等),選擇抽象類與接口,我的看法是,對(duì)一類事物進(jìn)行抽象用抽象類,對(duì)行為進(jìn)行抽象時(shí)用接口中。
總結(jié)
以上是生活随笔為你收集整理的我认为接口存在的意义的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 乐嘉版 人物性格,红黄蓝绿
- 下一篇: flutter 微信登录 包名不对,请检