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