999在线视频精品免费播放观看-国产在线观看无码免费视频-漂亮人妻被中出中文字幕-国产精品妇女一二三区

服裝管理軟件開發(fā)注意事項(xiàng)(二)

一葉障目

.NET平臺(tái)上的分層架構(gòu)(很多朋友稱其為“三層架構(gòu)”),似乎是一個(gè)長盛不衰的話題。經(jīng)?吹皆S多朋友對其進(jìn)行分析、探討、辯論甚至是抨擊。筆者在仔細(xì)閱讀了大量這方面文章后,認(rèn)為許多朋友在分層架構(gòu)的理解上存在兩個(gè)比較大的偏頗:


1.沒有從本質(zhì)角度去理解分層的內(nèi)涵,而只是了解其表象。


2.對分層架構(gòu)的理解過于狹隘,只是少數(shù)概念,而又不夠深入。


許多朋友言“分層”則必稱“DAL”、“BLL”、“表示層”等概念,殊不知“DAL”的內(nèi)部還有“Data Source 架構(gòu)模式”、“Object-Relational Behavioral 模式”、“Object-Relational Structural 模式”等方面,而其中每個(gè)方面下下又有諸多具體模式,如“Data Source 架構(gòu)模式”又有“Table Data Gateway”、“Row Data Gateway”、“Acitive Record”等等。再說“BLL”,大家都知道“BLL”是“業(yè)務(wù)邏輯層”,可是什么是“業(yè)務(wù)邏輯”?“BLL”又可以構(gòu)建為“Transaction Script”、“Domain Model”、“Table Module”三種模式,各是什么意思?另外,分層也不僅只有“數(shù)據(jù)訪問層”+“業(yè)務(wù)邏輯層”+“表示層”這一種分法,諸如“服務(wù)層”、“持久化層”、“應(yīng)用控制層”的概念朋友們是否真的熟悉呢。


造成這種現(xiàn)象,我想很大一部分原因是因?yàn)榇蠖鄶?shù).NET平臺(tái)的開發(fā)者(包括我在內(nèi))理解分層架構(gòu)是從Microsoft的PetShop開始的。因?yàn)镻etShop是官方的Demo,所以被眾多.NET開發(fā)者奉為圣經(jīng),甚至成了.NET平臺(tái)上分層架構(gòu)的標(biāo)準(zhǔn)方案。我就曾看到許多朋友在我的博客中留下“分層架構(gòu)還是PetShop最經(jīng)典”、“想學(xué)分層還是看PetShop吧”、“你這是跟PetShop學(xué)得吧”這樣的留言。朋友們太崇敬PetShop了,卻忽略了一個(gè)事實(shí):它僅僅是一個(gè)Demo。退一步說,即使它是一個(gè)實(shí)際應(yīng)用的項(xiàng)目,這樣通過一個(gè)具體項(xiàng)目去定義一個(gè)抽象概念的方式也是不科學(xué)的。


舉個(gè)例子,一個(gè)人不知道“牛”是什么東西,于是請教一位奶牛場管理員,管理員遷出一頭奶牛,告訴他:“這就是牛”。從此以后,如果有人問他“牛”是什么,他就會(huì)告訴別人“牛”是一種體型龐大,行動(dòng)笨拙,性格溫順,身上有黑白斑塊圖案,還有一個(gè)好大的咪咪,可以擠奶供人喝。有一天,他聽說西班牙有斗牛這項(xiàng)運(yùn)動(dòng),他大驚道:“這怎么可以!牛那么溫順,怎么能用來斗呢!而且牛是用來擠奶喝的啊!”


故事中這個(gè)人犯了一個(gè)什么錯(cuò)誤呢?他把“具體的一頭奶牛”和“牛”這個(gè)抽象概念給劃等號(hào)了。他認(rèn)為牛就是“體型龐大,行動(dòng)笨拙,性格溫順,身上有黑白斑塊圖案,還有一個(gè)好大的咪咪,可以擠奶供人喝”。殊不知這世界上還有黃牛、水牛、牦牛、斗牛、肉牛等各種牛。他沒能做到“透過想象看本質(zhì)”從而形成抽象概念,而犯了“一葉障目”的錯(cuò)誤。


