復(fù)用是架構(gòu)思維中非常重要的思維之一,是面向?qū)ο蠹軜?gòu)設(shè)計(jì)的核心思想,業(yè)務(wù)能力組件化,組件能力服務(wù)化,共享平臺(tái),中臺(tái)建設(shè),公共服務(wù)下沉等都是為了提高系統(tǒng)的復(fù)用而設(shè)計(jì)。
好的系統(tǒng)設(shè)計(jì)具備可擴(kuò)展性(Extensibility)、靈活性(Flexibility)和可插入性(Pluggability),一個(gè)復(fù)用較好的系統(tǒng),就是一個(gè)易維護(hù)的系統(tǒng)。但實(shí)際上,可維護(hù)性和可復(fù)用性是兩個(gè)緯度。
一、可維護(hù)性
可維護(hù)性指系統(tǒng)的被修改能力和可修復(fù)能力,修改能力指改進(jìn)、系統(tǒng)環(huán)境、需求、系統(tǒng)容量等變化的適應(yīng);可修復(fù)能力指系統(tǒng)發(fā)生故障后,能夠排除(或抑制)故障予以修復(fù),并能按照原有設(shè)計(jì)流程正常運(yùn)行狀態(tài)的可能性??删S護(hù)性架構(gòu)有如下特征:
(1)易分析性
系統(tǒng)發(fā)生故障或缺陷時(shí),能很快定位或分析出原因。
(2)易改變性
面對(duì)新需求系統(tǒng)擁有快速被實(shí)現(xiàn)的能力,實(shí)現(xiàn)體現(xiàn)在代碼實(shí)現(xiàn)、設(shè)計(jì)實(shí)現(xiàn)和說(shuō)明文檔的更新。
(3)易測(cè)試性
系統(tǒng)新的變更可以被驗(yàn)證的能力。
(4)穩(wěn)定性
兼容新的變更不影響原有系統(tǒng)的運(yùn)行的能力。
(5)依從性
架構(gòu)設(shè)計(jì)遵循和保持相關(guān)約定的能力。
對(duì)于系統(tǒng)可維護(hù)性的度量可以從以下幾個(gè)方面進(jìn)行判斷:
a.可理解性。指通過(guò)分析源碼和解讀相關(guān)設(shè)計(jì)文檔來(lái)了解系統(tǒng)架構(gòu)、功能和運(yùn)行邏輯的難易程度。一個(gè)可理解性高的系統(tǒng)一般應(yīng)具備以下的特征:模塊化(系統(tǒng)各個(gè)模塊結(jié)構(gòu)良好、功能完整),程序代碼清晰,編程風(fēng)格具有一致性(代碼風(fēng)格及設(shè)計(jì)風(fēng)格的一致性),完整性(對(duì)輸人數(shù)據(jù)進(jìn)行完整性檢查),使用有意義的數(shù)據(jù)名和函數(shù)名等。
b.可靠性??煽啃员砻饕粋€(gè)系統(tǒng)在給定的一段時(shí)間內(nèi)正確執(zhí)行的概率。衡量可靠性的方法主要有兩類:第一類是根據(jù)程序錯(cuò)誤的統(tǒng)計(jì)數(shù)字來(lái)進(jìn)行可靠性預(yù)測(cè)。比如用一些可靠性模型,根據(jù)程序測(cè)試中發(fā)現(xiàn)并排除的錯(cuò)誤數(shù)來(lái)預(yù)測(cè)平均失效間隔時(shí)間(Mean Time To Failure,MTTF)。第二類是當(dāng)系統(tǒng)的可靠性與復(fù)雜性有關(guān)時(shí),可以根據(jù)程序的復(fù)雜性來(lái)預(yù)測(cè)軟件的可靠性。
c.可測(cè)試性??蓽y(cè)試性表明能夠用測(cè)試的方法來(lái)驗(yàn)證程序正確性的難易程度。系統(tǒng)的可測(cè)試性取決于系統(tǒng)的可理解性、復(fù)雜性、設(shè)計(jì)合理的測(cè)試用例的難易程度等方面的內(nèi)容。
d.可修改性。可修改性描述了程序能夠被正確修改的難易程度。一個(gè)可修改的程序應(yīng)當(dāng)是可理解的、通用的、簡(jiǎn)單的、靈活的。通用性是指程序適用于各種功能變化而無(wú)需修改。靈活性是指能夠容易地對(duì)程序進(jìn)行修改。
e.可移植性??梢浦残员砻鞒绦驈囊粋€(gè)運(yùn)行環(huán)境移植到另一個(gè)新的運(yùn)行環(huán)境的可能性的大小。一個(gè)可移植性好的系統(tǒng)應(yīng)具有結(jié)構(gòu)良好、靈活、不依賴于某一具體計(jì)算機(jī)或操作系統(tǒng)的特性。
系統(tǒng)的可維護(hù)性不但和架構(gòu)師采用的分析設(shè)計(jì)方法和技術(shù)熟練程度有關(guān),還和項(xiàng)目管理技術(shù)有密切的聯(lián)系,除了和設(shè)計(jì)開(kāi)發(fā)方法有關(guān)的因素之外,還有一些因素影響系統(tǒng)的可維護(hù)性的原因:
f.開(kāi)發(fā)人員是否有統(tǒng)一的約束規(guī)范
g.從需求——業(yè)務(wù)分析——架構(gòu)設(shè)計(jì)——編碼實(shí)現(xiàn)——測(cè)試發(fā)布——線上運(yùn)營(yíng)是否采用了統(tǒng)一的文檔結(jié)構(gòu)和文檔形成機(jī)制。
h.是否應(yīng)用了可維護(hù)性的語(yǔ)音和框架
i.是否有完整的代碼說(shuō)明文檔
j.是否有持續(xù)更新保存規(guī)范化的測(cè)試用例信息
二、可復(fù)用性
復(fù)用性是面向?qū)ο蠹夹g(shù)最重要的特征之一,但是事與愿違復(fù)用性的好處,我們?cè)诩軜?gòu)設(shè)計(jì)時(shí)并不能真正實(shí)現(xiàn),因?yàn)閺?fù)用需要付出一定的代價(jià),并不像我們使用面向?qū)ο箝_(kāi)發(fā)工具一樣,很容易利用起復(fù)用性特性完成相關(guān)工作。相反,為了打到系統(tǒng)的復(fù)用性,我們需要取舍一些設(shè)計(jì)。另外好多設(shè)計(jì)者對(duì)于復(fù)用的范圍很有局限,常常會(huì)考慮代碼的復(fù)用而忽略了其他更高層次的復(fù)用,當(dāng)然代碼的復(fù)用是最基本的,代碼的復(fù)用有自身的好處,但是為了讓我們的系統(tǒng)復(fù)用,希望設(shè)計(jì)者能從更高的層次來(lái)看待復(fù)用。
1。復(fù)用性的好處
有較高的生產(chǎn)效率。
有較高的系統(tǒng)質(zhì)量。
恰當(dāng)運(yùn)用復(fù)用可以改善系統(tǒng)的可維護(hù)性。
2。復(fù)用分類
我們可以將系統(tǒng)復(fù)用分為代碼復(fù)用、算法的復(fù)用、數(shù)據(jù)結(jié)構(gòu)的復(fù)用、測(cè)試信息的復(fù)用、設(shè)計(jì)的復(fù)用、分析的復(fù)用,接下來(lái)我們就詳細(xì)講解如何做這些復(fù)用。
(1)代碼復(fù)用
代碼復(fù)用是最常見(jiàn)的復(fù)用,包括目標(biāo)代碼和源代碼的復(fù)用,指的是在同一個(gè)應(yīng)用的多個(gè)模塊中,或者是在多個(gè)應(yīng)用下代碼的復(fù)用。理想狀況下,代碼復(fù)用可以共享通用類、函數(shù)集合來(lái)實(shí)現(xiàn);即便是在最差的情況下,代碼復(fù)用也可以通過(guò)拷貝和修改源代碼來(lái)實(shí)現(xiàn)。
代碼復(fù)用的一個(gè)關(guān)鍵因素是你要能夠獲取到代碼。如果必要的話,你自己可以修改這段代碼,當(dāng)然也可以找別人幫你修改。這一點(diǎn)好壞并存,通過(guò)審讀代碼,你可以自己決定—— 哪怕這個(gè)決定很難做出—— 你是否要復(fù)用這段代碼。同時(shí),把代碼開(kāi)放給你,那么代碼原作者也許會(huì)失去撰寫(xiě)說(shuō)明文檔的動(dòng)力,這也就增加了你理解它所花費(fèi)的時(shí)間,減小了你可能獲得的收益。
代碼復(fù)用的最大好處在于它可以減少你的代碼量,也就潛在地減小了開(kāi)放和維護(hù)成本。壞處則在于你自己應(yīng)用的能力范圍就被約束住了,而且也增加了應(yīng)用和被復(fù)用代碼之間的耦合。要大規(guī)模地實(shí)現(xiàn)源程序的復(fù)用,只有依靠含有大量可復(fù)用構(gòu)件的構(gòu)件庫(kù),如“對(duì)象鏈接與嵌入”技術(shù),既支持在源程序級(jí)上定義構(gòu)件以構(gòu)造新的系統(tǒng),又使這些構(gòu)件在目標(biāo)代碼級(jí)上仍然是一些獨(dú)立的可復(fù)用構(gòu)件,能夠在運(yùn)行時(shí)被靈活地重新組合為各種應(yīng)用系統(tǒng)。
代碼復(fù)用是最基礎(chǔ)最基本的復(fù)用,那我們就來(lái)看看做到代碼復(fù)用應(yīng)該注意哪些內(nèi)容:
a.面向接口編程
"面向接口編程"是面向?qū)ο笤O(shè)計(jì)(OOD)的第一個(gè)基本原則。面向接口編程就是先把客戶的業(yè)務(wù)邏輯線提取出來(lái),作為接口,業(yè)務(wù)具體實(shí)現(xiàn)通過(guò)該接口的實(shí)現(xiàn)類來(lái)完成。當(dāng)客戶需求變化時(shí),只需編寫(xiě)該業(yè)務(wù)邏輯的新的實(shí)現(xiàn)類,通過(guò)更改配置文件(例如Spring框架)中該接口的實(shí)現(xiàn)類就可以完成需求,不需要改寫(xiě)現(xiàn)有代碼,減少對(duì)系統(tǒng)的影響。
b.使用對(duì)象組合而不是繼承
"優(yōu)先使用組合而不是繼承"是面向?qū)ο笤O(shè)計(jì)(OOD)的第二個(gè)基本原則。繼承是在程序開(kāi)發(fā)的過(guò)程中重構(gòu)得到的,而不是程序設(shè)計(jì)之初就使用繼承,很多開(kāi)發(fā)者濫用繼承,結(jié)果可能造成后期的代碼解決不了需求的變化。因此,優(yōu)先使用組合而不是繼承,是面向?qū)ο箝_(kāi)發(fā)的一個(gè)重要經(jīng)驗(yàn)。
繼承:繼承的起源,來(lái)自于多個(gè)類中相同特征和行為的抽象。子類可以通過(guò)繼承父類,那么可以調(diào)用父類中定義的方法和屬性,從而達(dá)到代碼重用的目的。另外,子類除了重用父類的代碼以外,還可以擴(kuò)展自身的屬性和方法,來(lái)描述子類特有的特征和行為。
對(duì)象組合:對(duì)象組合要求被組合的對(duì)象具有良好的接口,并且通過(guò)從其他對(duì)象得到的引用在運(yùn)行時(shí)運(yùn)態(tài)定義。對(duì)象組合是類繼承之外的另一種復(fù)用選擇,可以將對(duì)象組合到其他對(duì)象中,以構(gòu)建更加復(fù)雜的功能。由于對(duì)象的內(nèi)部細(xì)節(jié)對(duì)其他對(duì)象不可見(jiàn),它們看上去為“黑箱”,這種類型的復(fù)用稱為黑箱復(fù)用(black-box reuse)。對(duì)象只以"黑箱"的形式出現(xiàn)。
下面分析繼承和組合的優(yōu)缺點(diǎn):
(a)繼承的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
繼承簡(jiǎn)單粗爆,直觀,關(guān)系在編譯時(shí)靜態(tài)定義。
被復(fù)用的實(shí)現(xiàn)易于修改,sub可以覆蓋super的實(shí)現(xiàn)。
無(wú)法在運(yùn)行時(shí)變更從super繼承來(lái)的實(shí)現(xiàn)(也不一定是缺點(diǎn))
sub的部分實(shí)現(xiàn)通常定義在super中。
sub直接面對(duì)super的實(shí)現(xiàn)細(xì)節(jié),因此破壞了封裝。
super實(shí)現(xiàn)的任何變更都會(huì)強(qiáng)制子類也進(jìn)行變更,因?yàn)樗鼈兊膶?shí)現(xiàn)聯(lián)系在了一起。
如果在新的問(wèn)題場(chǎng)景下繼承來(lái)的實(shí)現(xiàn)已過(guò)時(shí)或不適用,所以必須重寫(xiě)super或繼承來(lái)的實(shí)現(xiàn)。
由于在類繼承中,實(shí)現(xiàn)的依存關(guān)系,對(duì)子類進(jìn)行復(fù)用可能會(huì)有問(wèn)題。有一個(gè)解決辦法是,只從協(xié)議或抽象基類繼承(子類型化),國(guó)為它們只對(duì)很少的實(shí)現(xiàn),而協(xié)議則沒(méi)有實(shí)現(xiàn)。
(b)組合的優(yōu)缺點(diǎn)優(yōu)點(diǎn):
不會(huì)破壞封裝,因?yàn)橹煌ㄟ^(guò)接口來(lái)訪問(wèn)對(duì)象;
減少實(shí)現(xiàn)的依存關(guān)系,因?yàn)閷?shí)面是通過(guò)接口來(lái)定義的;
可以在運(yùn)行時(shí)將任意對(duì)象替換為其他同類型的對(duì)象;
可以保持類的封裝以專注于單一任務(wù);
類和他的層次結(jié)構(gòu)能保持簡(jiǎn)潔,不至于過(guò)度膨脹而無(wú)法管理;
涉及對(duì)象多;
系統(tǒng)的行為將依賴于不同對(duì)象間的關(guān)系,而不是定義于單個(gè)類中;
現(xiàn)成的組件總是不太夠用,從而導(dǎo)致我們要不停的定義新對(duì)象。
c.將可變的部分和不可變的部分分離
"將可變的部分和不可變的部分分離"是面向?qū)ο笤O(shè)計(jì)(OOD)的第三個(gè)基本原則。如果使用繼承的復(fù)用技術(shù),我們可以在抽象基類中定義好不可變的部分,而由其子類去具體實(shí)現(xiàn)可變的部分,不可變的部分不需要重復(fù)定義,而且便于維護(hù)。如果使用對(duì)象組合的復(fù)用技術(shù),我們可以定義好不可變的部分,而可變的部分可以由不同的組件實(shí)現(xiàn),根據(jù)需要,在運(yùn)行時(shí)動(dòng)態(tài)配置。這樣,我們就有更多的時(shí)間關(guān)注可變的部分。對(duì)于對(duì)象組合技術(shù)而言,每個(gè)組件只完成相對(duì)較小的功能,相互之間耦合比較松散,復(fù)用率較高,通過(guò)組合,就能獲得新的功能。
d.控制方法的長(zhǎng)度
通常,我們的方法應(yīng)該只有盡量少的幾行,太長(zhǎng)的方法會(huì)難以理解,而且,如果方法太長(zhǎng),則應(yīng)該重新設(shè)計(jì)。對(duì)此,可以總結(jié)為以下原則:
三十秒原則:如果另一個(gè)程序員無(wú)法在三十秒之內(nèi)了解你的函數(shù)做了什么(What),如何做(How)以及為什么要這樣做(Why),那就說(shuō)明你的代碼是難以維護(hù)的,必須得到提高;
一屏原則:如果一個(gè)函數(shù)的代碼長(zhǎng)度超過(guò)一個(gè)屏幕,那么或許這個(gè)函數(shù)太長(zhǎng)了,應(yīng)該拆分成更小的子函數(shù);一行代碼盡量簡(jiǎn)短,并且保證一行代碼只做一件事。
e.消除case / if語(yǔ)句
要盡量避免在代碼中出現(xiàn)判斷語(yǔ)句,使用過(guò)多的switch/case 或者 if else 語(yǔ)句,代碼的可讀性很差同時(shí)也違背了面向?qū)ο蟮脑瓌t。
f.減少參數(shù)個(gè)數(shù)
有大量參數(shù)需要傳遞的方法,通常很難閱讀。我們可以將所有參數(shù)封裝到一個(gè)對(duì)象中來(lái)完成對(duì)象的傳遞,這也有利于錯(cuò)誤跟蹤。太多層的對(duì)象包裝對(duì)系統(tǒng)效率有影響,但是它帶來(lái)的好處相比,我們寧愿做包裝。畢竟"封裝"也是OO的基本特性之一,而且,"每個(gè)對(duì)象完成盡量少(而且簡(jiǎn)單)的功能",也是OO的一個(gè)基本原則。
g.類層次的最高層應(yīng)該是抽象類。
在許多情況下,提供一個(gè)抽象基類有利做特性化擴(kuò)展。由于在抽象基類中,大部分的功能和行為已經(jīng)定義好,使我們更容易理解接口設(shè)計(jì)者的意圖是什么。由于JAVA不允許"多繼承",從一個(gè)抽象基類繼承,就無(wú)法再?gòu)钠渌惱^承了。所以,提供一個(gè)抽象接口(interface)是個(gè)好主意,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,從而模擬實(shí)現(xiàn)了"多繼承",為類的設(shè)計(jì)提供了更大的靈活性。
h.盡量減少對(duì)變量的直接訪問(wèn)
對(duì)數(shù)據(jù)的封裝原則應(yīng)該規(guī)范化,不要把一個(gè)類的屬性暴露給其它類,而是應(yīng)該通過(guò)訪問(wèn)方法去保護(hù)他們,這有利于避免產(chǎn)生波紋效應(yīng)。如果某個(gè)屬性的名字改變,你只需要修改它的訪問(wèn)方法,而不是修改所有相關(guān)的代碼。
i.子類應(yīng)該特性化,完成特殊功能
如果一個(gè)子類只是使一個(gè)組件變成組件管理器,而不是實(shí)現(xiàn)接口功能,或者,重載某個(gè)功能,那么,就應(yīng)該使用一個(gè)外部的容器類,而不是創(chuàng)建一個(gè)子類
j.拆分過(guò)大的類
如果一個(gè)類有太多的方法(超過(guò)50個(gè)),那么它可能要做的工作太多,我們應(yīng)該試著將它的功能拆分到不同的類中。
k.作用截然不同的對(duì)象應(yīng)該拆分
對(duì)同樣的數(shù)據(jù),有不同的視圖。某些屬性描述的是數(shù)據(jù)結(jié)構(gòu)怎樣生成,而某些屬性描述的是數(shù)據(jù)結(jié)構(gòu)本身。最好將這兩個(gè)視圖拆分到不同的類中,從類名上就可以區(qū)分出不同視圖的作用。類的域、方法也應(yīng)該有同樣的考慮!
為了提高代碼的復(fù)用性,還有好多的手段,以上都是多年的編碼經(jīng)驗(yàn),希望能幫助大家。
(2)算法的復(fù)用
各種算法如排序算法都已經(jīng)得到了大量的研究,幾乎不需要我們重寫(xiě)自己的算法,各種語(yǔ)言通常也實(shí)現(xiàn)了這些常用算法,因此直接復(fù)用即可。
(3)數(shù)據(jù)結(jié)構(gòu)的復(fù)用
與算法一樣,類似數(shù)組、隊(duì)列、棧、列表等得到了透徹的研究,只需要直接復(fù)用。
(4)測(cè)試信息的復(fù)用
測(cè)試信息的復(fù)用主要包括測(cè)試用例的復(fù)用和測(cè)試過(guò)程的復(fù)用。前者是把一個(gè)軟件的測(cè)試用例應(yīng)用于新的軟件測(cè)試中,或者在軟件作出修改時(shí)使用在新一輪的測(cè)試中。后者是在測(cè)試過(guò)程中通過(guò)軟件工具自動(dòng)記錄測(cè)試的過(guò)程信息,包括測(cè)試員的每一個(gè)操作、輸人參數(shù)、測(cè)試用例及運(yùn)行環(huán)境等信息,并將這些過(guò)程信息應(yīng)用于新的軟件測(cè)試或新一輪的軟件測(cè)試中。測(cè)試信息的復(fù)用級(jí)別不易同分析、設(shè)計(jì)、編程的復(fù)用級(jí)別進(jìn)行準(zhǔn)確地比較,因?yàn)楸粡?fù)用的不是同一事物的不同抽象層次,而是另一種信息,但從這些信息的形態(tài)來(lái)看,大體處于與程序代碼相當(dāng)?shù)募?jí)別。
a.測(cè)試用例設(shè)計(jì)方法
測(cè)試用例設(shè)計(jì)可以分為白盒測(cè)試用例設(shè)計(jì)法和黑盒測(cè)試用i設(shè)計(jì)法。
白盒測(cè)試用設(shè)計(jì)法

