国产欧美日韩第一页|日本一二三不卡视频|在线精品小视频,亚洲第一免费播放区,metcn人体亚洲一区,亚洲精品午夜视频

架構思維之復用

2021-04-22 09:16:44 361

復用是架構思維中非常重要的思維之一,是面向對象架構設計的核心思想,業(yè)務(wù)能力組件化,組件能力服務(wù)化,共享平臺,中臺建設,公共服務(wù)下沉等都是為了提高系統的復用而設計。

好的系統設計具備可擴展性(Extensibility)、靈活性(Flexibility)和可插入性(Pluggability),一個(gè)復用較好的系統,就是一個(gè)易維護的系統。但實(shí)際上,可維護性和可復用性是兩個(gè)緯度。

一、可維護性

可維護性指系統的被修改能力和可修復能力,修改能力指改進(jìn)、系統環(huán)境、需求、系統容量等變化的適應;可修復能力指系統發(fā)生故障后,能夠排除(或抑制)故障予以修復,并能按照原有設計流程正常運行狀態(tài)的可能性??删S護性架構有如下特征:

(1)易分析性

系統發(fā)生故障或缺陷時(shí),能很快定位或分析出原因。

(2)易改變性

面對新需求系統擁有快速被實(shí)現的能力,實(shí)現體現在代碼實(shí)現、設計實(shí)現和說(shuō)明文檔的更新。

(3)易測試性

系統新的變更可以被驗證的能力。

(4)穩定性

兼容新的變更不影響原有系統的運行的能力。

(5)依從性

架構設計遵循和保持相關(guān)約定的能力。

對于系統可維護性的度量可以從以下幾個(gè)方面進(jìn)行判斷:

a.可理解性。指通過(guò)分析源碼和解讀相關(guān)設計文檔來(lái)了解系統架構、功能和運行邏輯的難易程度。一個(gè)可理解性高的系統一般應具備以下的特征:模塊化(系統各個(gè)模塊結構良好、功能完整),程序代碼清晰,編程風(fēng)格具有一致性(代碼風(fēng)格及設計風(fēng)格的一致性),完整性(對輸人數據進(jìn)行完整性檢查),使用有意義的數據名和函數名等。

b.可靠性??煽啃员砻饕粋€(gè)系統在給定的一段時(shí)間內正確執行的概率。衡量可靠性的方法主要有兩類(lèi):第一類(lèi)是根據程序錯誤的統計數字來(lái)進(jìn)行可靠性預測。比如用一些可靠性模型,根據程序測試中發(fā)現并排除的錯誤數來(lái)預測平均失效間隔時(shí)間(Mean Time To Failure,MTTF)。第二類(lèi)是當系統的可靠性與復雜性有關(guān)時(shí),可以根據程序的復雜性來(lái)預測軟件的可靠性。

c.可測試性??蓽y試性表明能夠用測試的方法來(lái)驗證程序正確性的難易程度。系統的可測試性取決于系統的可理解性、復雜性、設計合理的測試用例的難易程度等方面的內容。

d.可修改性??尚薷男悦枋隽顺绦蚰軌虮徽_修改的難易程度。一個(gè)可修改的程序應當是可理解的、通用的、簡(jiǎn)單的、靈活的。通用性是指程序適用于各種功能變化而無(wú)需修改。靈活性是指能夠容易地對程序進(jìn)行修改。

e.可移植性??梢浦残员砻鞒绦驈囊粋€(gè)運行環(huán)境移植到另一個(gè)新的運行環(huán)境的可能性的大小。一個(gè)可移植性好的系統應具有結構良好、靈活、不依賴(lài)于某一具體計算機或操作系統的特性。

系統的可維護性不但和架構師采用的分析設計方法和技術(shù)熟練程度有關(guān),還和項目管理技術(shù)有密切的聯(lián)系,除了和設計開(kāi)發(fā)方法有關(guān)的因素之外,還有一些因素影響系統的可維護性的原因:

f.開(kāi)發(fā)人員是否有統一的約束規范

g.從需求——業(yè)務(wù)分析——架構設計——編碼實(shí)現——測試發(fā)布——線(xiàn)上運營(yíng)是否采用了統一的文檔結構和文檔形成機制。

h.是否應用了可維護性的語(yǔ)音和框架

i.是否有完整的代碼說(shuō)明文檔

j.是否有持續更新保存規范化的測試用例信息

二、可復用性

復用性是面向對象技術(shù)最重要的特征之一,但是事與愿違復用性的好處,我們在架構設計時(shí)并不能真正實(shí)現,因為復用需要付出一定的代價(jià),并不像我們使用面向對象開(kāi)發(fā)工具一樣,很容易利用起復用性特性完成相關(guān)工作。相反,為了打到系統的復用性,我們需要取舍一些設計。另外好多設計者對于復用的范圍很有局限,常常會(huì )考慮代碼的復用而忽略了其他更高層次的復用,當然代碼的復用是最基本的,代碼的復用有自身的好處,但是為了讓我們的系統復用,希望設計者能從更高的層次來(lái)看待復用。

1。復用性的好處

有較高的生產(chǎn)效率。

有較高的系統質(zhì)量。

恰當運用復用可以改善系統的可維護性。

2。復用分類(lèi)

我們可以將系統復用分為代碼復用、算法的復用、數據結構的復用、測試信息的復用、設計的復用、分析的復用,接下來(lái)我們就詳細講解如何做這些復用。

(1)代碼復用

代碼復用是最常見(jiàn)的復用,包括目標代碼和源代碼的復用,指的是在同一個(gè)應用的多個(gè)模塊中,或者是在多個(gè)應用下代碼的復用。理想狀況下,代碼復用可以共享通用類(lèi)、函數集合來(lái)實(shí)現;即便是在最差的情況下,代碼復用也可以通過(guò)拷貝和修改源代碼來(lái)實(shí)現。

代碼復用的一個(gè)關(guān)鍵因素是你要能夠獲取到代碼。如果必要的話(huà),你自己可以修改這段代碼,當然也可以找別人幫你修改。這一點(diǎn)好壞并存,通過(guò)審讀代碼,你可以自己決定—— 哪怕這個(gè)決定很難做出—— 你是否要復用這段代碼。同時(shí),把代碼開(kāi)放給你,那么代碼原作者也許會(huì )失去撰寫(xiě)說(shuō)明文檔的動(dòng)力,這也就增加了你理解它所花費的時(shí)間,減小了你可能獲得的收益。

代碼復用的最大好處在于它可以減少你的代碼量,也就潛在地減小了開(kāi)放和維護成本。壞處則在于你自己應用的能力范圍就被約束住了,而且也增加了應用和被復用代碼之間的耦合。要大規模地實(shí)現源程序的復用,只有依靠含有大量可復用構件的構件庫,如“對象鏈接與嵌入”技術(shù),既支持在源程序級上定義構件以構造新的系統,又使這些構件在目標代碼級上仍然是一些獨立的可復用構件,能夠在運行時(shí)被靈活地重新組合為各種應用系統。

代碼復用是最基礎最基本的復用,那我們就來(lái)看看做到代碼復用應該注意哪些內容:

a.面向接口編程

"面向接口編程"是面向對象設計(OOD)的第一個(gè)基本原則。面向接口編程就是先把客戶(hù)的業(yè)務(wù)邏輯線(xiàn)提取出來(lái),作為接口,業(yè)務(wù)具體實(shí)現通過(guò)該接口的實(shí)現類(lèi)來(lái)完成。當客戶(hù)需求變化時(shí),只需編寫(xiě)該業(yè)務(wù)邏輯的新的實(shí)現類(lèi),通過(guò)更改配置文件(例如Spring框架)中該接口的實(shí)現類(lèi)就可以完成需求,不需要改寫(xiě)現有代碼,減少對系統的影響。