其實(shí),許多朋友之所以對分層架構(gòu)理解片面或偏頗,是因?yàn)榕c故事中這個(gè)人犯了相同的錯(cuò)誤。當(dāng)初,我們不知道何為“分層架構(gòu)”,于是微軟給了我們一個(gè)PetShop,說:“看!這就是.NET平臺(tái)下分層架構(gòu)的產(chǎn)品。”于是我們“恍然大悟”:“噢!這就是分層架構(gòu)!”。就這樣,我們把“分層架構(gòu)”這樣一個(gè)內(nèi)涵和外延都極大的抽象概念和一個(gè)具體的Demo劃了等號(hào),從而也變成了故事中那個(gè)人——我們言分層架構(gòu)必稱DAL、BLL,我們做項(xiàng)目必然依照PetShop方式架構(gòu)……


我們確實(shí)被PetShop“毒害”了。但這不是微軟的錯(cuò),更不是PetShop的錯(cuò),就像在故事中,我們不能把罪責(zé)歸咎于奶牛場管理員或那頭奶牛。錯(cuò)在我們自己!當(dāng)微軟給我們PetShop時(shí),我們應(yīng)該在腦中清醒認(rèn)識(shí)到:這是一個(gè)分層架構(gòu)的Demo。而不是理解成了“這就是分層架構(gòu)”。我們應(yīng)該鉆研、思考,從而抓住分層架構(gòu)的本質(zhì),可是我們沒有。與其說我們是被PetShop“毒害”了,倒不如說我們是被自己、被自己那種不良的學(xué)習(xí)習(xí)慣毒害了。我們僅看表象,還是只看了一個(gè)表象,然后就冒然對分層架構(gòu)蓋棺定論。而沒能透過想象看本質(zhì)。所以,我們同樣犯了“一葉障目”的錯(cuò)誤。


以上的錯(cuò)誤,筆者也曾經(jīng)犯過!所以,在下文中,我想和朋友們一起分享一下我在反省自己的過程中,悟出的一些心得體會(huì),希望能借此幫助更多朋友盡快走出“一葉障目”。


洞悉分層的本質(zhì)


我們可以討論如何分層,可以討論分層的利弊,可以討論分層有沒有價(jià)值……但在這一切一切討論之前,我們要先弄清楚一件事:分層的本質(zhì)是什么?或者說:分層是怎么來的?如果這個(gè)問題不明晰,那么我們其他的討論猶如“浮沙之上筑高臺(tái)”,再精辟的言辭,如果沒有一個(gè)牢固的基礎(chǔ),也是站不住腳的。


想要了解分層的本質(zhì),就不得不說說分工。分工可以說是勞動(dòng)生產(chǎn)力上最大的改良,最初分工的好處體現(xiàn)在“比較優(yōu)勢”上,由于各司其職,每個(gè)人可以從事其最擅長的勞動(dòng),再加上單純勞動(dòng)所帶來的勞動(dòng)熟練度提升和減少了更換勞動(dòng)時(shí)的損失,使得勞動(dòng)生產(chǎn)率大幅提升。然而,隨著社會(huì)的發(fā)展,我們發(fā)現(xiàn)某些特殊形式的分工不但可以提高生產(chǎn)力,還有另一些好處!為了理解這些好處,我們舉個(gè)實(shí)際的例子。


今天是六一國際兒童節(jié),一位母親想給她的女兒買一個(gè)奶油蛋糕作為禮物。我們知道,蛋糕需要面粉、需要雞蛋、需要牛奶等等,還需呀經(jīng)過一系列復(fù)雜的加工和包裝過程,但是這位母親不需要關(guān)心這些,她只要去附近的超市直接買就行了。而超市里既沒有養(yǎng)雞場,也沒有奶牛場,更沒有種小麥的農(nóng)民伯伯和烘焙蛋糕的工人師傅。這個(gè)簡單的“買蛋糕”場景,大約可以用下圖表示。

圖1


圖1大約說明了一個(gè)蛋糕是如何從到達(dá)顧客手里的。可以看到,制作蛋糕不是一個(gè)單一的勞動(dòng),需要許多的分工,如果自底向上看,主要的分工包括:基礎(chǔ)物質(zhì)資料的種植生產(chǎn)、原料加工、蛋糕加工、商業(yè)銷售。并不是所有分工都如上圖這樣,上圖所示的分工,有一些特點(diǎn),下面總結(jié)一下。


1.下層不知道上層的存在。例如奶牛廠生產(chǎn)牛奶,它不必知道牛奶被拿去做什么,可能被奶油廠收購去做奶油,也可能被雪糕廠收購了做雪糕,也可能被收購去做奶糖,總之,它只管完成自己的職責(zé)——生產(chǎn)牛奶,而對于它的上層一無所知。同樣,奶油加工廠只管生產(chǎn)奶油,它不必知道奶油被拿去做蛋糕還是做摩卡咖啡。


