国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java中鮮為人知的缺點(下)

2019-11-18 13:28:19
字體:
來源:轉載
供稿:網友

  最后討論一下無法繼續多種類的裝配問題。該問題的原因在于java不答應多層繼續。
  
  Java不能進行多層繼續。這一點大多經常作為其優點而不是缺點而被提出來。C++答應多層繼續,但結果卻致使程序變得非常復雜,而且還產生了難以理解的錯誤。
  
  多層繼續在裝配時會很復雜
  
  多層繼續會在如下幾個方面導致混亂。第一是名稱的沖突。在繼續具有相同名稱的其他類時,不知道是哪個類的方法將會被調用(圖5)。這一點是在一個類繼續兩個已經繼續了某一個類的類時經常發生的問題。這種繼續稱為菱形繼續(圖6)。在分別改寫(override)最上層的類的方法后,就會引起被最下層的類所調用的問題。
   Java中鮮為人知的缺點(下)(圖一)


  圖5●在需要繼續兩個具有相同名稱的方法的超級類時,其名稱就會發生沖突。這一點是經常被作為多層繼續的問題而指出來的地方
   Java中鮮為人知的缺點(下)(圖二)
  圖6●菱形繼續的一個例子。在同一個人具有社會人和學生兩種性質的時候,就必然會引起此類問題
  第二,類的層次也會變得很復雜。假如只有單繼續,類的結構僅僅只會分支成樹狀。而假如是多層繼續,一下子就會變得很復雜。假如多次反復地進行多層繼續,把握類的層次關系幾乎就將變得不可能。
  
  由于Java只答應單繼續,因此就不會引起這種問題。不過,用戶當然也希望通過將多個不同的類組合起來,生成新的類。為了解決這一問題,Java就提供了被稱為接口的多層繼續的功能。
  
  日本產業技術綜合研究所信息處理研究部的主任研究員一杉裕志說:“Java只答應單繼續從編程語言的裝配的角度來講是一種很不錯的作法”。甚至有人表示:“Java利用接口來取代多層繼續給人的感覺非常不錯。此前Java之所以如此普及就是因為Java的語言標準采取了適當的折衷”(東京大學研究生院處理理工學系研究專業專門從事計算機科學的萩谷昌己教授)。
  
  接口不能繼續裝配
   Java中鮮為人知的缺點(下)(圖三)
  圖7●Java只答應繼續一個裝配。因此就必須完整地復制代碼
  不過,基于接口的偽多層繼續存在致命的缺點。這就是指接口無法繼續裝配。Ruby語言的開發者--日本的松本幸弘指出:“使用接口取代多層繼續是Java的高明之處。不過放棄裝配的繼續則令人非常痛心”。
  
  繼續2個類的功能時,Java將會復制某一個類的源代碼。結果,相同的代碼就會分散在各種不同的位置,可維護性就會顯著降低(圖7)。將相同的處理過程集中到名為類的單位中來提高面向對象的優點沒有得到充分的利用。“從市場銷售上來講,Java是一種取得了巨大成功的語言。但是從編程語言的裝配角度來看,我認為它是一個失敗的作品”(松本)。
  
  Ruby語言利用Mix-in實現裝配的繼續
  
  實際上松本開發的Ruby語言也和Java一樣只答應單繼續。不過,Ruby則利用相當于Java接口的方法實現了裝配的繼續。這就是被稱為Mix-in的方法。
  
  Mix-in是指僅將程序中具有再利用性的功能部分集中到被稱為“模塊”的單位中,以供其他的類來使用。模塊與類一樣,其本身無法利用new運算符來生成。只有“include”即嵌入到其他的類中才能使用(圖)。
  
  LIST 6就是使用了Mix-in方法的簡單Ruby代碼。定義了一個可以輸出“test”字符串的、名為TestModule的模塊。TestClass類嵌入了該模塊。這樣一來,TestClass類就可以像調用自身的方法一樣調用TestModule模塊中的方法。
  
  不過,Ruby的Mix-in所解決的只是由多層繼續所造成的繼續關系的復雜性。在多個模塊存在同名的方法時,就會產生與多層繼續相同的問題。Ruby優先處理由后面嵌入的方法(注3)。
   Java中鮮為人知的缺點(下)(圖四)
點擊查看大圖
 
  圖8●Ruby中的Mix-in功能。將集中了各種功能的模塊嵌入到類中來使用
   Java中鮮為人知的缺點(下)(圖五)
點擊查看大圖

   LIST 6●使用Ruby中Mix-in功能的代碼。TestClass類可以像使用自己的方法一樣使用TestModule模塊所裝配的方法
  利用與類不同的單位進行程序再利用的MixJuice語言
  
  目前一種利用與Ruby不同的方法來提高程序的再利用性的名為MixJuice的語言也在開發之中。這是一種基于Java的獨立語言。
   Java中鮮為人知的缺點(下)(圖六)
