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模塊中的方法。
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)不同的、可以再利用的編程單位”。
LIST 7就是實(shí)際的源代碼。程序是以“模塊”為單位來(lái)組織的。類(lèi)則在模塊中使用“define”要害詞進(jìn)行定義。如本例所示,通過(guò)追加模塊來(lái)描述與現(xiàn)有類(lèi)的區(qū)別。把使用多個(gè)類(lèi)而實(shí)現(xiàn)的功能集中到了一起。
像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)。
LIST 8就是使用基于Java的面向側(cè)面語(yǔ)言“AspectJ”,來(lái)描述側(cè)面的源代碼。在一個(gè)被稱(chēng)為移動(dòng)圖形的程序段中定義了多個(gè)類(lèi)的多個(gè)方法。圖形的移動(dòng)結(jié)束后,最后執(zhí)行重新刷新畫(huà)面的處理過(guò)程。 圖11●利用“關(guān)注”分割“類(lèi)”的圖示。點(diǎn)和線(xiàn)以及他們各自所具有的定位和移動(dòng)的方法被劃分成了相同的關(guān)注。該圖摘自面向側(cè)面編程的倡導(dǎo)者Gregor Kiczales在面向側(cè)面編程技術(shù)研討會(huì)上發(fā)表的演講資料
點(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ū)ο蟛⒉幻?