關鍵字:oo 面向對象的話題本來是個老話題了。只是看到還有不少人對這個問題有所困惑,我也就不吝淺薄,談談自己對面向對象的理解。還請大家在讀過之后,能夠不計鄙人的淺薄,多提寶貴意見。不斷地爭論和討論是前進的根本動力。
面向對象的整套方法本來可以分為面向對象分析、面向對象設計、面向對象編程等。但是在這點上,我是贊同XP的開發思想的:代碼就是所有的設計。因此,我更愿意把面向對象看作一個整體:一切最終落實到體現了面向對象思想的代碼;诖朔N考慮,在這里我也不區分OOA/OOD/OOP,而是泛指在面向對象思想指導下的軟件開發及實現全過程。需要注意的是:“體現了面向對象思想的代碼”和“面向對象的代碼”是不同的概念, C#,java的語言特點決定了無論有沒有面向對象的靈魂,其編碼的“肉體”都是面向對象的。
關于OO的應用場合,還有很多人在爭論。前些天看到還有人說三層結構/多層結構不適用于網站開發。從根本上講,這和OO是不是適用于網站開基本上是同一個問題。因為,很顯然,OO和N-Tier常常是一件事情的兩個不同方面,使用OO卻不使用多層結構是難以想象的,使用N-Tier卻不使用OO那我就更加不知其可了?傊,在我看來,這兩件事情是緊密相連的。退一步講,將二者緊密聯系在一起,如果不是必然的話,至少也應被看作是開發過程中的一個Best Practice。
下面談談我對OO + N-Tier的幾個基本觀點:
1)脫離了大量緩存和基于對象的業務邏輯的OO是沒有意義的。
我以前看到一些同道在進行OO開發的時候,對象常常只在數據加載和保存中的出現。對象更像是一個盒子,在需要數據時,我們建立數據庫連接,獲取結果集或者DataReader/ResultReader,將從數據庫獲得的數據“填充”到對象中,然后再將對象返回給上層應用使用;在需要保存數據時,過程基本是對稱的:我們把對象中的數據,一個字段一個字段讀出來,生成參數化的或者直接字符串拼接的查詢語句,建立數據庫連接,提交更新到數據庫。如果OO的主要內容就是這些的話,OO如果不能說是完全沒有意義的話,起碼意義也不大。我們在付出了編寫了大量對象代碼并且在存儲加載時多一道手續的代碼和性能代價之后,得到的好處只是使上層應用操作數據的代碼可讀性更好并且能夠進行一定的類型強制和檢查。這常常是很多開發人員對OO很困惑的原因:OO看起來很美,但是做了那么多事情,難道就是為了看起來很美嗎?這同時也成為一些編程老手把OO看作華而不實代名詞的原因:美是美了一點,但是代碼多了,性能差了,讓書呆子們去用吧。之所以出現這種局面,其根本原因在于“內存對象世界”沒有提供太多的附加值。
大家應該注意到“內存對象世界”這一說法。在我看來,對象至少有兩個世界,一個是“持久化對象世界”,一個是“內存對象世界”,這是由當今計算機的結構特點決定的:如果數據要長期保存,數據就必須被保存到可持久化的媒介中;如果要進行運算,數據就必須被加載到可運算尋址的媒介中。前者就是DB Server等管理的硬盤、磁帶機...,后者就是內存。在DB Server為中心的開發中,大家傾向于把所有邏輯直接放置在最接近“持久化對象世界”的DB Server中,并主要以存儲過程的形式存在。但是這樣就一定是最合理的嗎?尤其是對于網站應用?如果這樣確實是合理的話,OO還有什么意義呢?是不是OO真的如某些人所說,只適合于圖形繪制等特定領域?要回答這些問題,我們還是要看看哪些情況下,“內存對象世界”能夠相對獨立于“持久化對象世界”發揮其作用,這樣“內存對象世界”就具備了獨立于“持久化對象世界”之外的獨立意義。
網站應用的特點是:看數據的人多,創建數據的人少。眾所周知,恰恰就是這一點決定了緩存對于網站系統的重要性。對于主要以靜態內容為主的小型簡易網站,我們在這里就沒有討論的必要了。真正有人氣的網站一定是具有動態增長的準靜態內容(如新聞類網站,內容不斷增加,但是本身很少修改)或者大量動態內容(如交易型的電子商務網站)的。對于前一種情況,通常有兩種方式來加速其訪問,一種是生成靜態頁面,一種是在內存中緩存頁面內容。生成靜態頁面在性能上未必總是最好的選擇。只有當數據多到內存中根本緩存不下,而這些數據又都有很大可能被用戶訪問時,生成靜態頁面才是較佳選擇。在數據較多,但是并發并不多時,或者并發雖多,但關注的內容并不多時(如近兩日新增信息或者近幾日修改信息),頁面緩存就是更好的選擇。原因很簡單,因為頁面緩存的訪問速度要明顯快于靜態頁面。當然,有時候二者可以結合起來,這里就不多講了。對于后一種情況——真正的較大型電子商務性網站,我們面對的是另一個問題:一些信息被以網頁形式緩存,但這些信息本身的數據信息(如商品信息中的剩余數量,賣家Id等)常常需要被用到進行相關處理,如果只是進行了網頁緩存,而沒有進行對象緩存的話,緩存的意義就不打。在這種情況下,對象緩存就成為最好的選擇。其實,在前一種情況下,頁面緩存也可以以對象緩存的形式單獨或者分級混合并存。
文章來源于領測軟件測試網 http://www.kjueaiud.com/