2.每一層僅僅知道它的下一層(最后一層除外,因?yàn)樽詈笠粚記]有下一層),而不知道另外的下層。例如,蛋糕廠只需知道從面粉廠、奶油廠和雞蛋廠提取面粉、奶油、雞蛋就行了,而不必關(guān)心面粉是怎么來了、奶油是怎么來的這些問題。


可以說,符合以上兩點(diǎn)的分工就是分層架構(gòu)的思想來源。下面說的稍微正式一點(diǎn)。所謂分層思想,就是這樣一種分工:它將系統(tǒng)按不同的職責(zé)組織成有序的層次。其中,除最上層外,每一層僅提供若干服務(wù)供其相鄰的上層使用,但不知道上層的存在;除最下層外,每一層僅調(diào)用其臨近下層的服務(wù)。


所以,所謂“分層思想”,不過是一種特殊的分工形式。而計(jì)算機(jī)軟件架構(gòu)中的分層思想,是將這一思想應(yīng)用于軟件開發(fā)中的特例,而PetShop所使用的“DAL+BLL+PL”的方式,又不過是將這一思想應(yīng)用于軟件開發(fā)中的特例的特例。例如,如果某個(gè)系統(tǒng)的業(yè)務(wù)很簡單,僅僅是增刪改查,那么BLL就沒有作用,“DAL+PL”的方式就可以很好完成,這也是很好的分層架構(gòu)。再如,如果某個(gè)系統(tǒng)的業(yè)務(wù)很復(fù)雜,需要先規(guī)格化,再做運(yùn)算,再做整理,那么“DAL+規(guī)格化層+計(jì)算層+整理層+PL”這種五層架構(gòu)也是很合理的啊。如果某個(gè)系統(tǒng)BLL所暴露的接口太繁雜,那么使用Facade模式在BLL和PL之間加一個(gè)“Facade Service Layer”也是很正常的。再者,如果某個(gè)系統(tǒng)不需要數(shù)據(jù)存取功能,例如計(jì)算器程序,我們只是想把表示和業(yè)務(wù)(計(jì)算功能)分開,那么就沒有DAL了,“BLL+PL”就是合理的。所以,用分層的思想進(jìn)行架構(gòu),本質(zhì)是“將系統(tǒng)按不同職責(zé)組織成有序?qū)哟?hellip;…”這一段話描述的,而不是簡單“將系統(tǒng)分成DAL+BLL+PL”,更不是“按PetShop的方式進(jìn)行架構(gòu)”。


下面,摘錄一段Fowler在《Patterns of Enterprise Application Architecture》中對分層的定義:


When thinking of a system in terms of layers, you imagine the principal subsystem in the software arranged in some form of layer cake,where each layer rests on lower layer. In this scheme the higher layer uses various services defined by lower layer,but lower layer is unaware of the higher layer. Furthemore, each layer usally hides its lower layers from the layers above.


——Martin Fowler, 《Patterns of Enterprise Application Architecture》, P17


大致譯文如下:


當(dāng)我們說一個(gè)系統(tǒng)是分層架構(gòu)的時(shí)候,你可以把這個(gè)軟件想象成一個(gè)有很多層的蛋糕的樣子,其中每一層放在它的下一層上。較高層使用諸多較低層定義和提供的服務(wù),但較低層并沒有察覺較高層的存在。另外,每一層都會(huì)對其上層隱藏更低的層。


——馬丁 福勒, 《企業(yè)應(yīng)用架構(gòu)模式》, P17


但是,這里有一點(diǎn)需要聲明:雖然說“DAL+BLL+PL”不等價(jià)于分層架構(gòu),而僅僅是一種實(shí)例。但同時(shí)我們要清楚的認(rèn)識(shí)到,這個(gè)方式之所以如此流行,以至于微軟的官方示例都這樣架構(gòu),是因?yàn)閷τ谠S多系統(tǒng),特別是大中型MIS系統(tǒng),這種架構(gòu)方式是應(yīng)該優(yōu)先考慮的。在這一節(jié)中,筆者絕對沒有對“DAL+BLL+PL”進(jìn)行批判的意思,相反,當(dāng)開發(fā)系統(tǒng)時(shí),這種方式可以優(yōu)先考慮,然后可以根據(jù)系統(tǒng)的特點(diǎn),進(jìn)行一定得改良。筆者在本節(jié)所強(qiáng)調(diào)的是:不能把“DAL+BLL+PL”看做分層架構(gòu)的本質(zhì),更不能和“分層架構(gòu)”這個(gè)思想概念劃等號(hào)。


分層架構(gòu)的利弊分析


