Posted on 2008-09-20 08:48
魚躍于淵 閱讀(94)
評(píng)論(0) 編輯 收藏 所屬分類:
精品網(wǎng)摘
目前在開發(fā)領(lǐng)域中各種框架越來越多;模式使用機(jī)會(huì)性似乎減少了,那么是不是意味著我們就不必掌握模式了呢?其實(shí),學(xué)習(xí)模式實(shí)際為了培養(yǎng)模式思維,模式思維有助于了解和使用框架。
例如如何我們?cè)谑褂帽憩F(xiàn)層哪個(gè)框架,都是MVC模式實(shí)現(xiàn),那么進(jìn)行編程步驟時(shí),我們腦海里就浮現(xiàn)一個(gè)步驟V/C/M以及C和V的轉(zhuǎn)發(fā)關(guān)系,進(jìn)而感覺struts-config.xml配置就不是多余或復(fù)雜,而是必須的。
現(xiàn)在有人覺得好像Java世界框架特別多,異常復(fù)雜,其實(shí)這可能是他從封閉世界走向開放自由世界產(chǎn)生的錯(cuò)覺,當(dāng)你具備模式思維時(shí),實(shí)際你就具備了挑選各種各樣框架的能力,打個(gè)比喻:以選擇轎車為例子,過去,只有一種“紅旗”轎車供選擇,你就只有接受這個(gè)轎車;但是現(xiàn)在轎車多了,選擇多了,你就必須了解轎車的通用概念,進(jìn)而你就可以在各種轎車之間選擇和衡量,了解轎車的通用概念這個(gè)過程就如同我們學(xué)習(xí)模式,具備通用編程的模式思維,有了模式思維,就會(huì)發(fā)現(xiàn)有這么多選擇產(chǎn)品,不再嫌復(fù)雜,而是變得興奮了;所以,沒有復(fù)雜的東西,只有是否原意學(xué)習(xí)的頭腦;PC電腦對(duì)于一些人很復(fù)雜,可是對(duì)于我們會(huì)復(fù)雜嗎?不會(huì),因?yàn)槲覀円呀?jīng)掌握通用電腦的模型、模式。
所以,有人覺得Java軟件很多配置復(fù)雜,甚至產(chǎn)生配置恐懼癥,那是因?yàn)樗麤]有模式思維,在模式思維指導(dǎo)下的編程工作,就象在寫一篇生動(dòng)的小說一樣,你腦海展現(xiàn)的生動(dòng)模式實(shí)現(xiàn)步驟,而無論代碼或配置都是實(shí)現(xiàn)你模式思維的文字工具,模式思維考慮到哪里,就想起什么配置,配置對(duì)具備模式思維的你來說是很自然的表達(dá)。
在模式思維下的Java編程,編碼階段code completion可能花費(fèi)2/3時(shí)間,但是調(diào)試測(cè)試時(shí)間只需要1/3甚至不到,大多數(shù)情況下是一步到位的調(diào)試成功;這比以前1/3編程時(shí)間,2/3調(diào)試時(shí)間要高效多,關(guān)鍵是:你無論花費(fèi)多少時(shí)間在調(diào)試上,實(shí)際上是在做一個(gè)修修補(bǔ)補(bǔ)的工作,是在做維修工,頭疼醫(yī)頭,永遠(yuǎn)是機(jī)修工,無法成為設(shè)計(jì)師。
下面從模式思維角度談?wù)剮讉€(gè)認(rèn)識(shí)誤區(qū),僅僅參考討論:
游戲軟件比企業(yè)軟件復(fù)雜?
為什么說企業(yè)軟件時(shí)復(fù)雜的?因?yàn)槠髽I(yè)軟件是為應(yīng)付需求而變,與游戲軟件等軟件相比,雖然一個(gè)游戲軟件在代碼數(shù)量級(jí)別上比企業(yè)軟件復(fù)雜,但是游戲軟件不必考慮跟隨游戲用戶需求變化,是游戲用戶服務(wù)游戲設(shè)計(jì)規(guī)則;但是企業(yè)軟件和其用戶則相反,企業(yè)軟件必須服從用戶的變化,打個(gè)不是很確切的比喻:企業(yè)軟件則類似市場(chǎng)經(jīng)濟(jì)中的市場(chǎng)人員,需要“看客戶臉色”行事。而游戲軟件則相反,類似以前朝南坐的政府人員;
因此,企業(yè)軟件在動(dòng)態(tài)概念上是隨時(shí)間變化而變化,是由生命的,因?yàn)橛?jì)劃趕不上變化,所以企業(yè)軟件制作時(shí)總是使用模式為將來變化預(yù)留余地,這種面向未來變化考慮方式無疑是最復(fù)雜的思維,就象股票變化將這種未來變化的殘酷推向極致,我們都想計(jì)劃未來,但是總是計(jì)劃不了未來,這就是企業(yè)軟件的復(fù)雜所在。
Class.forName神秘嗎?
有人覺得Class.forName很神秘,神秘不在于本身,就是打開其編碼研究到二進(jìn)制也不能達(dá)到目的,它的神秘之處是因?yàn)閼?yīng)用在一個(gè)恰當(dāng)之處,就象一塊普通布沒什么,但是如果從后面變出花了,你覺得這塊布神奇了,Class.forName神奇之處在于其隱藏了對(duì)象創(chuàng)建,也一種是工廠模式實(shí)現(xiàn)。
同樣,對(duì)于Collection,本來就是那幾個(gè)種類List和Map,但是發(fā)現(xiàn)使用起來神奇得很,有人甚至研究過Collection的二進(jìn)制,這和研究魔術(shù)師中一塊普通布沒有什么區(qū)別。Collection用于容器,作為對(duì)象集合;以及和單例結(jié)合實(shí)現(xiàn)緩存等,可以實(shí)現(xiàn)多種模式。
僅會(huì)算法就做企業(yè)軟件嗎?
在實(shí)踐中,通常表示一個(gè)樹形關(guān)系通過編碼實(shí)現(xiàn),例如1122334455表示是代號(hào)為11類別下代號(hào)為22類別下的代號(hào)為33類別下的....然后,在軟件各處通過分析這個(gè)類別編碼獲得樹形關(guān)系,這種將將具體數(shù)據(jù)和業(yè)務(wù)耦合在一起做法是受到抨擊的。
那么如果我們要對(duì)樹形關(guān)系的數(shù)據(jù)進(jìn)行訪問如何實(shí)現(xiàn)呢?首先我們將樹形關(guān)系的訪問分為兩個(gè)部分:樹形關(guān)系+功能實(shí)現(xiàn)。我們已經(jīng)知曉樹形結(jié)構(gòu)的遍歷,但是僅僅知道樹形結(jié)構(gòu)遍歷還是不夠的,我們還需要模式來解決樹形關(guān)系訪問這個(gè)通用問題,使用Composite模式可以方便客戶端對(duì)樹形結(jié)構(gòu)訪問,使得客戶端不至于因?yàn)闃湫谓Y(jié)構(gòu)變化而變化不定;而訪問者模式則不會(huì)總可能新增的新訪問功能,導(dǎo)致樹形結(jié)構(gòu)中對(duì)象代碼變化不定。
這兩種模式協(xié)同發(fā)力,可以綜合解決樹形結(jié)構(gòu)中對(duì)象群的訪問。
GoF模式打開的新境界
沒有知曉GoF模式之前,我們總是以為編碼就是寫一些代碼,然后運(yùn)行,復(fù)雜嗎?如果我們來分析一下GoF模式三個(gè)類型,你會(huì)發(fā)現(xiàn)平時(shí)熟視無睹的代碼中隱藏如此多考慮方面。
GOF模式三種類型:結(jié)構(gòu)型模式、創(chuàng)建型模式和行為型模式其實(shí)函括了OO編碼的三個(gè)方面:靜態(tài)類關(guān)系、類創(chuàng)建成為運(yùn)行時(shí)對(duì)象實(shí)例;運(yùn)行時(shí)的對(duì)象運(yùn)行行為,也就是說,我們?cè)诰幋a階段不但考慮現(xiàn)階段各個(gè)類之間靜態(tài)解耦關(guān)系,而且還要考慮這些代碼激活后,運(yùn)行時(shí)的情況。
而以往過程化編程中,編碼狀況=運(yùn)行狀況,如何先后編碼,這些編碼運(yùn)行時(shí)就按照這些先后編碼順序執(zhí)行,兩者是統(tǒng)一的,不可能出現(xiàn)運(yùn)行時(shí)可能和編碼時(shí)預(yù)想不一樣,更何況需要我們還要在進(jìn)行類編碼時(shí),考慮這些類運(yùn)行時(shí)是如何實(shí)現(xiàn)的,有如何對(duì)這些類運(yùn)行時(shí)的關(guān)系進(jìn)行解耦和分離呢?所以,我們“天生”就無法理解設(shè)計(jì)模式,因?yàn)槲覀儚膩砭驼J(rèn)為軟件就是實(shí)現(xiàn)功能,哪里還會(huì)考慮到實(shí)現(xiàn)同樣功能會(huì)涉及各種考量了呢?
如果說設(shè)計(jì)模式是程序員的圣經(jīng),那么不掌握設(shè)計(jì)模式可能就是異教徒,從此教徒和異教徒兩者之間就缺乏溝通對(duì)話平臺(tái),就象雞對(duì)鴨講話了。
非模式思維的懲罰
面向?qū)ο筌浖w系是和面向過程體系格格不入的,面向?qū)ο蟮母鞣N技術(shù)如單元測(cè)試 性能緩存等等都是OO體系,如果我們沒有具備模式思維來編程,由此而誕生的軟件架構(gòu)必然失敗,失敗在哪里?通過性能懲罰你。最近碰到一個(gè)臺(tái)灣的鋼鐵架構(gòu),它雖然包含一個(gè)簡(jiǎn)單的MVC框架,但是其Controller實(shí)際又是Service,該框架配置將下面幾個(gè)元素耦合在一起:頁面流程;控制類;Dao與VO,這實(shí)際是將表現(xiàn)層和持久層直接結(jié)合一起,這樣的框架迫使程序員沒有空間做中間領(lǐng)域模型層和服務(wù)層,進(jìn)而整個(gè)體系變成一個(gè)兩層耦合結(jié)構(gòu),這和傳統(tǒng)的C/S沒有區(qū)別,在Java中使用傳統(tǒng)概念編程:如面向過程、面向數(shù)據(jù)表以及兩層耦合導(dǎo)致結(jié)果是性能緩慢,很多大型項(xiàng)目就是這樣最后是毀在性能上,服務(wù)器需要經(jīng)常啟動(dòng),一旦并發(fā)用戶就很慢,服務(wù)器經(jīng)常死機(jī)。
有人可能奇怪:非模式思維屬于設(shè)計(jì)問題,怎么會(huì)對(duì)性能影響,這是將設(shè)計(jì)和性能對(duì)立起來,性能也是一種設(shè)計(jì),池模式以及緩存也是屬于模式啊,但是緩存的高效率應(yīng)用是建立良好的對(duì)象設(shè)計(jì)基礎(chǔ)上,或者說是良好的領(lǐng)域建模上,否則就是使用緩存,也會(huì)導(dǎo)致粒度或動(dòng)態(tài)機(jī)制不準(zhǔn)確,無法發(fā)揮緩存效率,甚至無法使用緩存。