Posted on 2006-03-25 11:36
canonical 閱讀(955)
評論(0) 編輯 收藏 所屬分類:
設計理論
1. 對象的一個特性是局域化。每一個對象函數(shù)(非靜態(tài)函數(shù))都是在對象的上下文中調用的,因而隱含假設了一定的環(huán)境信息,這些信息以封裝的形式被使用。
?? 一個具體的體現(xiàn)是函數(shù)的命名,如果沒有對象,我們必須給函數(shù)進行全局命名,例如 find_friends, find_users, find_departments, 而在對象的環(huán)境下,我們可以抽象出一個采用局域化命名的接口 IQueriable.find(),實現(xiàn)系統(tǒng)的深度分解。
?? 在對象成員函數(shù)的內部,我們通過統(tǒng)一預定的名字(this指針)來訪問對象環(huán)境中的變量。而在 jsplet web框架中的action和前臺jsp中,我們通過thisObj變量來訪問后臺邏輯對象的上下文,而不需要知道對象的具體名稱 (objectName)。
2. 對象的另一個特性是靜態(tài)化。我們從面向過程走向面向對象時,我們思維中的圖像出現(xiàn)了一個重大的變化:在面向過程的程序中,我們想象中存在的是一個個動態(tài)的處理過程,它們在時間軸上按照一定的順序依次執(zhí)行。而在面向對象的圖景中,我們考慮的主要是一個靜態(tài)化的世界,系統(tǒng)分解為對象,而對象是同時存在于我們的思維中的。這里一個重要的技術手段就是成員函數(shù)。例如我們編寫一個成員函數(shù)getChildren(), 這個函數(shù)的語義是返回一個數(shù)據(jù)變量,概念上它是靜態(tài)的,但其內部實現(xiàn)其實可能是很復雜的,非常的動態(tài)化:可能需要查詢數(shù)據(jù)庫,可能需要校驗權限等等。
理想的情況下,我們可以利用成員函數(shù)封裝可以實現(xiàn)對象圖的遍歷。例如? x.getParent().getChilldren(), 在微軟的COM模型或者Sun的JavaBean標準下,我們可以寫成
x.parent.children。
特別注意這里的屬性語法原則上是與時間無關的,即在同一個時刻我們認為這些屬性同時存在著,是一個靜態(tài)的關系。而以下的調用出現(xiàn)了明確的步驟,因而明確引入了時間因素
ITree parent = node.getParent();
if(parent == null)
?? return null;
List children = node.getChildren();
return children;
在witrix平臺的tpl模板引擎中使用的EL(Expressin Language)表達式語法會自動處理函數(shù)返回值為null的情況,因而維護了對象圖的語義,不需要中斷調用過程來進行異常處理,是簡化界面編程的一個重要方面。
這里順便提一句:人的思維是傾向于靜態(tài)化的,但現(xiàn)實世界卻是在不斷的變動中的。正所謂不變的只有變化。Von Neumann體系結構強迫我們在最細節(jié)處引入變化過程,很多時候是過分的負擔。我們需要的是識別出各種可以靜態(tài)描述的部分,集中精力于那些真正需要隨需應變的應用。