posts - 56, comments - 77, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Annotation PK Interface

          Posted on 2005-09-16 08:19 切爾斯基 閱讀(2421) 評論(3)  編輯  收藏

          Interface在OO中處于核心地位,針對接口編程更是OOP的核心原則之一,但即使將該原則貫徹到底的COM/CORBA,依然面對大量的依賴、耦合,牽一接口而動全部客戶的修改

          另一方面,Hurb Sutter說各種編程范式,包括面向對象,核心都是某種管理依賴性,降低依賴性的技術,那么.Net Attribute, XDoclet, Java Annotation代表的Attribute Oriented Programming在降低依賴性上又前進了多少呢?

          以Java Annotation為例,與Java Interface做個對比

          1,調用方式

          實現Interface的類 被Annotation標注的類
          Call by Signature:就像現實生活中的螺絲螺母,插座插頭,必須完全吻合 Call by Semantics:就像卡西利亞斯被罰下,臨時指定肥羅當守門員一樣,肥羅并不需要實現GateKeeper接口,只需臨時被標記為具有GateKeeper屬性,便可以合法的禁區內手球

          2,名稱沖突(可看作是對函數簽名的依賴,當然,無論Annotation還是Interface,都不允許存在完全相同的全名)

          實現Interface的類 被Annotation標注的類
          Yes,無法解決從多個接口繼承來的方法具有相同簽名不同語義的問題 No,Annotation是類型,不會存在完全相同的全名

          3,編譯時依賴(對Annotation或Interface的依賴)

          Annotation Interface
          被Annotation標注的類 使用了Annotation的客戶 不使用Annotation的客戶 實現Interface的類 使用Interface的客戶 不使用Interface的客戶
          Yes Yes No,只要“被Annotation標注的類”已經被編譯為bytecode,如以jar包的形式存在,那么使用了該類,但沒有用到Annotation的客戶,編譯時不需要依賴Annotation所在的Jar包 Yes Yes Yes,即使客戶沒有用到該類所實現的所有接口,編譯時該類涉及的所有接口的定義必須可見

          4,運行時依賴(對Annotation或Interface的依賴)

          Annotation Interface
          被Annotation標注的類 使用了Annotation的客戶 不使用Annotation的客戶 實現Interface的類 使用Interface的客戶 不使用Interface的客戶
          No(即使RetentionPolicy是RUNTIME,我的測試中也是不依賴Annotation的,只要客戶不涉及Annotation,但我不確定RUNTIME的真正含義是什么) Yes No(其實運行時對Annotation的依賴被轉移到了客戶) Yes Yes Yes

          5,對Annotation或Interface本身更改的依賴

          Annotation Interface
          被Annotation標注的類 使用了Annotation的客戶 不使用Annotation的客戶 實現Interface的類 使用Interface的客戶 不使用Interface的客戶
          Yes Yes No Yes Yes No

          6,對“被Annotation標注的類不再被標注”或“實現Interface的類不再實現Interface”這類更改的依賴

          Annotation Interface
          被Annotation標注的類 使用了Annotation的客戶 不使用Annotation的客戶 實現Interface的類 使用Interface的客戶 不使用Interface的客戶
          Yes No No Yes Yes No

           

          總共 5 處被藍色字體標注的地方,也就是Annotation在降低依賴性上優于Interface的 5 個方面,也算更接近于“你不需要為你用不到的東西付出代價”這一語言和庫的設計理念

          當然,Annotation有其它的代價,幾個潛在的可能就是“使用方便性”和“性能”


          評論

          # re: Annotation PK Interface  回復  更多評論   

          2005-09-16 15:02 by 白衣
          把使用者接口 PK掉是框架號稱無侵入的基礎哦。
          Spring的做法是繞一個xml文件來定義,比如定義init-method 來 PK 自己的InitializingBean接口--afterPropertiesSet()函數.

          現在又多了annotation這種方式,和annotation和xml的PK.....

          # re: Annotation PK Interface  回復  更多評論   

          2005-09-16 15:20 by 切爾斯基
          如果能解決Source Code和Xml同步的問題(如設置init-method為void init(),過了兩天代碼中void init()被改為void before(),這時需要手工修改配置.xml),或者本質上滿足:

          1, Annotation和被Annotation的對應被解釋執行(意味著修改后不必重新編譯)
          2, Annotation和被Annotation的對應被自動同步(在任何一方修改后)

          侵入性就更少了;

          另外一種無侵入框架的技術是模板啊,呵呵,see see:
          http://blog.csdn.net/chelsea/archive/2005/08/05/446298.aspx

          # re: Annotation PK Interface  回復  更多評論   

          2005-12-21 04:33 by ajooo
          annotation也仍然要客戶代碼import這個annotation。除非該annation是標準,比如Renetion之類,否則仍然不爽。

          這點上,annoation不如xml。annotation你還需要給他貼上“守門員”標簽才行。而在xml中放meta data就相當于教練隨心所欲,想讓誰當守門員誰就是守門員。

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 河南省| 芜湖市| 温州市| 邳州市| 汉源县| 中阳县| 武宁县| 荣昌县| 蕉岭县| 公安县| 株洲市| 尼木县| 南阳市| 商洛市| 团风县| 平潭县| 阿克陶县| 洛南县| 临沂市| 赞皇县| 灵山县| 尤溪县| 剑川县| 龙江县| 富顺县| 无为县| 聂拉木县| 万安县| 田东县| 西盟| 长岭县| 湖南省| 炎陵县| 思南县| 阿勒泰市| 永靖县| 都兰县| 通江县| 毕节市| 南丰县| 松阳县|