在理解了分層架構(gòu)的本質(zhì)的基礎(chǔ)上,我們才可以放心大膽的對分層架構(gòu)進(jìn)行利弊分析。廢話少講,這一節(jié)我們直接切入正題。


分層架構(gòu)的優(yōu)點(diǎn)如下:


1.分離開發(fā)人員的關(guān)注。由于某一層僅僅調(diào)用其相鄰下一層所提供的服務(wù),所以,只要本層的API和相鄰下一層的API定義完整,開發(fā)人員在開發(fā)某一層時(shí)就可以像關(guān)注集中于這一層所用的思想、模式、技術(shù),這樣,就等同于將分工帶來的生產(chǎn)力提高優(yōu)勢引入軟件開發(fā)。又如買蛋糕的例子,作為超市,只要知道下層API(如何從蛋糕廠獲取蛋糕)和本層需要實(shí)現(xiàn)的API(把蛋糕銷售給客戶),就可以制定自己的業(yè)務(wù)模式很策略計(jì)劃了,而不必關(guān)心如何種小麥、如何磨面粉、如何做奶油、如何做蛋糕等。這樣,超市只需進(jìn)行商業(yè)運(yùn)作,而不必進(jìn)行產(chǎn)業(yè)運(yùn)作,如此專一,必然提高業(yè)務(wù)水平。


2.無損替換。想象一下,如果某家奶牛場倒閉了,奶油加工廠也要跟著倒閉嗎?當(dāng)然不會(huì),它可以迅速更換一家奶牛場,因?yàn)楦鱾(gè)奶牛場都可以實(shí)現(xiàn)“提供牛奶”這項(xiàng)服務(wù)。再譬如,如果某天國家出臺(tái)政策,要求所有奶油廠必須從審查合格的奶牛場引進(jìn)原料,恰好某奶油廠的合作牛奶供應(yīng)商沒能通過審查,那么,只要換一家通過審查的合作就行了。而且奶油廠內(nèi)部的各個(gè)環(huán)節(jié)一動(dòng)不用動(dòng),因?yàn)椴煌哪膛龆伎梢蕴峁?ldquo;供應(yīng)牛奶”這個(gè)服務(wù)。而如果奶油廠自己養(yǎng)牛生產(chǎn)牛奶,一旦遇到這個(gè)政策,還得自己去有關(guān)部門進(jìn)行審查,調(diào)整相應(yīng)業(yè)務(wù)流程,牽一發(fā)而動(dòng)全身。程序中同樣的道理,最常聽說的可能就是遷移數(shù)據(jù)庫了。


3.降低了系統(tǒng)間的依賴。還是蛋糕那個(gè)例子,如果某天蛋糕廠內(nèi)部換機(jī)器了,或業(yè)務(wù)流程調(diào)整了,請問顧客需要關(guān)心嗎?顯然不用,因?yàn)轭櫩椭徽{(diào)用超市提供的服務(wù)。而超市為顧客隱藏了下面所有產(chǎn)業(yè)細(xì)節(jié)。如果每一個(gè)顧客買一樣商品,都要了解這個(gè)商品從原料生產(chǎn)到成型再到銷售的一系列細(xì)節(jié),豈不累死了。換做程序中,就如表示層只管調(diào)用業(yè)務(wù)層的服務(wù),至于業(yè)務(wù)層下還有幾層?各種數(shù)據(jù)是怎么來的?怎么存的?是真實(shí)的還是捏造的?都不需要了解,這大大降低了系統(tǒng)各職責(zé)之間的依賴。


4.復(fù)用。例如,你可以去這個(gè)超市買東西,我也可以去這個(gè)超市買東西。蛋糕廠可以從面粉廠提取面粉,饅頭廠也可以。這樣,同樣的層就可以為不同的上層提供服務(wù),達(dá)到了復(fù)用的目的。具體到程序中,例如氣象局制作發(fā)布了一個(gè)“Service Layer”,用于提供天氣預(yù)告信息。這樣新浪、搜狐這些網(wǎng)站可以利用這個(gè)服務(wù)層提供的服務(wù),制作天氣預(yù)告頁面,QQ也可以利用這個(gè)服務(wù)在它的聊天工具上添加天氣預(yù)告,你自己做一個(gè)軟件需要用到天氣預(yù)告功能,也可以調(diào)用氣象臺(tái)的“Service Layer”。


說罷優(yōu)點(diǎn),再來談?wù)劮謱蛹軜?gòu)的弊端:


1.級聯(lián)修改問題。這個(gè)問題在現(xiàn)實(shí)中不好比喻,但在程序中相信很多朋友都明白。例如,一個(gè)人事管理系統(tǒng),本來查看人員信息只能分頁查看,而現(xiàn)在,需要增加一個(gè)功能:在分頁的同時(shí)還能分部門。例如,可以查看“銷售部的前50個(gè)人”,這樣,為了這個(gè)功能所有層都需要修改。


2.性能問題。本來直來直去的操作,現(xiàn)在要層層傳遞,勢必造成性能的下降。就如在購買蛋糕的例子中。顧客在享受分工帶來的便利時(shí),也要承受由于不同層的部門分布各地而造成的蛋糕價(jià)格上升,這是因?yàn)榉謱釉黾恿顺杀,如運(yùn)輸、不同層間部門的協(xié)調(diào)管理成本等。


縱觀以上分析,分層架構(gòu)有利有弊。這是一定得,世上任何事物都有利弊,所以,把“分層架構(gòu)捧上天”和“一棍子打死”這兩種做法都是不明智也是不科學(xué)的。對待分層架構(gòu),我們的態(tài)度應(yīng)當(dāng)是明晰其本質(zhì)和利弊,然后根據(jù)具體情況做出理性的分析和抉擇。


從上面的分析可以看出,分層架構(gòu)可以降低層內(nèi)變化的成本,而對于API的變化非常敏感。如在級聯(lián)修改中提到的“在分頁的同時(shí)還能分部門”的新需求,就是對API進(jìn)行的變動(dòng)。API的變動(dòng)對于分層架構(gòu)是致命的,修改起來難度非常大。所以,一個(gè)簡單的判斷法則就是:如果您的系統(tǒng)層內(nèi)頻繁變動(dòng)(甚至整層替換)可能性很大,而API變動(dòng)可能性很小,就使用分層;而如果API可能會(huì)頻繁變動(dòng),那就要謹(jǐn)慎使用分層架構(gòu)了。


后面的話


其實(shí),我想說的主要內(nèi)容,就是前面三節(jié)了。不過還是有些話,想和大家嘮叨嘮叨。


這篇文章,不是一篇技術(shù)文章,所以通篇不提技術(shù)細(xì)節(jié),而只是想幫大家澄清對分層的誤解。最近看了很多對分層架構(gòu)(或三層架構(gòu))的探討,其中以批判居多,有的甚至認(rèn)為分層就是個(gè)沒用的垃圾東西。我想,產(chǎn)生這種想法的人,大致經(jīng)過了以下階段:聽說分層,粗略學(xué)習(xí)分層、模仿使用分層、用得十分不爽、出來批判。


其實(shí),任何技術(shù)都是客觀的,都沒有錯(cuò)誤,錯(cuò)誤在人,是人沒有正確使用,或沒有用到合適的地方。就像我們不能批判刀片不適合劈叉,也不能批判柴刀不適合刮胡子。一項(xiàng)技術(shù)想要發(fā)揮威力,關(guān)鍵要正確運(yùn)用,而要正確運(yùn)用,就需要有深厚的功底,需要我們努力學(xué)習(xí),勤于思考。這不是一朝一夕的事情,要有持久的毅力。我們要爭取做一個(gè)善于用功、善于把握事物本質(zhì)的人,而不是一個(gè)用刀片劈柴、用柴刀刮胡子,然后大罵刀片和柴刀都是垃圾的人。


分層思想從來就不是軟件架構(gòu)中首先提出來的,我們天天上網(wǎng)用到的網(wǎng)絡(luò),都遵循OSI七層協(xié)議,網(wǎng)絡(luò)結(jié)構(gòu)的設(shè)計(jì)是分層思想合理應(yīng)用的一個(gè)典范。另外,在許多其他工程技術(shù)領(lǐng)域,分層思想也是很普遍的。所以,不要把分層當(dāng)成計(jì)算機(jī)人士甚至軟件開發(fā)人士獨(dú)有的能力,相對那些領(lǐng)域,將分層應(yīng)用于軟件架構(gòu)的技術(shù)還很不成熟,還有許多事情等待我們?nèi)プ觥?/p>


最后強(qiáng)烈推薦一本書:Martin Fowler的《Patterns of Enterprise Application Architecture》,相信看完這本書,對于分層思想的理解和分層中具體模式的運(yùn)用決策都會(huì)有大幅提高。你會(huì)明白,原來分層不是只有“DAL”、“BLL”,原來分層還有怎么多內(nèi)在的東西。


轉(zhuǎn):http://www.cnblogs.com/leoo2sk/archive/2009/06/01/1494095.html張洋