自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

我們一起聊聊如何判斷架構(gòu)設(shè)計(jì)的優(yōu)劣?

開發(fā) 架構(gòu)
通過該耦合度測量公式,我們鼓勵依賴外部成熟模塊。理論上,完全成熟的模塊可能僅限于語言內(nèi)置的數(shù)據(jù)類型(如int、string等)。其他模塊則多多少少會受到一些變化的影響,因此我們應(yīng)盡量減少外部依賴。

架構(gòu)設(shè)計(jì)的基本準(zhǔn)則是非常重要的,它們指導(dǎo)著我們?nèi)绾螛?gòu)建可靠、可維護(hù)、可測試的系統(tǒng)。下面是這些準(zhǔn)則的轉(zhuǎn)換表達(dá)方式:

簡單即美(KISS):KISS原則的核心思想是保持簡單。在設(shè)計(jì)系統(tǒng)之前,首先要正確理解系統(tǒng)需求,然后才進(jìn)行設(shè)計(jì)。要避免過度設(shè)計(jì),除非有人能承擔(dān)復(fù)雜性的成本。這里的“簡單”強(qiáng)調(diào)易實(shí)施性和易理解性。接口應(yīng)該自然地表達(dá)語義,讓人一看方法名就能理解其功能。

模塊化(Modularity):模塊化強(qiáng)調(diào)的是將系統(tǒng)分解成互相獨(dú)立的模塊。從架構(gòu)設(shè)計(jì)的角度來看,模塊的接口比實(shí)現(xiàn)更為重要。我們應(yīng)該專注于模塊而不是框架,因?yàn)榭蚣苁且鬃兊模K是更加穩(wěn)定和可復(fù)用的。設(shè)計(jì)模塊時,應(yīng)忽略框架的存在,專注于模塊的接口設(shè)計(jì),并確保接口足夠通用。

可測試性(Testable):設(shè)計(jì)應(yīng)該以可測試性為第一目標(biāo)??蓽y試性通常意味著低耦合,因?yàn)榈婉詈系哪K更容易進(jìn)行單元測試。模塊測試的第一步是創(chuàng)建環(huán)境模擬,即模擬模塊所依賴的其他模塊。測試能夠幫助我們發(fā)現(xiàn)架構(gòu)調(diào)整的潛在問題,并且在代碼重構(gòu)時尤其重要。

正交分解(Orthogonal Decomposition):正交分解是指對系統(tǒng)進(jìn)行獨(dú)立且相互無關(guān)的分解過程。這個原則強(qiáng)調(diào)的是乘法而不是加法,即組合而不是繼承。通過組合相互獨(dú)立、沒有相關(guān)性的模塊,可以構(gòu)建出我們所需的業(yè)務(wù)場景,而不是通過繼承疊加能力來改造模塊。

核心系統(tǒng)的傷害值

正交分解首先涉及確定核心系統(tǒng)和周邊子系統(tǒng)。核心系統(tǒng)是業(yè)務(wù)的最小功能集,而周邊子系統(tǒng)則通過逐步增加新功能來擴(kuò)展系統(tǒng)的功能。對核心系統(tǒng)的變更必須謹(jǐn)慎對待。如果某個新功能在早期未被規(guī)劃,后來又被確定為核心功能,我們必須認(rèn)真評估其對現(xiàn)有架構(gòu)的影響。周邊功能方面,我們關(guān)注的是如何降低添加新功能對核心系統(tǒng)的影響。無論情況如何,系統(tǒng)都會因功能增加而變得復(fù)雜。為了減少新功能的負(fù)面影響,相關(guān)代碼應(yīng)盡可能地內(nèi)聚,即使不寫入獨(dú)立的模塊中,也要放在獨(dú)立的文件中。這些代碼被視為周邊系統(tǒng)的功能實(shí)現(xiàn)代碼,而不是核心系統(tǒng)的一部分。我們關(guān)注的是周邊功能對核心系統(tǒng)的影響。為了添加某個功能,核心系統(tǒng)需要添加相關(guān)代碼。根據(jù)經(jīng)驗(yàn),核心系統(tǒng)為新功能添加的代碼量越少,該功能與核心系統(tǒng)的耦合度就越低。是否可能添加功能而不修改核心系統(tǒng)的代碼?這是可能的,但需要核心系統(tǒng)提供插件機(jī)制。

我們將在后續(xù)討論這個話題,現(xiàn)在暫且擱置。讓我們把話題轉(zhuǎn)回到架構(gòu)設(shè)計(jì)質(zhì)量的評估上。雖然我們已經(jīng)討論了一些架構(gòu)設(shè)計(jì)的基本準(zhǔn)則,但尚未涉及質(zhì)量評估的方法。質(zhì)量評估可以是定性的或定量的。定性評估方法有一定的數(shù)據(jù)支持,但可能有些主觀。例如,“從某個角度來看,我感覺這個更好”。定量評估方法更理想,但目前我個人尚未聽說過任何用于確定架構(gòu)設(shè)計(jì)優(yōu)劣的定量評估方法。今天我會介紹一些我個人想出的判斷公式。這些公式都是經(jīng)驗(yàn)性的,并沒有經(jīng)過嚴(yán)格的數(shù)學(xué)證明。假設(shè)一個架構(gòu)設(shè)計(jì)方案將系統(tǒng)分成了n個模塊,表示為:[M1, M2, ..., Mn]。其中M1是核心系統(tǒng),其他模塊是周邊子系統(tǒng)。為簡化起見,假設(shè)周邊子系統(tǒng)之間是正交的,相互沒有耦合。

模塊的耦合度測量

我們第二個關(guān)注的問題是每個模塊自身的質(zhì)量,包括模塊接口的質(zhì)量和模塊實(shí)現(xiàn)的質(zhì)量。首先,我們來看模塊接口的質(zhì)量,這是模塊級別最重要的部分。模塊接口的質(zhì)量取決于以下兩個方面:

接口與業(yè)務(wù)的匹配性:接口應(yīng)盡可能自然地反映業(yè)務(wù)需求。然而,從機(jī)器判斷的角度來看,這一點(diǎn)是無法計(jì)算的,完全取決于個人主觀判斷。我們將在下一講“少談框架,多談業(yè)務(wù)”中繼續(xù)探討這個話題。

接口的外部依賴:即模塊接口對外部環(huán)境的耦合程度。下面我們將介紹模塊的“耦合度測量公式”,它同時適用于模塊實(shí)現(xiàn)和模塊接口的耦合度測量。

假設(shè)我們的模塊實(shí)現(xiàn)(或模塊接口)依賴了模塊A,那么我們的模塊實(shí)現(xiàn)(或模塊里的“符號”是指被引用的類型,包括typedef(類型別名)、class或struct,以及被引用的全局變量、全局函數(shù)或成員函數(shù)。

接下來,我們看模塊實(shí)現(xiàn)(或模塊接口)的所有外部依賴,即該模塊的總耦合度公式為其中,耦合度A表示該模塊與依賴模塊A的耦合程度,如前文所述。而不成熟度系數(shù)A則表示依賴模塊A的不成熟度程度。若依賴模塊A完全成熟,不再發(fā)生變化,則為0;若發(fā)生非常劇烈的變動,規(guī)格甚至無法確定,則為1。

通過該耦合度測量公式,我們鼓勵依賴外部成熟模塊。理論上,完全成熟的模塊可能僅限于語言內(nèi)置的數(shù)據(jù)類型(如int、string等)。其他模塊則多多少少會受到一些變化的影響,因此我們應(yīng)盡量減少外部依賴。

需要注意的是,將模塊接口引用的類型A改為object或interface{}類型并不能降低耦合度。換句話說,如果某參數(shù)為interface,那么這個interface的耦合度取決于實(shí)際使用時存在的各種可能類型,都會計(jì)算在依賴中。

關(guān)于耦合度測量公式,需要強(qiáng)調(diào)的是,它是一種經(jīng)驗(yàn)公式,僅代表某種價(jià)值主張。在實(shí)際應(yīng)用中,計(jì)算得到的具體耦合度值并沒有物理意義,只能用于比較兩個相同功能的系統(tǒng)(或模塊)的架構(gòu)設(shè)計(jì)方案。對于兩個功能完全不同的系統(tǒng)(或模塊)A、B,其計(jì)算結(jié)果不能用于評判彼此的好壞。

首先,我們討論了架構(gòu)設(shè)計(jì)的基本準(zhǔn)則,它們?yōu)槲覀兲峁┝艘粋€方向。雖然這些準(zhǔn)則不能明確指出何為好與不好,但它們指明了我們設(shè)計(jì)架構(gòu)的方向。接著,我們開始對架構(gòu)的優(yōu)劣進(jìn)行定性甚至定量的分析。考慮到核心系統(tǒng)的重要性,我們引入了一個傷害值來評估其純潔度。

最后,我們針對模塊自身的接口或?qū)崿F(xiàn),給出了耦合度測量公式。通過這些公式,我們明確了我們的架構(gòu)設(shè)計(jì)的價(jià)值主張。然而,需要意識到的是,這些并不是全部。判斷模塊間的耦合度是復(fù)雜的。我們的公式在某種程度上只考慮了靜態(tài)依賴關(guān)系,而沒有考慮動態(tài)依賴。舉例來說,考慮兩個網(wǎng)絡(luò)模塊A和B,一個顯而易見的耦合度判斷是:A調(diào)用B的網(wǎng)絡(luò)接口數(shù)量越多,說明它們之間的依賴越大;而A調(diào)用B的網(wǎng)絡(luò)接口的次數(shù)越多,也意味著它們之間的依賴越大。

責(zé)任編輯:武曉燕 來源: 二進(jìn)制跳動
相關(guān)推薦

2024-07-12 08:28:09

聊天系統(tǒng)架構(gòu)

2023-11-27 07:57:46

2024-03-29 11:35:02

結(jié)構(gòu)if語言

2022-01-04 12:08:46

設(shè)計(jì)接口

2024-10-15 08:08:13

2024-02-26 00:00:00

架構(gòu)老化重構(gòu)

2023-11-30 07:40:05

URLCMS

2024-10-29 11:19:23

點(diǎn)贊系統(tǒng)同步

2024-06-17 11:59:39

2024-06-12 09:52:00

2023-04-26 07:30:00

promptUI非結(jié)構(gòu)化

2021-08-27 07:06:10

IOJava抽象

2024-02-20 21:34:16

循環(huán)GolangGo

2024-09-30 09:33:31

2024-11-27 16:07:45

2022-10-08 00:00:05

SQL機(jī)制結(jié)構(gòu)

2023-04-03 00:09:13

2024-09-09 00:00:00

編寫技術(shù)文檔

2023-08-04 08:20:56

DockerfileDocker工具

2022-05-24 08:21:16

數(shù)據(jù)安全API
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號