目錄
程序員的三個(gè)層次:普通程序員(會(huì)編寫代碼供璧,即能讓程序跑起來(lái),能正確地處理業(yè)務(wù)流程和對(duì)數(shù)據(jù)進(jìn)行計(jì)算)冻记、工程師(不僅會(huì)編寫代碼嗜傅,還會(huì)用工程的方法來(lái)編寫代碼,以便讓代碼開發(fā)更為高效和快速檩赢。他們把編程當(dāng)成一種設(shè)計(jì)吕嘀,一種工業(yè)設(shè)計(jì),把代碼模塊化贞瞒,讓這些模塊可以更容易地交互偶房、拼裝和組織,讓代碼排列整齊-閱讀維護(hù)這些代碼像看閱兵式一樣舒心暢快)军浆、架構(gòu)師(問(wèn)題的多少和系統(tǒng)的復(fù)雜度呈正比棕洋,而且不僅是線性正比,還可能呈級(jí)數(shù)正比乒融,此時(shí)就越來(lái)越難做技術(shù)決定掰盘。但是摄悯,有一些資深的工程師開始站出來(lái)挑戰(zhàn)這些問(wèn)題,有的基于業(yè)務(wù)分析給出平衡的方案愧捕,有的開始嘗試設(shè)計(jì)更高級(jí)的技術(shù)奢驯,有的開始設(shè)計(jì)更靈活的系統(tǒng),有的則開始簡(jiǎn)化和輕量化整個(gè)系統(tǒng)......這些高智商次绘、經(jīng)驗(yàn)足瘪阁、不怕難的工程師們因亮著這個(gè)那個(gè)行業(yè)前行,他們就是架構(gòu)師)邮偎。
架構(gòu)整潔之道分為三個(gè)部分:編程范式(結(jié)構(gòu)化編程管跺,面向?qū)ο缶幊蹋瘮?shù)式編程)禾进、設(shè)計(jì)原則(SOLID)豁跑、軟件架構(gòu)。
架構(gòu)整潔之道可以讓你從微觀(代碼層面)和宏觀(架構(gòu)層面)兩個(gè)層面對(duì)軟件設(shè)計(jì)有一個(gè)全面的了解泻云。
架構(gòu)整潔之道是架構(gòu)方面的入門級(jí)讀物贩绕。
無(wú)論是微觀世界的代碼,還是宏觀層面的架構(gòu)壶愤,無(wú)論是三種編程范式還是微服務(wù)架構(gòu),他們都在解決一個(gè)問(wèn)題-分離控制(對(duì)程序流轉(zhuǎn)的與業(yè)務(wù)無(wú)關(guān)的代碼或系統(tǒng)的控制)和邏輯(業(yè)務(wù)邏輯馏鹤,解決用戶問(wèn)題的代碼)征椒。控制和邏輯構(gòu)成了整體的軟件復(fù)雜度湃累,有效的分離控制和邏輯會(huì)讓你的系統(tǒng)得到最大的簡(jiǎn)化勃救。
區(qū)別幾組詞語(yǔ):簡(jiǎn)單和簡(jiǎn)陋,平衡和妥協(xié)治力,迭代和半成品蒙秒。
所謂架構(gòu),就是用最小的人力成本來(lái)滿足構(gòu)建和維護(hù)系統(tǒng)需求的設(shè)計(jì)行為宵统。
治大國(guó)如烹小鮮晕讲。
軟件架構(gòu)學(xué)關(guān)注的是一個(gè)重點(diǎn)是組織架構(gòu)。不管是討論組件马澈、類瓢省、函數(shù)、模塊痊班,還是層級(jí)勤婚、服務(wù)以及微觀和宏觀的的軟件開發(fā)過(guò)程。
軟件開發(fā)比修理物理建筑需要更長(zhǎng)涤伐、更專注的設(shè)計(jì)過(guò)程馒胆,軟件架構(gòu)師應(yīng)該比建筑架構(gòu)師更懂得架構(gòu)缨称。
一個(gè)好的架構(gòu),不僅要在某個(gè)時(shí)刻滿足軟件用戶祝迂、開發(fā)者和所有者的需求睦尽,更要在一段時(shí)間內(nèi)持續(xù)滿足他們的后續(xù)需求。
一個(gè)系統(tǒng)的常規(guī)變更不應(yīng)該是成本高昂的液兽,也不應(yīng)該是需要難以決策的大型設(shè)計(jì)調(diào)整骂删,更不應(yīng)該需要單獨(dú)立項(xiàng)來(lái)推進(jìn)。這些常規(guī)變更應(yīng)該可以融入每日的或者每周的系統(tǒng)維護(hù)中去完成四啰。
走快的唯一方式是先走好宁玫。
良好的軟件架構(gòu)不是一成不變的,而是通過(guò)不斷打磨和改進(jìn)才能最終成就柑晒。
第一部分 概述
第一章 設(shè)計(jì)和架構(gòu)究竟是什么
一個(gè)軟件架構(gòu)的優(yōu)劣欧瘪,可以用它滿足用戶需求所需要的成本來(lái)衡量。如果該成本很低匙赞,并且在整個(gè)生命周期內(nèi)已知能維持這樣的低成本佛掖,那么,這個(gè)系統(tǒng)的設(shè)計(jì)就是優(yōu)良的涌庭。
無(wú)論從短期還是長(zhǎng)期來(lái)看芥被,胡亂編寫代碼的工作速度其實(shí)要比循規(guī)蹈矩(測(cè)試驅(qū)動(dòng)開發(fā))慢。
第二章 兩個(gè)價(jià)值維度
對(duì)于每個(gè)軟件系統(tǒng)坐榆,我們都可以通過(guò)行為和架構(gòu)兩個(gè)維度來(lái)衡量它的實(shí)際價(jià)值拴魄。軟件研發(fā)人員應(yīng)該確保自己的系統(tǒng)在這兩個(gè)維度的實(shí)際價(jià)值都能長(zhǎng)時(shí)間維持在很高的狀態(tài)。
軟件架構(gòu)師必須創(chuàng)建出一個(gè)可以讓功能實(shí)現(xiàn)更容易席镀、修改起來(lái)更簡(jiǎn)單匹中、擴(kuò)展起來(lái)更輕松的軟件架構(gòu)。
第二部分 從基礎(chǔ)構(gòu)建開始:編程范式
編程范式指的是程序的編寫模式豪诲,與具體的編程語(yǔ)言關(guān)系不大顶捷。
第三章 編程范式總覽
編程范式有結(jié)構(gòu)化編程(對(duì)程序控制權(quán)的直接轉(zhuǎn)移進(jìn)行了規(guī)范和限制,限制的是無(wú)限制的跳轉(zhuǎn))屎篱、面向?qū)ο缶幊蹋▽?duì)程序控制權(quán)的間接轉(zhuǎn)移進(jìn)行了規(guī)范和限制服赎,限制的是函數(shù)指針)、函數(shù)式編程(對(duì)程序?qū)Τ绦蛑械馁x值進(jìn)行了規(guī)范和限制交播,限制的是修改變量的值)专肪。
軟件架構(gòu)的三個(gè)關(guān)注點(diǎn)是:功能性、組件獨(dú)立性以及數(shù)據(jù)管理堪侯。
第四章 結(jié)構(gòu)化編程
順序結(jié)構(gòu)嚎尤、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)可以構(gòu)造出任何程序。
測(cè)試的作用是讓我們得出某段程序已經(jīng)能夠?qū)崿F(xiàn)當(dāng)前目標(biāo)這一結(jié)論伍宦。
結(jié)構(gòu)化編程范式促使我們先將一段程序遞歸講解為一系列可證明的小函數(shù)芽死,然后再編寫相關(guān)的測(cè)試來(lái)試圖證明這些函數(shù)是錯(cuò)誤的。如果這些測(cè)試無(wú)法證偽這些函數(shù)关贵,那么我們就可以認(rèn)為這些函數(shù)是正確的遇骑,今兒推導(dǎo)整個(gè)程序都是正確的。
結(jié)構(gòu)化編程的最有價(jià)值的地方就是揖曾,它賦予了我們創(chuàng)造可證偽程序單元的能力落萎。
在軟件架構(gòu)領(lǐng)域,功能性降解拆分是最佳實(shí)踐之一炭剪。
軟件架構(gòu)師需要定義可以方便地進(jìn)行證偽的模塊练链、組件以及服務(wù)。
第五章 面向?qū)ο缶幊?/h2>
面向?qū)ο缶幊叹褪且远鄳B(tài)為手段來(lái)對(duì)源代碼中的依賴關(guān)系進(jìn)行控制的能力奴拦。這種能力讓軟件架構(gòu)師可以構(gòu)建出某種插件式架構(gòu)媒鼓,讓高層策略性組件與底層實(shí)現(xiàn)性組件相分離,底層組件可以被編譯成插件错妖,實(shí)現(xiàn)獨(dú)立于高層組件的開發(fā)和部署绿鸣。
依賴反轉(zhuǎn)通過(guò)引入接口的方式來(lái)實(shí)現(xiàn)控制流和依賴流的不一致。
第六章 函數(shù)式編程
一個(gè)架構(gòu)良好的應(yīng)用程序應(yīng)該將狀態(tài)可修改的部分和不需要修改的部分隔離成單獨(dú)的組件暂氯,然后通過(guò)合適的機(jī)制來(lái)保護(hù)可變量潮模。
軟件架構(gòu)師應(yīng)該著力于將大部分的邏輯都?xì)w于不可變組件中,可變狀態(tài)組件的邏輯應(yīng)該越少越好痴施。
第三部分 設(shè)計(jì)原則
第七章 SRP:?jiǎn)我宦氊?zé)
任何一個(gè)軟件模塊(函數(shù)和數(shù)據(jù)結(jié)構(gòu))都應(yīng)該只對(duì)某一類行為者負(fù)責(zé)擎厢。
單一職責(zé)原則主要討論的是函數(shù)和類之間的關(guān)系-但是它在兩個(gè)討論層面上會(huì)以不同的形式出現(xiàn)。在組件層面晾剖,我們可以將其稱為共同閉包原則,在軟件架構(gòu)層面梯嗽,它則是用戶奠定架構(gòu)邊界的變更軸心齿尽。
第八章 OCP:開閉原則
一個(gè)設(shè)計(jì)良好的計(jì)算機(jī)系統(tǒng)應(yīng)該在不需要修改的前提下就可以輕易被擴(kuò)展。
OCP是我們進(jìn)行系統(tǒng)架構(gòu)設(shè)計(jì)的主要原則灯节,其主要目標(biāo)是讓系統(tǒng)易于擴(kuò)展循头,同時(shí)限制其每次被修改所影響的范圍。實(shí)現(xiàn)方式是通過(guò)將系統(tǒng)劃分為一些列組件炎疆,并且將這些組件間的依賴關(guān)系按層次結(jié)構(gòu)進(jìn)行組織卡骂,使得高階組件不會(huì)因低階組件被修改而受到影響。
第九章 LSP:里氏替換
如果對(duì)于每個(gè)類型是S的對(duì)象o1都存在一個(gè)類型為T的對(duì)象o2,能使操作T類型的程序P在用o2替換o1時(shí)行為保持不變形入,我們就可以將S成為T的子類型全跨。
LSP可以且應(yīng)該被應(yīng)用于軟件架構(gòu)層面,因?yàn)橐坏┻`背了可替換行亿遂,該系統(tǒng)架構(gòu)就不得不為此增添大量復(fù)雜的應(yīng)對(duì)機(jī)制浓若。
第十章 ISP:接口隔離
任何層次的軟件設(shè)計(jì)如果依賴了它并不需要的東西渺杉,就會(huì)帶來(lái)意料之外的麻煩。
第十一章 DIP:依賴反轉(zhuǎn)
如果想要設(shè)計(jì)一個(gè)靈活的系統(tǒng)挪钓,在源代碼層次的依賴關(guān)系中就應(yīng)該多引用抽象類型是越,而非具體實(shí)現(xiàn)。
源代碼依賴方向永遠(yuǎn)是控制流方向的反轉(zhuǎn)-這就是DIP被稱為依賴反轉(zhuǎn)原則的原因碌上。
面向接口(抽象類)編程倚评。
第四部分 組件構(gòu)建原則
第十二章 組件
組件是軟件部署的單元,是整個(gè)軟件系統(tǒng)在部署過(guò)程中可以獨(dú)立完成部署的最小實(shí)體馏予。
組件化的插件式架構(gòu)已經(jīng)成為我們習(xí)以為常的軟件構(gòu)件形式天梧。
第十三章 組件聚合
組件相關(guān)的基本原則:1)REP:復(fù)用/發(fā)布等同原則;2)CCP:共同閉包原則吗蚌;3)CRP:共同復(fù)用原則腿倚。
軟件復(fù)用的最小粒度應(yīng)等同與其發(fā)布的最小粒度。
我們應(yīng)該將那些會(huì)同時(shí)修改蚯妇,并且為相同目的而修改的類放到同一個(gè)組件中敷燎,而將不會(huì)同時(shí)修改,并且不會(huì)為了相同目的而修改的那些類放到不同的組件中箩言。
對(duì)于大部分應(yīng)用程序來(lái)說(shuō)硬贯,可維護(hù)的重要行遠(yuǎn)遠(yuǎn)高于可復(fù)用性。
如果變更都集中在同一個(gè)組件中陨收,我們就只需要重新部署該組件饭豹,其他組件則不需要被重新驗(yàn)證、重新部署务漩。
不要強(qiáng)迫一個(gè)組件的用戶依賴他們不需要的東西拄衰。
將共同復(fù)用(為了某個(gè)可復(fù)用的抽象定義被共同復(fù)用)的類和模塊放到同一個(gè)組件中。
不要依賴不需要的東西饵骨。
REP和CRP是粘合性原則翘悉,會(huì)讓組件變大,而CRP是排除性原則居触,會(huì)讓組件變小妖混。軟件架構(gòu)師的任務(wù)就是要在這三個(gè)原則中間進(jìn)行取舍。
第十四章 組件耦合
無(wú)依賴環(huán)原則轮洋。
穩(wěn)定依賴的原則(依賴關(guān)系必須指向更穩(wěn)定的方向)制市。
穩(wěn)定抽象原則(依賴關(guān)系必須指向更抽象的方向)。
第五部分 軟件架構(gòu)
第十五章 什么是軟件架構(gòu)
軟件架構(gòu)師自身需要是程序員弊予,并且一直堅(jiān)持做一線程序員祥楣。軟件架構(gòu)師應(yīng)該是能力最強(qiáng)的一群程序員,他們通常會(huì)字啊自身承接編程任務(wù)的同時(shí),逐漸引導(dǎo)整個(gè)團(tuán)隊(duì)向一個(gè)能夠最大化生產(chǎn)力的系統(tǒng)設(shè)計(jì)方向前進(jìn)荣堰。
軟件系統(tǒng)的架構(gòu)質(zhì)量是由它的構(gòu)建者所決定的床未,軟件架構(gòu)這項(xiàng)工作的實(shí)質(zhì)就是規(guī)劃如何將系統(tǒng)拆分成組件,并安排好組件之間的排列關(guān)系振坚,以及組件之間相互通信的方式薇搁。
設(shè)計(jì)軟件架構(gòu)的目的,就是為了在工作中更好地對(duì)這些組件進(jìn)行研發(fā)渡八、部署啃洋、運(yùn)行以及維護(hù)。
如果想設(shè)計(jì)一個(gè)便于推進(jìn)各項(xiàng)工作的系統(tǒng)屎鳍,其策略就死要在設(shè)計(jì)中盡可能長(zhǎng)時(shí)間地保留盡可能多的可選項(xiàng)宏娄。
軟件架構(gòu)設(shè)計(jì)的主要目標(biāo)是支撐軟件系統(tǒng)的全生命周期,設(shè)計(jì)良好的架構(gòu)可以讓系統(tǒng)便于理解逮壁、易于修改孵坚、方便維護(hù),并且能輕松部署窥淆。軟件架構(gòu)的終極目標(biāo)就是最大化程序員的生產(chǎn)力卖宠,同時(shí)最小化系統(tǒng)的總運(yùn)營(yíng)成本。
一鍵式的輕松部署是設(shè)計(jì)軟件架構(gòu)的一個(gè)目標(biāo)忧饭。
設(shè)計(jì)良好的系統(tǒng)架構(gòu)應(yīng)該可以使開發(fā)人員對(duì)系統(tǒng)的運(yùn)行過(guò)程一目了然扛伍。架構(gòu)應(yīng)該起到揭示系統(tǒng)運(yùn)行過(guò)程的作用。具體來(lái)說(shuō)词裤,就是該架構(gòu)應(yīng)該將系統(tǒng)中的用例刺洒、功能以及該系統(tǒng)的必備行為設(shè)置為對(duì)開發(fā)者可見(jiàn)的一級(jí)實(shí)體,簡(jiǎn)化他們對(duì)于系統(tǒng)的理解吼砂。
系統(tǒng)維護(hù)的成本集中在“探秘”和“風(fēng)險(xiǎn)”這兩件事上逆航。其中,“探秘”的成本主要來(lái)自我們對(duì)現(xiàn)有軟件系統(tǒng)的挖掘渔肩,目的是去定新增功能或被修復(fù)問(wèn)題的最佳位置和最佳方式因俐。而“風(fēng)險(xiǎn)”則是指我們進(jìn)行上述修改時(shí),總是可能衍生出新的問(wèn)題赖瞒。
通過(guò)將系統(tǒng)拆分為組件女揭,并使用穩(wěn)定的接口將組件隔離蚤假,我們可以將未來(lái)新功能的添加方式明確出來(lái)栏饮,并大幅度地降低在修改過(guò)程中對(duì)系統(tǒng)其它部分造成傷害的可能性。
軟件有行為價(jià)值和架構(gòu)價(jià)值兩種價(jià)值磷仰。這其中的第二種價(jià)值又比第一種更重要袍嬉,因?yàn)樗擒浖浴败洝钡脑颉?/p>
軟件的靈活性取決于系統(tǒng)的整體狀況、組件的布置以及組件之間的連接方式。我們讓軟件維持“軟”行的方法是盡可能長(zhǎng)時(shí)間地保留盡可能多的可選項(xiàng)伺通。
所有的軟件系統(tǒng)都可以降解為策略與細(xì)節(jié)這兩種主要元素箍土。策略體現(xiàn)的是軟件中所有的業(yè)務(wù)規(guī)則與操作過(guò)程,因此它是系統(tǒng)真正的價(jià)值所在罐监。而細(xì)節(jié)則是指那些讓操作該系統(tǒng)的人吴藻、其他系統(tǒng)以及程序員們與策略進(jìn)行交互,但是又不會(huì)影響到策略本身的行為弓柱。他們包括I/O設(shè)備沟堡、數(shù)據(jù)庫(kù)、Web系統(tǒng)矢空、服務(wù)器航罗、框架、交互協(xié)議等屁药。
軟件架構(gòu)師的目標(biāo)是創(chuàng)建一種系統(tǒng)形態(tài)粥血,該形態(tài)會(huì)以策略為最基本的元素,并讓那個(gè)細(xì)節(jié)與策略脫離關(guān)系酿箭,以允許在具體決策過(guò)程中推遲或延遲與細(xì)節(jié)相關(guān)的內(nèi)容复亏。
一個(gè)優(yōu)秀的架構(gòu)師應(yīng)該致力于最大化可選項(xiàng)數(shù)量。
第十六章 獨(dú)立性
一個(gè)設(shè)計(jì)良好的軟件架構(gòu)必須支持以下幾點(diǎn):1)系統(tǒng)的用例[關(guān)于如何操作一個(gè)自動(dòng)化系統(tǒng)的莫阿似乎是七问,定義了輸入蜓耻、輸出以及產(chǎn)生輸出所應(yīng)該采取的處理步驟](一個(gè)系統(tǒng)的架構(gòu)必須支持其自身的設(shè)計(jì)意圖)和正常運(yùn)行;2)系統(tǒng)的維護(hù)械巡;3)系統(tǒng)的開發(fā)刹淌;4)系統(tǒng)的部署。
一個(gè)設(shè)計(jì)良好的架構(gòu)在行為上對(duì)系統(tǒng)最重要的作用就是明確和顯式地反應(yīng)系統(tǒng)設(shè)計(jì)意圖的行為讥耗,使其在架構(gòu)層面上可見(jiàn)有勾。
康威定律:任何一個(gè)組織在設(shè)計(jì)系統(tǒng)時(shí),往往都會(huì)復(fù)制出一個(gè)與該組織內(nèi)溝通結(jié)構(gòu)相同的系統(tǒng)古程。
一個(gè)設(shè)計(jì)良好的架構(gòu)應(yīng)該通過(guò)保留可選項(xiàng)的方式蔼卡,讓系統(tǒng)在任何情況下都能方便地作出必要的變更。
一個(gè)系統(tǒng)可以被解藕成若干個(gè)水平分層- UI界面挣磨、應(yīng)用獨(dú)有的業(yè)務(wù)邏輯雇逞、領(lǐng)域普適的業(yè)務(wù)邏輯、數(shù)據(jù)庫(kù)等茁裙。
如果我們按照變更原因的不同對(duì)系統(tǒng)進(jìn)行解藕塘砸,就可以持續(xù)地向系統(tǒng)內(nèi)添加新的用例,而不會(huì)影響舊友的用例晤锥。如果我們對(duì)支持這些用例的UI和數(shù)據(jù)庫(kù)也進(jìn)行了分組掉蔬,那么每個(gè)用例使用的就是不同面向的UI和數(shù)據(jù)庫(kù)廊宪,因此增加新用例就更不太可能會(huì)影響舊有的用例了。
按水平分層和用例解藕一個(gè)系統(tǒng)有很種方式女轿,比如源碼層次(控制源代碼模塊之間的依賴關(guān)系)箭启、部署層次(控制部署單元之間的依賴關(guān)系)和服務(wù)層次。
第十七章 劃分邊界
軟件架構(gòu)設(shè)計(jì)本身就是門劃分邊界的藝術(shù)蛉迹。邊界的作用是將軟件分割成各種元素傅寡,以便約束邊界兩側(cè)之間的依賴關(guān)系。
架構(gòu)師們所追求的目標(biāo)應(yīng)該是最大限度地降低構(gòu)建和維護(hù)一個(gè)系統(tǒng)所需的人力資源北救。
一個(gè)系統(tǒng)最消耗人力資源的是系統(tǒng)中存在的藕合赏僧。
邊界線應(yīng)該會(huì)在那些不相關(guān)的事情中間。GUI與業(yè)務(wù)邏輯無(wú)關(guān)扭倾,所以兩者時(shí)間應(yīng)該有一條邊界線淀零。數(shù)據(jù)局與GUI無(wú)關(guān),這兩者之間也應(yīng)該有一條邊界線膛壹。數(shù)據(jù)庫(kù)又與業(yè)務(wù)邏輯無(wú)關(guān)驾中,所以兩者之間也應(yīng)該有一條邊界線。
I/O是無(wú)關(guān)緊要的模聋。
系統(tǒng)的核心業(yè)務(wù)邏輯必須和其他組件隔離肩民,保持獨(dú)立,而這些其他組件要么是可以去掉的链方,要么是有多種實(shí)現(xiàn)的持痰。
為了在軟件架構(gòu)中畫邊界線,我們需要先將系統(tǒng)分割成組件祟蚀,其中一部分是系統(tǒng)的核心業(yè)務(wù)邏輯組件工窍,而另一部分則是與核心業(yè)務(wù)邏輯無(wú)關(guān)但負(fù)責(zé)提供必要功能的插件。
第十八章?邊界剖析
第十九章 策略和層次
本質(zhì)上前酿,所有的軟件系統(tǒng)都是一組策略語(yǔ)句的結(jié)合患雏。計(jì)算機(jī)程序不過(guò)就是一組仔細(xì)描述如何將輸入轉(zhuǎn)化為輸出的策略語(yǔ)句的集合。
在一個(gè)設(shè)計(jì)良好的架構(gòu)中罢维,依賴關(guān)系的方向通常取決于它們所關(guān)聯(lián)的組件層次淹仑。一般來(lái)說(shuō),低層次組件被設(shè)計(jì)為依賴與高層組件肺孵。
第二十章 業(yè)務(wù)邏輯
業(yè)務(wù)邏輯就是程序中那些真正用于賺錢或省錢的業(yè)務(wù)邏輯與過(guò)程匀借。
關(guān)鍵業(yè)務(wù)邏輯和關(guān)鍵業(yè)務(wù)數(shù)據(jù)是緊密相關(guān)的,所以平窘,他們很適合被放在同一個(gè)對(duì)象中處理吓肋。我們將這種對(duì)象成為“業(yè)務(wù)實(shí)體”。
在理想情況下初婆,代啊碼業(yè)務(wù)邏輯的代碼應(yīng)該是整個(gè)系統(tǒng)的核心蓬坡,其他層次概念的實(shí)現(xiàn)應(yīng)該以插件的形式介入系統(tǒng)中。業(yè)務(wù)邏輯應(yīng)該是系統(tǒng)中最獨(dú)立磅叛、復(fù)用性最高的代碼屑咳。
第二十一章 尖叫的軟件架構(gòu)
良好的架構(gòu)設(shè)計(jì)應(yīng)該只關(guān)注用例,并能將它們與其他的周邊元素隔離弊琴。
一個(gè)系統(tǒng)的架構(gòu)應(yīng)該著重于展示系統(tǒng)本身的設(shè)計(jì)兆龙,而并非該系統(tǒng)所使用的框架。
第二十二章 整潔架構(gòu)
同心圓代代表了軟件系統(tǒng)中的不同層次敲董,通常越靠近中心紫皇,其所在的軟件層次就越高∫刚基本上聪铺,外層圓代表的是機(jī)制,內(nèi)層圓代表的是策略萄窜。
通過(guò)將系統(tǒng)劃分層次铃剔,并確保這些層次遵守依賴關(guān)系規(guī)則,就可以構(gòu)建出一個(gè)天生可測(cè)試的系統(tǒng)查刻。
第二十三章 展示器和謙卑對(duì)象
可以利用謙卑對(duì)象模式將GUI的這兩類行為拆分成展示器(可測(cè)試的對(duì)象)與視圖(難以測(cè)試的對(duì)象键兜,要盡量簡(jiǎn)單)兩部分。
強(qiáng)大的可測(cè)試性是一個(gè)架構(gòu)的設(shè)計(jì)是否優(yōu)秀的顯著衡量標(biāo)準(zhǔn)之一穗泵。
通過(guò)在系統(tǒng)的邊界運(yùn)用謙卑對(duì)象模式普气,可以大幅地提高整個(gè)系統(tǒng)的可測(cè)試性檀葛。