點擊查看大圖

  LIST 7●MixJuice的代碼。程序以“module(模塊)”為單位進行描述。而類則由module來分割
  為了程序的再利用,即便MixJuice也使用了與類不同的編程單位。這種單位與Ruby一樣被稱為“模塊”。MixJuice語言的開發者--日本產業技術綜合研究所的一杉表示:“在基于Java等語言中常見的類的程序設計中,通過多個類的協作實現某一種功能時,類就無法進行再利用。因此應該有一個與類不同的、可以再利用的編程單位”。
  
  MixJuice語言中當然也有類。但是編程時所處理的并不是一個類的源代碼,而是以包含了各種可協調工作的類的“模塊”為單位來描述程序。重新利用模塊進行擴展時,描述的是模塊之間的“區別”。
  
  LIST 7就是實際的源代碼。程序是以“模塊”為單位來組織的。類則在模塊中使用“define”要害詞進行定義。如本例所示,通過追加模塊來描述與現有類的區別。把使用多個類而實現的功能集中到了一起。
  
  必然引起裝配缺陷
  
  不過,這種方法必然會產生其他問題。就是說要使用MixJuice中的模塊來擴展類時,就會產生裝配缺陷。
  
  圖9就是一個具體的例子。模塊m1和m2均繼續了模塊m,m1定義了在m中定義的類S的派生類B。而m2則向S類追加了方法。假如是普通的方法,就不會產生問題,但是這里卻定義了一個利用派生類來強制裝配的抽象方法。實際上,它的派生類A添寫了裝配。
  
  如要同時使用這兩個模塊,連接時就會產生錯誤。因為類B沒有裝配由m2追加到類S中的方法m()。為了解決這個問題,無論是誰擁有多么豐富的知識都必須對方法進行裝配。這種問題是因模塊具有方法追加和子類(派生類)追加等2種擴展的方向性而引起的(圖10)。
   Java中鮮為人知的缺點(下)(圖七)
點擊查看大圖

  
  圖9●裝配缺陷的例子。由m2追加到類S中的抽象方法的存在與m1沒有任何關系。假如同時使用這2個模塊時就會產生編譯錯誤
  
   Java中鮮為人知的缺點(下)(圖八)
  圖10●存在二個以上的擴展方向性時就會產生裝配缺陷。拿MixJuice來說,就是子類和方法的擴展性
  提出了新的分割單位的、面向側面編程(aspect-Oriented PRogramming)
  
  像MixJuice語言那樣,利用橫跨多個對象的單位來把握系統的觀點稱為“關注分隔(Separation of Concerns,SoC)”。類的相互作用也屬于關注的一種。這種觀點并不是僅僅單純以對象為單位,還要由其他側面來分割系統。
  
  最近這種觀點已經開始受到越來越廣泛的關注。基于該觀點的代表性編程范式(paradigm)就是面向側面編程。它就是以“關注”為分隔單位的。假如存在多個與類相同的關注,就通過將這些關注組合起來,實現一種功能。這種功能就是側面(Aspect)。
  
  圖11就是具體的例子。把移動圖形來刷新畫面的處理過程定義為一個側面。圖形是由點和線組成的。每一個點和線中均存在移動的方法和用于設置位置的方法。這些動作相互協作,就可實現稱為畫面刷新的側面。
  
  LIST 8就是使用基于Java的面向側面語言“AspectJ”,來描述側面的源代碼。在一個被稱為移動圖形的程序段中定義了多個類的多個方法。圖形的移動結束后,最后執行重新刷新畫面的處理過程。
   Java中鮮為人知的缺點(下)(圖九)
  圖11●利用“關注”分割“類”的圖示。點和線以及他們各自所具有的定位和移動的方法被劃分成了相同的關注。該圖摘自面向側面編程的倡導者Gregor Kiczales在面向側面編程技術研討會上發表的演講資料
  Java中鮮為人知的缺點(下)(圖十)
點擊查看大圖

  LIST 8●利用AspectJ描述側面的源代碼。將用于實現圖像移動的各種類中的方法歸納為“move”。“move”結束以后,執行由“after”描述的畫面刷新。摘自Gregor Kiczales在面向側面編程技術研討會上發表的演講資料
  與面向對象并不矛盾
  
  面向側面編程在對象以外導入了分割系統的單位,提高了程序的再利用性和擴展性。假如只有對象單位有分割的軸,也許確實就會存在一定的限制吧。
  
  不過,面向對象本身就是公認難度很高的編程范式。盡管如此面向對象語言能夠普及到如此程序恐怕是因為“只有對象單位有分割的軸”吧。正因為軸只有一個好歹才能夠理解。假如還要加上被稱為側面的軸,也許有很多程序員就會產生混亂。
  
  另外,面向側面則是自由度很高的編程范式。正是因為自由度高,程序員才會感到苦惱。因為他們不知道應該如何分割或組織程序。也就是說,在某種程度上縮小自由度,并給程序員提供編程指南也可以說是編程語言的任務。
  
  面向側面是一種擴展了面向對象的編程范式。假如認為面向對象的自由度合適,就可以繼續使用它。就連面向側面的倡導者加拿大英屬哥倫比亞大學的Gregor Kiczales本人也表示:“沒有必要非要去勉強地使用側面來編程”。程序員要根據自己的開發風格,在追求一種易用性和擴展性適當平衡的同時,使用這種編程范式。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 云浮市| 沈阳市| 明星| 淮阳县| 梁河县| 江川县| 东安县| 元江| 南召县| 姚安县| 鸡西市| 宜都市| 景谷| 罗城| 察雅县| 韶山市| 普安县| 澜沧| 顺昌县| 长兴县| 绍兴市| 庆阳市| 美姑县| 颍上县| 台安县| 遂溪县| 天柱县| 甘孜| 塘沽区| 长泰县| 定边县| 拜城县| 乌兰浩特市| 桂林市| 肃宁县| 临武县| 武冈市| 黎城县| 金塔县| 白玉县| 左云县|