b.使用對象組合而不是繼承

"優(yōu)先使用組合而不是繼承"是面向對象設計(OOD)的第二個(gè)基本原則。繼承是在程序開(kāi)發(fā)的過(guò)程中重構得到的,而不是程序設計之初就使用繼承,很多開(kāi)發(fā)者濫用繼承,結果可能造成后期的代碼解決不了需求的變化。因此,優(yōu)先使用組合而不是繼承,是面向對象開(kāi)發(fā)的一個(gè)重要經(jīng)驗。

繼承:繼承的起源,來(lái)自于多個(gè)類(lèi)中相同特征和行為的抽象。子類(lèi)可以通過(guò)繼承父類(lèi),那么可以調用父類(lèi)中定義的方法和屬性,從而達到代碼重用的目的。另外,子類(lèi)除了重用父類(lèi)的代碼以外,還可以擴展自身的屬性和方法,來(lái)描述子類(lèi)特有的特征和行為。

對象組合:對象組合要求被組合的對象具有良好的接口,并且通過(guò)從其他對象得到的引用在運行時(shí)運態(tài)定義。對象組合是類(lèi)繼承之外的另一種復用選擇,可以將對象組合到其他對象中,以構建更加復雜的功能。由于對象的內部細節對其他對象不可見(jiàn),它們看上去為“黑箱”,這種類(lèi)型的復用稱(chēng)為黑箱復用(black-box reuse)。對象只以"黑箱"的形式出現。

下面分析繼承和組合的優(yōu)缺點(diǎn):

(a)繼承的優(yōu)缺點(diǎn)

優(yōu)點(diǎn): 

繼承簡(jiǎn)單粗爆,直觀(guān),關(guān)系在編譯時(shí)靜態(tài)定義。

被復用的實(shí)現易于修改,sub可以覆蓋super的實(shí)現。

缺點(diǎn):

無(wú)法在運行時(shí)變更從super繼承來(lái)的實(shí)現(也不一定是缺點(diǎn))

sub的部分實(shí)現通常定義在super中。

sub直接面對super的實(shí)現細節,因此破壞了封裝。

super實(shí)現的任何變更都會(huì )強制子類(lèi)也進(jìn)行變更,因為它們的實(shí)現聯(lián)系在了一起。

如果在新的問(wèn)題場(chǎng)景下繼承來(lái)的實(shí)現已過(guò)時(shí)或不適用,所以必須重寫(xiě)super或繼承來(lái)的實(shí)現。

由于在類(lèi)繼承中,實(shí)現的依存關(guān)系,對子類(lèi)進(jìn)行復用可能會(huì )有問(wèn)題。有一個(gè)解決辦法是,只從協(xié)議或抽象基類(lèi)繼承(子類(lèi)型化),國為它們只對很少的實(shí)現,而協(xié)議則沒(méi)有實(shí)現。

(b)組合的優(yōu)缺點(diǎn)優(yōu)點(diǎn):

不會(huì )破壞封裝,因為只通過(guò)接口來(lái)訪(fǎng)問(wèn)對象;

減少實(shí)現的依存關(guān)系,因為實(shí)面是通過(guò)接口來(lái)定義的;

可以在運行時(shí)將任意對象替換為其他同類(lèi)型的對象;

可以保持類(lèi)的封裝以專(zhuān)注于單一任務(wù);

類(lèi)和他的層次結構能保持簡(jiǎn)潔,不至于過(guò)度膨脹而無(wú)法管理;

缺點(diǎn):

涉及對象多;

系統的行為將依賴(lài)于不同對象間的關(guān)系,而不是定義于單個(gè)類(lèi)中;

現成的組件總是不太夠用,從而導致我們要不停的定義新對象。

c.將可變的部分和不可變的部分分離

