麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

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

2019-11-18 13:28:19
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  最后討論一下無(wú)法繼續(xù)多種類(lèi)的裝配問(wèn)題。該問(wèn)題的原因在于java不答應(yīng)多層繼續(xù)。
  
  Java不能進(jìn)行多層繼續(xù)。這一點(diǎn)大多經(jīng)常作為其優(yōu)點(diǎn)而不是缺點(diǎn)而被提出來(lái)。C++答應(yīng)多層繼續(xù),但結(jié)果卻致使程序變得非常復(fù)雜,而且還產(chǎn)生了難以理解的錯(cuò)誤。
  
  多層繼續(xù)在裝配時(shí)會(huì)很復(fù)雜
  
  多層繼續(xù)會(huì)在如下幾個(gè)方面導(dǎo)致混亂。第一是名稱(chēng)的沖突。在繼續(xù)具有相同名稱(chēng)的其他類(lèi)時(shí),不知道是哪個(gè)類(lèi)的方法將會(huì)被調(diào)用(圖5)。這一點(diǎn)是在一個(gè)類(lèi)繼續(xù)兩個(gè)已經(jīng)繼續(xù)了某一個(gè)類(lèi)的類(lèi)時(shí)經(jīng)常發(fā)生的問(wèn)題。這種繼續(xù)稱(chēng)為菱形繼續(xù)(圖6)。在分別改寫(xiě)(override)最上層的類(lèi)的方法后,就會(huì)引起被最下層的類(lèi)所調(diào)用的問(wèn)題。
   Java中鮮為人知的缺點(diǎn)(下)(圖一)


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

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

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

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

  LIST 8●利用AspectJ描述側(cè)面的源代碼。將用于實(shí)現(xiàn)圖像移動(dòng)的各種類(lèi)中的方法歸納為“move”。“move”結(jié)束以后,執(zhí)行由“after”描述的畫(huà)面刷新。摘自Gregor Kiczales在面向側(cè)面編程技術(shù)研討會(huì)上發(fā)表的演講資料
  與面向?qū)ο蟛⒉幻?
  
  面向側(cè)面編程在對(duì)象以外導(dǎo)入了分割系統(tǒng)的單位,提高了程序的再利用性和擴(kuò)展性。假如只有對(duì)象單位有分割的軸,也許確實(shí)就會(huì)存在一定的限制吧。
  
  不過(guò),面向?qū)ο蟊旧砭褪枪J(rèn)難度很高的編程范式。盡管如此面向?qū)ο笳Z(yǔ)言能夠普及到如此程序恐怕是因?yàn)椤爸挥袑?duì)象單位有分割的軸”吧。正因?yàn)檩S只有一個(gè)好歹才能夠理解。假如還要加上被稱(chēng)為側(cè)面的軸,也許有很多程序員就會(huì)產(chǎn)生混亂。
  
  另外,面向側(cè)面則是自由度很高的編程范式。正是因?yàn)樽杂啥雀撸绦騿T才會(huì)感到苦惱。因?yàn)樗麄儾恢缿?yīng)該如何分割或組織程序。也就是說(shuō),在某種程度上縮小自由度,并給程序員提供編程指南也可以說(shuō)是編程語(yǔ)言的任務(wù)。
  
  面向側(cè)面是一種擴(kuò)展了面向?qū)ο蟮木幊谭妒健<偃缯J(rèn)為面向?qū)ο蟮淖杂啥群线m,就可以繼續(xù)使用它。就連面向側(cè)面的倡導(dǎo)者加拿大英屬哥倫比亞大學(xué)的Gregor Kiczales本人也表示:“沒(méi)有必要非要去勉強(qiáng)地使用側(cè)面來(lái)編程”。程序員要根據(jù)自己的開(kāi)發(fā)風(fēng)格,在追求一種易用性和擴(kuò)展性適當(dāng)平衡的同時(shí),使用這種編程范式。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 杏美月av| 国产精品探花在线观看 | 黄色a级片视频 | 色玖玖综合 | 国产九九在线视频 | 国产成人在线视频播放 | 成人在线视频在线观看 | 久久久久久久久亚洲精品 | 国产精品久久久久久久久久了 | 欧美黄色免费视频 | 国产精品久久久久影院老司 | 全黄性色大片 | 国产一区二区三区四区五区加勒比 | 日日操夜夜操视频 | 成人免费福利视频 | 欧美黄色大片免费观看 | 巨根插入| 亚洲国产精品久久久 | 久久亚洲精品久久国产一区二区 | 毛片免费观看视频 | www.精品视频 | 免费黄色短视频网站 | 欧美成人精品欧美一级 | 欧美亚洲黄色 | 欧美黄色大片免费观看 | 免费国产羞羞网站视频 | 精品久久久一 | 91精品国产刺激国语对白 | 国产精品嘿咻嘿咻在线播放 | 欧美精品一区自拍a毛片在线视频 | 国产一级在线观看视频 | 国产毛片视频 | 国产在线播放一区二区 | 欧美激情综合在线 | 国产亚洲精品久久久久久久久 | 国产a级久久 | 国产又白又嫩又紧又爽18p | 日本精品一二区 | 二区三区在线观看 | 国产二三区 | 久草中文网 |