文章開始之前我給大家分享一個java架構(gòu)交流群 群號:656039503? 每天大牛為你直播分享知識點
軟件架構(gòu)作為一個概念温眉,體現(xiàn)在技術(shù)和業(yè)務(wù)兩個方面钧舌。
從技術(shù)角度來說:軟件架構(gòu)隨著技術(shù)的革新不斷地更新其內(nèi)容慎皱,軟件架構(gòu)建立于當(dāng)前技術(shù)和一些基本原則
java高級
的基礎(chǔ)之上裸扶。?先說一些基本原則:
分層原則:分層是為了降低軟件深度復(fù)雜性而使用的關(guān)鍵思想,就像社會有了階級一樣更鲁,軟件有了層次結(jié)構(gòu)。
模塊化原則:模塊化是化解軟件廣度復(fù)雜的必然手段奇钞,模塊化的目的就是讓軟件分工澡为。
接口實現(xiàn)分離原則隨著軟件模塊化的不斷深入改進(jìn),面向接口編程而不是面向?qū)崿F(xiàn)編程可以讓復(fù)雜度日趨增高的軟件降低模塊之間的耦合度景埃,從而讓各模塊更輕松改進(jìn)媒至。從這個原則出發(fā),軟件也從微觀進(jìn)行了細(xì)致的規(guī)范化谷徙。java架構(gòu)交流群 群號:656039503 ?每天大牛為你直播分享知識點
還有兩個比較小但很重要的原則:
細(xì)節(jié)隱藏原則很顯然把復(fù)雜問題簡化拒啰,把難看的細(xì)節(jié)隱去,能讓軟件結(jié)構(gòu)更清晰完慧。其實這個原則使用很普遍谋旦,java/c++語言中的封裝原則以及設(shè)計模式中的Facade(外觀)模式就很能體現(xiàn)這個原則的精神。?依賴倒置原則隨著軟件結(jié)構(gòu)的進(jìn)一步發(fā)展,層與層之間屈尼、模塊與模塊之間的依賴逐漸加深册着,而層、模塊的動態(tài)可插拔要求不端增大脾歧。依賴倒置原則可看視為接口實現(xiàn)分離原則的深化甲捏,根據(jù)此原則的精神,軟件進(jìn)入了工具時代鞭执。這個原則有點類似于知名的好萊塢法則:Don't?call?us,?we'll?call?you司顿。
以上這些原則奠定了我們的軟件架構(gòu)的價值指標(biāo)芒粹。但軟件架構(gòu)畢竟是建立在當(dāng)前技術(shù)之上的。而每一代技術(shù)都有架構(gòu)模式大溜。過去的不再說了化漆,讓我們現(xiàn)在就來看一下當(dāng)前流行的技術(shù),以及當(dāng)前我們能采用的架構(gòu)猎提。?因為面向?qū)ο笫钱?dāng)前最流行開發(fā)技術(shù)获三,且設(shè)計模式的大量使用使面向?qū)ο蟮淖呦虺墒欤鴶?shù)據(jù)庫是當(dāng)前最有效的存儲結(jié)構(gòu)锨苏、web界面是當(dāng)前最流行的用戶接口疙教,所以當(dāng)前最典型的三層次架構(gòu)就架構(gòu)在以上幾項技術(shù)的基礎(chǔ)之上,用數(shù)據(jù)庫作存儲層伞租、用面向?qū)ο髞韺崿F(xiàn)業(yè)務(wù)層贞谓、用web來作為用戶接口層。我們從三層次架構(gòu)談起:
因為面向?qū)ο蠹夹g(shù)和數(shù)據(jù)庫技術(shù)不適配葵诈,所以在標(biāo)準(zhǔn)三層次架構(gòu)的基礎(chǔ)上裸弦,我們增加了數(shù)據(jù)持久層,來管理O-R雙向映射作喘,但目前一直沒有最理想的實現(xiàn)技術(shù)理疙。cmp和entity?bean技術(shù)因為其實現(xiàn)復(fù)雜,功能前景有限泞坦,已接近被淘汰的邊緣窖贤。JDO及hibernate作為o-r映射的后期之秀,尤其是hibernate贰锁,功能相當(dāng)完備赃梧。推薦作為持久層的首選
在業(yè)務(wù)層,因為當(dāng)前業(yè)務(wù)日趨負(fù)載,且變動頻繁豌熄,所以我們必須有足夠敏捷的技術(shù)來保證我們的適應(yīng)變化的能力授嘀,在標(biāo)準(zhǔn)j2ee系統(tǒng)中session?bean負(fù)責(zé)業(yè)務(wù)處理,且有不錯的性能表現(xiàn)锣险,但采用ejb系統(tǒng)對業(yè)務(wù)架構(gòu)模式改變太大蹄皱,且其復(fù)雜而昂貴,業(yè)務(wù)代碼移植性差芯肤。而spring?作為一個bean配置的輕量級架構(gòu)夯接,漂亮的IOC模式實現(xiàn),對業(yè)務(wù)架構(gòu)影響小纷妆,所以推薦作為中間層業(yè)務(wù)框架盔几。
在用戶結(jié)構(gòu)層,雖然servlet/jsp/jstl/javaBean?能夠?qū)崿F(xiàn)MVC架構(gòu),但終究過于粗糙。struts對MVC架構(gòu)的實現(xiàn)就比較完美掩幢,Taperstry也極好地實現(xiàn)MVC架構(gòu)逊拍,且采用基于事件的方式上鞠,非常誘人,惜其不夠成熟芯丧,我們?nèi)耘f推薦struts作為用戶接口層基礎(chǔ)架構(gòu)芍阎。
因為業(yè)務(wù)層是三層次架構(gòu)中最有決定意義的,所以讓我們回到業(yè)務(wù)層細(xì)致地分析一下缨恒,在復(fù)雜的業(yè)務(wù)我們常常需要以下基礎(chǔ)服務(wù)的一種或幾種:事務(wù)一致性服務(wù)acid(tool:jta/jts)谴咸、并發(fā)加鎖服務(wù)
concurrent&&lock、池化管理服務(wù)cache骗露、訪問控制服務(wù)(tool:jaas)岭佳、流程控制服務(wù)workflow、動態(tài)實現(xiàn)服務(wù)IOC萧锉,串行化消息服務(wù)(tool:jms)珊随、負(fù)載平衡服務(wù)blance等。如果我們不采用重量級應(yīng)用服務(wù)器(如weblogic,websphere,jboss等)及重量級組件(EJB)柿隙,我們必須自己實現(xiàn)其中一些服務(wù)叶洞。雖然我們大多情況下,不需要所有這些服務(wù)禀崖,但實現(xiàn)起來卻非易事衩辟。幸運的是我們有大量的開源實現(xiàn)代碼,但采用開源代碼卻常常是件不輕松的事。
隨著xml作為結(jié)構(gòu)化信息傳輸和存儲地位日漸重要,一些xml文檔操作工具(DOM,Digester,SAX等)的使用愈發(fā)重要,而隨著xml?schema的java?binding工具(jaxb,xmlbean等)工具的成熟波附,采用xml?schema來設(shè)計
xml文檔格式,然后采用java?binding來生成java?bean?會成為主要編程模式,而這又進(jìn)一步使數(shù)據(jù)中心向xml轉(zhuǎn)移,使在中小數(shù)據(jù)量上,愈發(fā)傾向于以xquery為查詢語言的xml數(shù)據(jù)庫惭婿。最近還有一個趨
勢,microsoft,ibm等紛紛大量開發(fā)中間軟件如(microsoft?office之infopath),可以直接從xml?schema?生成?錄入頁面等非常實用的功能叶雹。還有web?service?的廣泛應(yīng)用,都將對軟件的架構(gòu)有非常重大的影響换吧。至于面向服務(wù)架構(gòu)(SOA)前景如何折晦,三層次架構(gòu)什么時候走入歷史,現(xiàn)在還很難定論沾瓦。
aop的發(fā)展也會對軟件架構(gòu)有很深的影響满着,但在面向?qū)ο蠹軜?gòu)里,無論aspectJ還是jboss-aop抑是aspectWerks贯莺、nanning都有其自身的嚴(yán)重問題:維護(hù)性很差,所以說它將很難走遠(yuǎn)风喇。也許作為一個很好的思想,它將在web?service里大展身手缕探。
rdf,owl作為w3c語義模型的標(biāo)志性的語言,也很難想象能在當(dāng)前業(yè)務(wù)架構(gòu)發(fā)揮太大影響魂莫。但如果真如它所聲稱那樣,廣泛地改變著信息的結(jié)構(gòu)爹耗。那么對軟件架構(gòu)也會有深遠(yuǎn)影響耙考。?有關(guān)架構(gòu)設(shè)計的一些忠告:
盡量建立完整的持久對象層.可獲得高回報
盡量將各功能分層,分塊,每一模塊均依賴假定的其它模塊的外觀
不能依賴靜態(tài)數(shù)據(jù)來實現(xiàn)IOC模式谜喊,應(yīng)該依賴數(shù)據(jù)特征接口,靜態(tài)數(shù)據(jù)僅是數(shù)據(jù)特征接口實現(xiàn)方式之一?架構(gòu)設(shè)計時xml是支持而不是依賴.但可以提供單一的xml版本的實現(xiàn)
從業(yè)務(wù)角度說:軟件架構(gòu)應(yīng)是深刻體現(xiàn)業(yè)務(wù)內(nèi)部規(guī)則的業(yè)務(wù)架構(gòu)倦始,但因為業(yè)務(wù)變化頻纴斗遏,所以軟件架構(gòu)很
難保持恒定不變,但業(yè)務(wù)的頻繁變化不應(yīng)是軟件架構(gòu)大規(guī)模頻繁變化的原因鞋邑,軟件架構(gòu)應(yīng)是基于變化的架構(gòu)诵次。
一種業(yè)務(wù)有其在一段時間內(nèi)穩(wěn)定存在的理由(暫且不談),業(yè)務(wù)內(nèi)部有許多用例枚碗,每一種用例都有固定的規(guī)則逾一,每一規(guī)則都有一些可供判定的項,每一項從某一維度來觀察都是可測量的视译,我們的架構(gòu)首先必須保證完美適應(yīng)每一項每一種測量方式嬉荆,很多失敗的架構(gòu)都是因為很多項的測量方式都發(fā)生變更這種微觀變化中。?每個用例都有規(guī)則酷含,我們在作業(yè)務(wù)用例分析鄙早,常常假定一些規(guī)則是先驗的,持久穩(wěn)定的椅亚,然而后來的業(yè)務(wù)改變常常又證明這種看法是錯誤的限番,然而常常我們的架構(gòu)已經(jīng)為之付出了不可挽回的代價。大量事實證明:規(guī)則的變化常常用例變化的根本原因呀舔。所以我們的架構(gòu)要盡可能適應(yīng)規(guī)則的變化弥虐,盡可能建立規(guī)則模版。?每個用例都關(guān)系著不同的角色媚赖。每一個用例的產(chǎn)生都必然是因為角色的變更(注意:不是替換霜瘪,而是增強(qiáng)或減弱),所以注意角色的各種可能情況惧磺,對架構(gòu)的設(shè)計有舉足輕重的意義颖对。在我們當(dāng)前的三層架構(gòu)里,角色完美地對應(yīng)接口概念磨隘。
在一個系統(tǒng)里很多用例都相互關(guān)聯(lián),考慮到每個用例均有可能有不同的特例缤底,所以在架構(gòu)設(shè)計中,盡量采用依賴倒置原則番捂。如架構(gòu)許可可采用消息通信模式(JMS)个唧。這樣可降低耦合度。
現(xiàn)在我們談一下業(yè)務(wù)穩(wěn)定存在理由對業(yè)務(wù)的影響设预。存在即是合理徙歼,在這里當(dāng)然是正確的。業(yè)務(wù)因人而存在,所以問業(yè)務(wù)存在的理由即是問不同角色的需要這項業(yè)務(wù)的理由以及喜歡不喜歡當(dāng)前業(yè)務(wù)用例的理由鲁沥,所有這樣的角色都應(yīng)該在系統(tǒng)里預(yù)留呼股。《待續(xù)》?在架構(gòu)設(shè)計中有幾個原則可以考慮:?用例盡量細(xì)分?用例盡量抽象?角色盡量獨立?項測量獨立原則?追求簡單性
這里未提供相關(guān)的例子画恰,例子會在以后的更新時提供彭谁。
業(yè)務(wù)和模式之間的關(guān)系
業(yè)務(wù)中的一些用例之間的關(guān)系常常和一些常規(guī)的模式很相似。但隨著時間的演化允扇,慢慢地和先前的模式有了分歧缠局。這是個正常的現(xiàn)象。但這對系統(tǒng)架構(gòu)卻要求非常高考润,要求系統(tǒng)架構(gòu)能適應(yīng)一些模式的更替狭园。在這里我們盡可能早地注意到用例之間的相互角色變化,為架構(gòu)更新做好準(zhǔn)備.
企業(yè)應(yīng)用架構(gòu)模式
《敏捷軟件開發(fā)原則糊治、模式與實踐》?《UML精粹》?《快速軟件開發(fā)》?一唱矛、Java編程入門類
對于沒有Java編程經(jīng)驗的程序員要入門,隨便讀什么入門書籍都一樣井辜,這個階段需要你快速的掌握J(rèn)ava基礎(chǔ)語法和基本用法绎谦,宗旨就是“囫圇吞棗不求甚解”,先對Java熟悉起來再說粥脚。用很短的時間快速過一遍Java語法窃肠,連懵帶猜多寫寫代碼,要“知其然”刷允。??1冤留、《Java編程思想》
在有了一定的Java編程經(jīng)驗之后,你需要“知其所以然”了树灶。這個時候《Java編程思想》是一本讓你知其所以然的好書纤怒,它對于基本的面向?qū)ο笾R有比較清楚的交待,對Java基本語法天通,基本類庫有比較清楚的講解泊窘,可以幫你打一個良好的Java編程基礎(chǔ)。這本書的缺點是實在太厚土砂,也比較羅嗦,不適合現(xiàn)代人快節(jié)奏學(xué)習(xí)谜洽,因此看這本書要懂得取舍萝映,不是每章每節(jié)都值得一看的,挑重點的深入看就可以了阐虚。??2序臂、《Agile?Java》中文版
這本書是出版社送給我的,我一拿到就束之高閣,放在書柜一頁都沒有翻過奥秆,但是前兩天整理書柜的時候逊彭,拿出來一翻,竟然發(fā)現(xiàn)這絕對是一本好書构订!這本書一大特點是以單元測試和TDD來貫穿全書的侮叮,在教你Java各種重要的基礎(chǔ)知識的過程中,潛移默化的影響你的編程思維走向敏捷悼瘾,走向TDD囊榜。另外這本書成書很新,以JDK5.0的語法為基礎(chǔ)講解亥宿,要學(xué)習(xí)JDK5.0的新語法也不錯卸勺。還有這本書對于內(nèi)容取舍也非常得當(dāng),Java語言畢竟類庫龐大烫扼,可以講的內(nèi)容太多曙求,這本書選擇的內(nèi)容以及內(nèi)容的多寡都很得當(dāng),可以讓你以最少的時間掌握J(rèn)ava最重要的知識映企,順便培養(yǎng)出來優(yōu)秀的編程思路悟狱,真是一本不可多得的好書。
雖然作者自己把這本書定位在入門級別卑吭,但我不確定這本書用來入門是不是稍微深了點芽淡,我自己也準(zhǔn)備有空的時候翻翻這本書,學(xué)習(xí)學(xué)習(xí)豆赏。
二挣菲、Java編程進(jìn)階類
打下一個良好的Java基礎(chǔ),還需要更多的實踐經(jīng)驗積累掷邦,我想沒有什么捷徑白胀。有兩本書值
得你在編程生涯的這個階段閱讀,培養(yǎng)良好的編程習(xí)慣抚岗,提高你的代碼質(zhì)量或杠。??1、《重構(gòu)?改善既有代碼的設(shè)計》
這本書名氣很大宣蔚,不用多介紹向抢,可以在閑暇的時候多翻翻,多和自己的實踐相互印證胚委。這本書對你產(chǎn)生影響是潛移默化的挟鸠。
2、《測試驅(qū)動開發(fā)?by?Example》?本書最大特點是很薄亩冬,看起來沒有什么負(fù)擔(dān)艘希。你可以找一個周末的下午,一邊看,一邊照做覆享,一個下午就把書看完佳遂,這本書的所有例子跑完了。這本書的作用是通過實戰(zhàn)讓你培養(yǎng)TDD的思路撒顿。
三丑罪、Java架構(gòu)師之路
到這個階段,你應(yīng)該已經(jīng)非常嫻熟的運用Java編程核蘸,而且有了一個良好的編程思路和習(xí)慣了巍糯,但是你可能還缺乏對應(yīng)用軟件整體架構(gòu)的把握,現(xiàn)在就是你邁向架構(gòu)師的第一步客扎。
1祟峦、《Expert?One-on-One?J2EE?Design?and?Development》
這本書是Rod?Johnson的成名著作,非常經(jīng)典徙鱼,從這本書中的代碼誕生了springframework宅楞。但是好像這本書沒有中譯本。
2袱吆、《Expert?One-on-One?J2EE?Development?without?EJB》
這本書由gigix組織翻譯厌衙,多位業(yè)界專家參與,雖然署名譯者是JavaEye绞绒,其實JavaEye出力不多婶希,實在是忝居譯者之名。
以上兩本書都是Rod?Johnson的經(jīng)典名著蓬衡,Java架構(gòu)師的必讀書籍喻杈。在我所推薦的這些書籍當(dāng)中,是我看過的最仔細(xì)狰晚,最認(rèn)真的書筒饰,我當(dāng)時讀這本書幾乎是廢寢忘食的一氣讀完的,有小時候挑燈夜讀金庸武俠小說的勁頭壁晒,書中所講內(nèi)容和自己的經(jīng)驗知識一一印證瓷们,又被無比精辟的總結(jié)出來,讀完這本書以后秒咐,我有種被打通經(jīng)脈谬晕,功力爆增的感覺。
但是后來我看過一些其他人的評價携取,似乎閱讀體驗并沒有我那么high攒钳,也許是因為每個人的知識積累和經(jīng)驗不同導(dǎo)致的。我那個時候剛好是經(jīng)驗知識積累已經(jīng)足夠豐富歹茶,但是還沒有系統(tǒng)的整理成型夕玩,讓這本書一梳理,立刻形成完整的知識體系了惊豺。
3燎孟、《企業(yè)應(yīng)用架構(gòu)模式》
Martin的又一本名著,但這本書我只是泛泛的看了一遍尸昧,并沒有仔細(xì)看揩页。這本書似乎更適合做框架的人去看,例如如果你打算自己寫一個ORM的話烹俗,這本書是一定要看的爆侣。但是做應(yīng)用的人,不看貌似也無所謂幢妄,但是如果有空兔仰,我還是推薦認(rèn)真看看,會讓你知道框架為什么要這樣設(shè)計蕉鸳,這樣你的層次可以晉升到框架設(shè)計者的角度去思考問題乎赴。Martin的書我向來都是推崇,但是從來都沒有像Rod?Johnson的書那樣非常認(rèn)真去看潮尝。
4榕吼、《敏捷軟件開發(fā)原則、模式與實踐》
Uncle?Bob的名著勉失,敏捷的經(jīng)典名著羹蚣,這本書比較特別,與其說是講軟件開發(fā)過程的書乱凿,不如說講軟件架構(gòu)的書顽素,本書用了很大篇幅講各種面向?qū)ο筌浖_發(fā)的各種模式,個人以為看了這本書告匠,就不必看GoF的《設(shè)計模式》了戈抄。
四、
軟件開發(fā)過程了解軟件開發(fā)過程不單純是提高程序員個人的良好編程習(xí)慣后专,也是增強(qiáng)團(tuán)隊協(xié)作的基礎(chǔ)?
如何更好的學(xué)習(xí)架構(gòu)歡迎大家加群交流:656039503【JAVA大神學(xué)習(xí)交流】里面有Java高級大牛直播講解知識點 走的就是高端路線