"將可變的部分和不可變的部分分離"是面向對象設計(OOD)的第三個(gè)基本原則。如果使用繼承的復用技術(shù),我們可以在抽象基類(lèi)中定義好不可變的部分,而由其子類(lèi)去具體實(shí)現可變的部分,不可變的部分不需要重復定義,而且便于維護。如果使用對象組合的復用技術(shù),我們可以定義好不可變的部分,而可變的部分可以由不同的組件實(shí)現,根據需要,在運行時(shí)動(dòng)態(tài)配置。這樣,我們就有更多的時(shí)間關(guān)注可變的部分。對于對象組合技術(shù)而言,每個(gè)組件只完成相對較小的功能,相互之間耦合比較松散,復用率較高,通過(guò)組合,就能獲得新的功能。

d.控制方法的長(cháng)度

通常,我們的方法應該只有盡量少的幾行,太長(cháng)的方法會(huì )難以理解,而且,如果方法太長(cháng),則應該重新設計。對此,可以總結為以下原則:

三十秒原則:如果另一個(gè)程序員無(wú)法在三十秒之內了解你的函數做了什么(What),如何做(How)以及為什么要這樣做(Why),那就說(shuō)明你的代碼是難以維護的,必須得到提高; 

一屏原則:如果一個(gè)函數的代碼長(cháng)度超過(guò)一個(gè)屏幕,那么或許這個(gè)函數太長(cháng)了,應該拆分成更小的子函數;一行代碼盡量簡(jiǎn)短,并且保證一行代碼只做一件事。

e.消除case / if語(yǔ)句

要盡量避免在代碼中出現判斷語(yǔ)句,使用過(guò)多的switch/case 或者 if else 語(yǔ)句,代碼的可讀性很差同時(shí)也違背了面向對象的原則。

f.減少參數個(gè)數

有大量參數需要傳遞的方法,通常很難閱讀。我們可以將所有參數封裝到一個(gè)對象中來(lái)完成對象的傳遞,這也有利于錯誤跟蹤。太多層的對象包裝對系統效率有影響,但是它帶來(lái)的好處相比,我們寧愿做包裝。畢竟"封裝"也是OO的基本特性之一,而且,"每個(gè)對象完成盡量少(而且簡(jiǎn)單)的功能",也是OO的一個(gè)基本原則。

g.類(lèi)層次的最高層應該是抽象類(lèi)。

在許多情況下,提供一個(gè)抽象基類(lèi)有利做特性化擴展。由于在抽象基類(lèi)中,大部分的功能和行為已經(jīng)定義好,使我們更容易理解接口設計者的意圖是什么。由于JAVA不允許"多繼承",從一個(gè)抽象基類(lèi)繼承,就無(wú)法再從其它基類(lèi)繼承了。所以,提供一個(gè)抽象接口(interface)是個(gè)好主意,一個(gè)類(lèi)可以實(shí)現多個(gè)接口,從而模擬實(shí)現了"多繼承",為類(lèi)的設計提供了更大的靈活性。

h.盡量減少對變量的直接訪(fǎng)問(wèn)

對數據的封裝原則應該規范化,不要把一個(gè)類(lèi)的屬性暴露給其它類(lèi),而是應該通過(guò)訪(fǎng)問(wèn)方法去保護他們,這有利于避免產(chǎn)生波紋效應。如果某個(gè)屬性的名字改變,你只需要修改它的訪(fǎng)問(wèn)方法,而不是修改所有相關(guān)的代碼。

i.子類(lèi)應該特性化,完成特殊功能

如果一個(gè)子類(lèi)只是使一個(gè)組件變成組件管理器,而不是實(shí)現接口功能,或者,重載某個(gè)功能,那么,就應該使用一個(gè)外部的容器類(lèi),而不是創(chuàng )建一個(gè)子類(lèi)

j.拆分過(guò)大的類(lèi)

