Posted on 2005-09-16 08:19
切爾斯基 閱讀(2421)
評(píng)論(3) 編輯 收藏
Interface在OO中處于核心地位,針對(duì)接口編程更是OOP的核心原則之一,但即使將該原則貫徹到底的COM/CORBA,依然面對(duì)大量的依賴(lài)、耦合,牽一接口而動(dòng)全部客戶(hù)的修改
另一方面,Hurb Sutter說(shuō)各種編程范式,包括面向?qū)ο螅诵亩际悄撤N管理依賴(lài)性,降低依賴(lài)性的技術(shù),那么.Net Attribute, XDoclet, Java Annotation代表的Attribute Oriented Programming在降低依賴(lài)性上又前進(jìn)了多少呢?
以Java Annotation為例,與Java Interface做個(gè)對(duì)比
1,調(diào)用方式
實(shí)現(xiàn)Interface的類(lèi) |
被Annotation標(biāo)注的類(lèi) |
Call by Signature:就像現(xiàn)實(shí)生活中的螺絲螺母,插座插頭,必須完全吻合 |
Call by Semantics:就像卡西利亞斯被罰下,臨時(shí)指定肥羅當(dāng)守門(mén)員一樣,肥羅并不需要實(shí)現(xiàn)GateKeeper接口,只需臨時(shí)被標(biāo)記為具有GateKeeper屬性,便可以合法的禁區(qū)內(nèi)手球 |
2,名稱(chēng)沖突(可看作是對(duì)函數(shù)簽名的依賴(lài),當(dāng)然,無(wú)論Annotation還是Interface,都不允許存在完全相同的全名)
實(shí)現(xiàn)Interface的類(lèi) |
被Annotation標(biāo)注的類(lèi) |
Yes,無(wú)法解決從多個(gè)接口繼承來(lái)的方法具有相同簽名不同語(yǔ)義的問(wèn)題 |
No,Annotation是類(lèi)型,不會(huì)存在完全相同的全名 |
3,編譯時(shí)依賴(lài)(對(duì)Annotation或Interface的依賴(lài))
Annotation |
Interface |
被Annotation標(biāo)注的類(lèi) |
使用了Annotation的客戶(hù) |
不使用Annotation的客戶(hù) |
實(shí)現(xiàn)Interface的類(lèi) |
使用Interface的客戶(hù) |
不使用Interface的客戶(hù) |
Yes |
Yes |
No,只要“被Annotation標(biāo)注的類(lèi)”已經(jīng)被編譯為bytecode,如以jar包的形式存在,那么使用了該類(lèi),但沒(méi)有用到Annotation的客戶(hù),編譯時(shí)不需要依賴(lài)Annotation所在的Jar包 |
Yes |
Yes |
Yes,即使客戶(hù)沒(méi)有用到該類(lèi)所實(shí)現(xiàn)的所有接口,編譯時(shí)該類(lèi)涉及的所有接口的定義必須可見(jiàn) |
4,運(yùn)行時(shí)依賴(lài)(對(duì)Annotation或Interface的依賴(lài))
Annotation |
Interface |
被Annotation標(biāo)注的類(lèi) |
使用了Annotation的客戶(hù) |
不使用Annotation的客戶(hù) |
實(shí)現(xiàn)Interface的類(lèi) |
使用Interface的客戶(hù) |
不使用Interface的客戶(hù) |
No(即使RetentionPolicy是RUNTIME,我的測(cè)試中也是不依賴(lài)Annotation的,只要客戶(hù)不涉及Annotation,但我不確定RUNTIME的真正含義是什么) |
Yes |
No(其實(shí)運(yùn)行時(shí)對(duì)Annotation的依賴(lài)被轉(zhuǎn)移到了客戶(hù)) |
Yes |
Yes |
Yes |
5,對(duì)Annotation或Interface本身更改的依賴(lài)
Annotation |
Interface |
被Annotation標(biāo)注的類(lèi) |
使用了Annotation的客戶(hù) |
不使用Annotation的客戶(hù) |
實(shí)現(xiàn)Interface的類(lèi) |
使用Interface的客戶(hù) |
不使用Interface的客戶(hù) |
Yes |
Yes |
No |
Yes |
Yes |
No |
6,對(duì)“被Annotation標(biāo)注的類(lèi)不再被標(biāo)注”或“實(shí)現(xiàn)Interface的類(lèi)不再實(shí)現(xiàn)Interface”這類(lèi)更改的依賴(lài)
Annotation |
Interface |
被Annotation標(biāo)注的類(lèi) |
使用了Annotation的客戶(hù) |
不使用Annotation的客戶(hù) |
實(shí)現(xiàn)Interface的類(lèi) |
使用Interface的客戶(hù) |
不使用Interface的客戶(hù) |
Yes |
No |
No |
Yes |
Yes |
No |
總共 5 處被藍(lán)色字體標(biāo)注的地方,也就是Annotation在降低依賴(lài)性上優(yōu)于Interface的 5 個(gè)方面,也算更接近于“你不需要為你用不到的東西付出代價(jià)”這一語(yǔ)言和庫(kù)的設(shè)計(jì)理念
當(dāng)然,Annotation有其它的代價(jià),幾個(gè)潛在的可能就是“使用方便性”和“性能”