探討接口編程之意義與優(yōu)勢(shì)
接口編程相信大家都知道是怎么回事,下面主要對(duì)接口編程的好處進(jìn)行一些總結(jié)。
在項(xiàng)目中的意義:
在傳統(tǒng)的項(xiàng)目開發(fā)過(guò)程中,由于客戶的需求經(jīng)常變化,如果不采用面向接口編程,那么我們必須不停改寫現(xiàn)有的業(yè)務(wù)代碼。改寫代碼可能產(chǎn)生新的BUG,而且改寫代碼還會(huì)影響到調(diào)用該業(yè)務(wù)的類,可能全都需要修改,影響系統(tǒng)本身的穩(wěn)定性。而且為了將改寫代碼帶來(lái)的影響最小,我們不得不屈服當(dāng)前的系統(tǒng)狀況來(lái)完成設(shè)計(jì),代碼質(zhì)量和穩(wěn)定性更低。當(dāng)這種情況積累到一定程度時(shí),系統(tǒng)就會(huì)出現(xiàn)不可預(yù)計(jì)的錯(cuò)誤,代碼凌亂,不易讀懂,后接手的人無(wú)法讀懂代碼,系統(tǒng)的維護(hù)工作越來(lái)越重,最終可能導(dǎo)致項(xiàng)目失敗。
接口在項(xiàng)目就是一個(gè)業(yè)務(wù)邏輯,面向接口編程就是先把客戶的業(yè)務(wù)提取出來(lái),作為接口。業(yè)務(wù)具體實(shí)現(xiàn)通過(guò)該接口的實(shí)現(xiàn)類來(lái)完成。當(dāng)客戶需求變化時(shí),只需編寫該業(yè)務(wù)邏輯的新的實(shí)現(xiàn)類,通過(guò)更改配置文件(例如Spring框架)中該接口的實(shí)現(xiàn)類就可以完成需求,不需要改寫現(xiàn)有代碼,減少對(duì)系統(tǒng)的影響。
采用基于接口編程的項(xiàng)目,業(yè)務(wù)邏輯清晰,代碼易懂,方便擴(kuò)展,可維護(hù)性強(qiáng)。即使更換一批人員,新來(lái)的人依然可以快速上手。對(duì)于公司來(lái)說(shuō),意義更大。
在Java中的意義:
Java本身也是一個(gè)不斷完善的語(yǔ)言,他也在頻繁的改動(dòng)他的系統(tǒng)API來(lái)完善,他的API是一個(gè)龐大的體系,互相關(guān)聯(lián),如果不采用接口,而都是用實(shí)現(xiàn)類的話,那么API的改動(dòng)就會(huì)給整個(gè)體系帶來(lái)不穩(wěn)定。而且如果改動(dòng)API,那么就會(huì)有大量采用舊API的項(xiàng)目因無(wú)法正常運(yùn)行,會(huì)損失大量客戶。換句話說(shuō),JDK已經(jīng)發(fā)布的API是一種承諾,一經(jīng)發(fā)布就不能更改,即使原來(lái)API存在各種各樣的問(wèn)題(例如java.util.Properties類就是一個(gè)失敗的例子)也必須保留,于是在Java里就出現(xiàn)了不建議使用的方法,但JDK依然提供該方法。而且Java語(yǔ)言本身是一個(gè)跨平臺(tái)的語(yǔ)言,為了滿足在各個(gè)平臺(tái)下運(yùn)行,就必須把各種操作做成接口,在編寫各個(gè)平臺(tái)下的實(shí)現(xiàn)類。
設(shè)計(jì)模式的體現(xiàn):
在設(shè)計(jì)模式的原則里的開閉原則,其實(shí)就是要使用接口來(lái)實(shí)現(xiàn)對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。在設(shè)計(jì)模式的其他原則里也有關(guān)于基于接口編程的原則,即依賴倒轉(zhuǎn)的設(shè)計(jì)原則(DIP)----高層模塊不應(yīng)該依賴于底層模塊。二者都應(yīng)該依賴于抽象;抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象(注:來(lái)自《敏捷軟件開發(fā)--原則、模式與實(shí)踐》Robert C.Martin著)。在使用面向接口的編程過(guò)程中,將具體邏輯與實(shí)現(xiàn)分開,減少了各個(gè)類之間的相互依賴,當(dāng)各個(gè)類變化時(shí),不需要對(duì)已經(jīng)編寫的系統(tǒng)進(jìn)行改動(dòng),添加新的實(shí)現(xiàn)類就可以了,不在擔(dān)心新改動(dòng)的類對(duì)系統(tǒng)的其他模塊造成影響。
編程也是一門藝術(shù),在C語(yǔ)言中靈活的使用指針是一門藝術(shù),在面對(duì)對(duì)象的程序中,靈活的使用接口也是一門藝術(shù)?,F(xiàn)在項(xiàng)目中,功能越來(lái)越復(fù)雜,只設(shè)計(jì)了***的類,對(duì)于整個(gè)系統(tǒng)來(lái)說(shuō)沒(méi)有多大意義,現(xiàn)在的項(xiàng)目更注重各個(gè)功能模塊的整合及可維護(hù)性,接口的設(shè)計(jì)就顯得更為重要了。程序設(shè)計(jì)不再是設(shè)計(jì)類的具體實(shí)現(xiàn),而是從整個(gè)項(xiàng)目出發(fā),設(shè)計(jì)出可擴(kuò)展性強(qiáng)的接口。當(dāng)你發(fā)現(xiàn)越來(lái)越靈活的使用接口時(shí),那么你就從程序員升級(jí)為架構(gòu)師了??上椰F(xiàn)在依然是一名程序員,正在像架構(gòu)師努力。
在一些大型項(xiàng)目或者大型公司里,都是由架構(gòu)師編寫出系統(tǒng)接口,具體的實(shí)現(xiàn)類交給了程序員編寫,公司越大這種情況越明顯,所以在這些公司里做開發(fā),我們可能都不知道編寫出的系統(tǒng)是個(gè)什么樣子,每天做的工作可能就是做“填空題”了。建議大家閱讀敏《捷軟件開發(fā)--原則、模式與實(shí)踐》Robert C.Martin著這本書,那么對(duì)如何進(jìn)行接口編程就會(huì)有一個(gè)新的認(rèn)識(shí)了。
***,希望大家都能成為一個(gè)優(yōu)秀的系統(tǒng)架構(gòu)師。
我記得我曾經(jīng)在一篇帖子中提到過(guò),一個(gè)接口可以從三方面去考察:
制定者(或者叫協(xié)調(diào)者),實(shí)現(xiàn)者(或者叫生產(chǎn)者),調(diào)用者(或者叫消費(fèi)者)。
接口本質(zhì)上就是由制定者來(lái)協(xié)調(diào)實(shí)現(xiàn)者和調(diào)用者之間的關(guān)系。
所以通常說(shuō)的“面向接口編程”可以理解為:
只有實(shí)現(xiàn)者和調(diào)用者都遵循“面向接口編程”這個(gè)準(zhǔn)則,制定者的協(xié)調(diào)目的才能達(dá)到。
一個(gè)老生常談的例子就是JDBC。
優(yōu)點(diǎn):
接口和實(shí)現(xiàn)分離了,適于團(tuán)隊(duì)的協(xié)作開發(fā)。
更具體的優(yōu)點(diǎn):可以參看IDP原則。
缺點(diǎn):
設(shè)計(jì)難了,在你沒(méi)有寫實(shí)現(xiàn)的時(shí)候,就得想好接口,接口一變,全部亂套,這就是所謂的設(shè)計(jì)比實(shí)現(xiàn)難。
所以設(shè)計(jì)接口的人工資都高?。。?!
【相關(guān)閱讀】