如果一個(gè)類(lèi)有太多的方法(超過(guò)50個(gè)),那么它可能要做的工作太多,我們應該試著(zhù)將它的功能拆分到不同的類(lèi)中。

k.作用截然不同的對象應該拆分

對同樣的數據,有不同的視圖。某些屬性描述的是數據結構怎樣生成,而某些屬性描述的是數據結構本身。最好將這兩個(gè)視圖拆分到不同的類(lèi)中,從類(lèi)名上就可以區分出不同視圖的作用。類(lèi)的域、方法也應該有同樣的考慮!

為了提高代碼的復用性,還有好多的手段,以上都是多年的編碼經(jīng)驗,希望能幫助大家。

(2)算法的復用

各種算法如排序算法都已經(jīng)得到了大量的研究,幾乎不需要我們重寫(xiě)自己的算法,各種語(yǔ)言通常也實(shí)現了這些常用算法,因此直接復用即可。

(3)數據結構的復用

與算法一樣,類(lèi)似數組、隊列、棧、列表等得到了透徹的研究,只需要直接復用。

(4)測試信息的復用

測試信息的復用主要包括測試用例的復用和測試過(guò)程的復用。前者是把一個(gè)軟件的測試用例應用于新的軟件測試中,或者在軟件作出修改時(shí)使用在新一輪的測試中。后者是在測試過(guò)程中通過(guò)軟件工具自動(dòng)記錄測試的過(guò)程信息,包括測試員的每一個(gè)操作、輸人參數、測試用例及運行環(huán)境等信息,并將這些過(guò)程信息應用于新的軟件測試或新一輪的軟件測試中。測試信息的復用級別不易同分析、設計、編程的復用級別進(jìn)行準確地比較,因為被復用的不是同一事物的不同抽象層次,而是另一種信息,但從這些信息的形態(tài)來(lái)看,大體處于與程序代碼相當的級別。

a.測試用例設計方法

測試用例設計可以分為白盒測試用例設計法和黑盒測試用i設計法。

白盒測試用設計法


1.webp.jpg


黑盒測試用例設計法


2.webp.jpg


(5)設計復用

設計復用指的是使用對以前創(chuàng )建的設計用例、標準文檔、領(lǐng)域模型、過(guò)程指導和其它,來(lái)幫助你開(kāi)始一個(gè)新工程。設計復用分為幾個(gè)層次,從完整的拿來(lái)即用這種100%的完全復用,到僅以工件作模型之用,研究分析之以獲取靈感。舉例來(lái)說(shuō),編碼和用戶(hù)界面設計的標準文檔對不同的項目來(lái)說(shuō),就是有價(jià)值的設計,像其中的建模符號定義和方法論總覽這種文檔,是可以直接復用的。我曾經(jīng)為已有的通用數據接口以面向對象的方式做了包裝,讓這些類(lèi)使用起來(lái)更直觀(guān)。

設計復用提升了項目間的一致性,減少了各個(gè)項目的管理成本。用戶(hù)界面標準對絕大多數平臺來(lái)說(shuō)都是很常用的;編碼標準對主要語(yǔ)言來(lái)說(shuō)都是不可或缺的;而標準面向對象方法論和模型記號這樣的東西已經(jīng)使用好多年了。主要的壞處在于很多核心程序員總覺(jué)得這種復用過(guò)了頭,給彼此帶來(lái)了強加的標準和過(guò)程約束。因此設計復用的底線(xiàn)就是當你覺(jué)得它是一種重要、可行和醒目的技術(shù)時(shí),再去使用它。這種復用有如下三種途徑。

從現有系統的設計結果中提取一些可復用的設計組件,并將這些組件應用于新系統的設計中。

將一個(gè)現有系統的全部設計文檔在新的系統上重新實(shí)現,也就是將一個(gè)設計運用于多個(gè)具體的實(shí)現中。

