Posted on 2007-04-01 21:30
canonical 閱讀(1466)
評(píng)論(3) 編輯 收藏 所屬分類:
設(shè)計(jì)理論
命名(Naming)無疑是人們認(rèn)識(shí)世界最基本的手段之一。從軟件技術(shù)的發(fā)展中我們也可以觀察到命名技術(shù)的不斷深化。
1. 助記的名:匯編之中我們有了move/push/pop這樣的指令,所面對(duì)的不再是010101這樣的同質(zhì)的數(shù)字世界。變量也逐漸可以擁有自己的名字,甚至多個(gè)名字。在C語言中指針的概念被進(jìn)一步抽象化,使得我們可以為任意內(nèi)存地址起一個(gè)可讀的名字。我們甚至漸漸忘懷了pStruct是指針的名字,而直接把它等同于指針?biāo)傅膬?nèi)容本身。
2. 局部的名:函數(shù)(例程)概念的出現(xiàn)把局部名稱引入系統(tǒng),從此精細(xì)結(jié)構(gòu)的發(fā)展才成為可能。
3. 多義的名:面向?qū)ο蟮某霈F(xiàn)可以看作是命名技術(shù)的一種重大進(jìn)展,它可以把一組相關(guān)的數(shù)據(jù)和函數(shù)放在一起起個(gè)名字。繼承概念為名引入了多義性。通過虛擬函數(shù)表所實(shí)現(xiàn)的lazy-binding部分松動(dòng)了對(duì)象的名和實(shí)之間的指稱關(guān)系。現(xiàn)在一些所謂dynamic dispatch技術(shù),依然是頑強(qiáng)的希望在同一名下,納入更多實(shí)的變化。
4. 特指的名:面向?qū)ο蠹夹g(shù)創(chuàng)造一個(gè)特殊的名---this指針。它是一種約定了的固化了的局部名稱。使用this指針使得我們區(qū)分了領(lǐng)域(domain)的內(nèi)外。在domain外對(duì)象可以有各種稱謂,而domain內(nèi)我們直接通過this直接觸及到對(duì)象的實(shí)體。在javascript這樣的動(dòng)態(tài)語言中,函數(shù)和this指針是動(dòng)態(tài)綁定的。在某種意義上,這意味著一個(gè)操作所依賴的domain知識(shí)可以是動(dòng)態(tài)變化的。
5. 相對(duì)的名:面向?qū)ο蠹夹g(shù)所創(chuàng)造的知識(shí)相對(duì)化概念的一個(gè)直接體現(xiàn)是命名的相對(duì)化。一個(gè)函數(shù)它的具體含義不再是絕對(duì)的,而是相對(duì)于this指針的。因此我們不再采用user_load, book_load這樣的全稱的函數(shù)名, 而只定義load這樣的具有依賴性的函數(shù)。在面向?qū)ο蟮睦硐氩僮鲌D景下,首先應(yīng)該是通過一個(gè)整體的參數(shù)直接區(qū)分出多個(gè)大的情景,然后在每個(gè)特定的情景下分別調(diào)用相對(duì)函數(shù)進(jìn)行操作。在模板(template)技術(shù)或者動(dòng)態(tài)語言中,這種相對(duì)性可以得到更加充分的發(fā)揮。因?yàn)樵诜盒突蛘呷躅愋驼Z言中,我們需要的只是對(duì)象提供特定名稱的函數(shù)或?qū)傩远选?br> 6. 持久的名:在早期的語言中,名只在編譯時(shí)刻存在。在編譯出的二進(jìn)制代碼中,名所提供的豐富的描述空間不復(fù)存在,我們所有的只是同質(zhì)性的二機(jī)制地址而已。而在現(xiàn)代語言中,反射已經(jīng)成為了不可或缺的技術(shù),它使得我們?cè)谶\(yùn)行時(shí)刻仍然可以擁有復(fù)雜的描述結(jié)構(gòu)。
7. 分離的名:在一般的程序中,我們?cè)缫蚜?xí)慣了變量名直接指代實(shí)際可操作的對(duì)象本身,名的問題顯得太平庸以至于大家似乎忽略了它的存在。但是在web體系架構(gòu)下, 因?yàn)榇嬖谥鵀g覽器和服務(wù)器這樣兩分的狀態(tài)空間, 名成為兩個(gè)系統(tǒng)交互的直接手段,名的重要性也重新凸顯出來。只有在一個(gè)封閉的container中,才能通過名字解耦. 因此web架構(gòu)設(shè)計(jì)的一個(gè)核心問題是構(gòu)建出各種各樣的全局的container. 瀏覽器前端技術(shù)的一個(gè)本質(zhì)性困難即在于多個(gè)瀏覽器窗口之間沒有共享的全局對(duì)象空間,因而很難在前臺(tái)獨(dú)立建立container結(jié)構(gòu)。
在witrix平臺(tái)的jsplet框架中,在前臺(tái)我們通過如下url來訪問后臺(tái)
/view.jsp?objectName=MyObj&$bizId=test&objectEvent=ViewDetail&id=1
MyObj這一參數(shù)標(biāo)定了BeanContainer中的一個(gè)Java對(duì)象, $bizId參數(shù)指定應(yīng)用某個(gè)Aspect到此對(duì)象上,objectEvent參數(shù)映射到WebAction上的一個(gè)java方法,而EntityManager最后負(fù)責(zé)把id映射到具體的實(shí)體對(duì)象。當(dāng)我們?cè)诤笈_(tái)需要編制代碼的時(shí)候,entity對(duì)象已在手邊。
8. 名的結(jié)構(gòu):當(dāng)名越來越多的時(shí)候,我們需要對(duì)它們進(jìn)行有序的組織。名字空間(namespace)所采用的樹形結(jié)構(gòu)可以說是最直接的一種組織方式。這一結(jié)構(gòu)不僅僅可以用于描述,同時(shí)可以用于控制。