黑盒測(cè)試用例設(shè)計(jì)法

(5)設(shè)計(jì)復(fù)用
設(shè)計(jì)復(fù)用指的是使用對(duì)以前創(chuàng)建的設(shè)計(jì)用例、標(biāo)準(zhǔn)文檔、領(lǐng)域模型、過(guò)程指導(dǎo)和其它,來(lái)幫助你開(kāi)始一個(gè)新工程。設(shè)計(jì)復(fù)用分為幾個(gè)層次,從完整的拿來(lái)即用這種100%的完全復(fù)用,到僅以工件作模型之用,研究分析之以獲取靈感。舉例來(lái)說(shuō),編碼和用戶界面設(shè)計(jì)的標(biāo)準(zhǔn)文檔對(duì)不同的項(xiàng)目來(lái)說(shuō),就是有價(jià)值的設(shè)計(jì),像其中的建模符號(hào)定義和方法論總覽這種文檔,是可以直接復(fù)用的。我曾經(jīng)為已有的通用數(shù)據(jù)接口以面向?qū)ο蟮姆绞阶隽税b,讓這些類使用起來(lái)更直觀。
設(shè)計(jì)復(fù)用提升了項(xiàng)目間的一致性,減少了各個(gè)項(xiàng)目的管理成本。用戶界面標(biāo)準(zhǔn)對(duì)絕大多數(shù)平臺(tái)來(lái)說(shuō)都是很常用的;編碼標(biāo)準(zhǔn)對(duì)主要語(yǔ)言來(lái)說(shuō)都是不可或缺的;而標(biāo)準(zhǔn)面向?qū)ο蠓椒ㄕ摵湍P陀浱?hào)這樣的東西已經(jīng)使用好多年了。主要的壞處在于很多核心程序員總覺(jué)得這種復(fù)用過(guò)了頭,給彼此帶來(lái)了強(qiáng)加的標(biāo)準(zhǔn)和過(guò)程約束。因此設(shè)計(jì)復(fù)用的底線就是當(dāng)你覺(jué)得它是一種重要、可行和醒目的技術(shù)時(shí),再去使用它。這種復(fù)用有如下三種途徑。
從現(xiàn)有系統(tǒng)的設(shè)計(jì)結(jié)果中提取一些可復(fù)用的設(shè)計(jì)組件,并將這些組件應(yīng)用于新系統(tǒng)的設(shè)計(jì)中。
將一個(gè)現(xiàn)有系統(tǒng)的全部設(shè)計(jì)文檔在新的系統(tǒng)上重新實(shí)現(xiàn),也就是將一個(gè)設(shè)計(jì)運(yùn)用于多個(gè)具體的實(shí)現(xiàn)中。
和任何應(yīng)用無(wú)關(guān),獨(dú)立設(shè)計(jì)開(kāi)發(fā)可復(fù)用的設(shè)計(jì)組件。
(6)分析復(fù)用
分析復(fù)用是比設(shè)計(jì)復(fù)用更高級(jí)別的復(fù)用,可復(fù)用的分析組件是針對(duì)業(yè)務(wù)領(lǐng)域中某些設(shè)計(jì)或問(wèn)題抽象出的組件,受設(shè)計(jì)技術(shù)及實(shí)現(xiàn)條件的影響很少,所以可復(fù)用的機(jī)會(huì)更大,如領(lǐng)域模型已經(jīng)顯出巨大的可復(fù)用潛能,因?yàn)樗鼈兎从吵龃笠?guī)模的業(yè)務(wù)行為內(nèi)聚的特征,在許多應(yīng)用中都是一致的。你在領(lǐng)域開(kāi)發(fā)中創(chuàng)造的每樣?xùn)|西都是可以復(fù)用的。與后期的復(fù)用相比,領(lǐng)域組件在前期業(yè)務(wù)行為和組織的架構(gòu)設(shè)計(jì)中顯出更大的作用。復(fù)用的途徑也有三種。
從已有系統(tǒng)的分析結(jié)果中提取可復(fù)用的組件用于新系統(tǒng)的架構(gòu)設(shè)計(jì)。
用一份完整的分析文檔作為輸入,產(chǎn)生針對(duì)不同系統(tǒng)和其他實(shí)現(xiàn)條件的多項(xiàng)設(shè)計(jì)。
和任何應(yīng)用無(wú)關(guān),獨(dú)立設(shè)計(jì)開(kāi)發(fā)可復(fù)用的分析組件。
三、可復(fù)用和可維護(hù)性的關(guān)系
可復(fù)用和可維護(hù)性的關(guān)系如下。
1.適當(dāng)?shù)貞?yīng)用復(fù)用,同時(shí)提高了可維護(hù)性,就是在保持甚至提高系統(tǒng)的可維護(hù)性的同時(shí),實(shí)現(xiàn)系統(tǒng)復(fù)用。
2.適當(dāng)提高系統(tǒng)的可復(fù)用性,同時(shí)提高了系統(tǒng)的可擴(kuò)展性。系統(tǒng)的可擴(kuò)展性由“開(kāi)-閉”原則、里氏代換原則、依賴倒轉(zhuǎn)原則和組合/聚合復(fù)用原則保證。
3.適當(dāng)提高系統(tǒng)的可復(fù)用性,同時(shí)提高了系統(tǒng)的靈活性。系統(tǒng)的靈活性由“開(kāi)-閉”原則、迪米特法則、接口隔離原則保證。
4.適當(dāng)提高系統(tǒng)的可復(fù)用性,同時(shí)提高了系統(tǒng)的可插入性。系統(tǒng)的可插入性由“開(kāi)-閉”原則、里氏代換原則、組合/聚合復(fù)用原則和依賴倒轉(zhuǎn)原則保證。
復(fù)用的成功之路
那么我們?nèi)绾巫龅秸娴拿嫦驅(qū)ο笤O(shè)計(jì)的復(fù)用呢?上面所講的內(nèi)容都是工具,如果你認(rèn)真的看完了,你已經(jīng)擁有了復(fù)用的工具,復(fù)用是否成功就要看我們?nèi)绾卫霉ぞ邘椭覀冊(cè)谙到y(tǒng)的生命周期中來(lái)實(shí)現(xiàn)。不要為了復(fù)用而設(shè)計(jì)系統(tǒng),那么你會(huì)很累。給你提幾個(gè)意見(jiàn):
你可以嘗試可復(fù)用的設(shè)計(jì),但是直到你的設(shè)計(jì)被復(fù)用多次,你才可以談成功的設(shè)計(jì)??蓮?fù)用性是旁觀者來(lái)下結(jié)論的,而不是設(shè)計(jì)者自己。
文檔必須標(biāo)識(shí)出,什么時(shí)候不要復(fù)用它,這樣開(kāi)發(fā)者才能理解合適場(chǎng)景的上下文。
當(dāng)你設(shè)計(jì)新的系統(tǒng)架構(gòu)的時(shí)候,第一件事應(yīng)該是決定你的架構(gòu)還會(huì)以怎樣的方式在別的場(chǎng)合被復(fù)用。也許有些人已經(jīng)設(shè)計(jì)了你需要的東西。另一方面,你得主動(dòng)分享你的工作成果,這樣大家才可以復(fù)用它。一個(gè)好領(lǐng)隊(duì)會(huì)在團(tuán)隊(duì)中持續(xù)地尋找復(fù)用點(diǎn)和提升、獎(jiǎng)勵(lì)復(fù)用的機(jī)會(huì)。一個(gè)不錯(cuò)的方式就是在從這樣兩個(gè)方面去尋找可復(fù)用的機(jī)會(huì):模型評(píng)審過(guò)程中,尋找繼承和模式復(fù)用的機(jī)會(huì);代碼走讀過(guò)程中,尋找組件和代碼復(fù)用的機(jī)會(huì)。