和任何應用無(wú)關(guān),獨立設計開(kāi)發(fā)可復用的設計組件。

(6)分析復用

分析復用是比設計復用更高級別的復用,可復用的分析組件是針對業(yè)務(wù)領(lǐng)域中某些設計或問(wèn)題抽象出的組件,受設計技術(shù)及實(shí)現條件的影響很少,所以可復用的機會(huì )更大,如領(lǐng)域模型已經(jīng)顯出巨大的可復用潛能,因為它們反映出大規模的業(yè)務(wù)行為內聚的特征,在許多應用中都是一致的。你在領(lǐng)域開(kāi)發(fā)中創(chuàng )造的每樣東西都是可以復用的。與后期的復用相比,領(lǐng)域組件在前期業(yè)務(wù)行為和組織的架構設計中顯出更大的作用。復用的途徑也有三種。

從已有系統的分析結果中提取可復用的組件用于新系統的架構設計。

用一份完整的分析文檔作為輸入,產(chǎn)生針對不同系統和其他實(shí)現條件的多項設計。

和任何應用無(wú)關(guān),獨立設計開(kāi)發(fā)可復用的分析組件。

三、可復用和可維護性的關(guān)系

可復用和可維護性的關(guān)系如下。

1.適當地應用復用,同時(shí)提高了可維護性,就是在保持甚至提高系統的可維護性的同時(shí),實(shí)現系統復用。

2.適當提高系統的可復用性,同時(shí)提高了系統的可擴展性。系統的可擴展性由“開(kāi)-閉”原則、里氏代換原則、依賴(lài)倒轉原則和組合/聚合復用原則保證。

3.適當提高系統的可復用性,同時(shí)提高了系統的靈活性。系統的靈活性由“開(kāi)-閉”原則、迪米特法則、接口隔離原則保證。

4.適當提高系統的可復用性,同時(shí)提高了系統的可插入性。系統的可插入性由“開(kāi)-閉”原則、里氏代換原則、組合/聚合復用原則和依賴(lài)倒轉原則保證。

復用的成功之路

那么我們如何做到正真的面向對象設計的復用呢?上面所講的內容都是工具,如果你認真的看完了,你已經(jīng)擁有了復用的工具,復用是否成功就要看我們如何利用工具幫助我們在系統的生命周期中來(lái)實(shí)現。不要為了復用而設計系統,那么你會(huì )很累。給你提幾個(gè)意見(jiàn):

a.多次驗證并被應用

你可以嘗試可復用的設計,但是直到你的設計被復用多次,你才可以談成功的設計??蓮陀眯允桥杂^(guān)者來(lái)下結論的,而不是設計者自己。

b.可復用性必須有完備的文檔

文檔必須標識出,什么時(shí)候不要復用它,這樣開(kāi)發(fā)者才能理解合適場(chǎng)景的上下文。

c.復用是一種態(tài)度

當你設計新的系統架構的時(shí)候,第一件事應該是決定你的架構還會(huì )以怎樣的方式在別的場(chǎng)合被復用。也許有些人已經(jīng)設計了你需要的東西。另一方面,你得主動(dòng)分享你的工作成果,這樣大家才可以復用它。一個(gè)好領(lǐng)隊會(huì )在團隊中持續地尋找復用點(diǎn)和提升、獎勵復用的機會(huì )。一個(gè)不錯的方式就是在從這樣兩個(gè)方面去尋找可復用的機會(huì ):模型評審過(guò)程中,尋找繼承和模式復用的機會(huì );代碼走讀過(guò)程中,尋找組件和代碼復用的機會(huì )。



提交成功!非常感謝您的反饋,我們會(huì )繼續努力做到更好!

這條文檔是否有幫助解決問(wèn)題?

非常抱歉未能幫助到您。為了給您提供更好的服務(wù),我們很需要您進(jìn)一步的反饋信息:

在文檔使用中是否遇到以下問(wèn)題: